using System.Collections; using UnityEngine; namespace Prototype { [AddComponentMenu("/")] public class SoundEffectInstance : MonoBehaviour { public AudioClip clip { get; set; } public SoundEffectOptions options { get; set; } AudioSource audioSource; void Awake() { audioSource = gameObject.AddComponent(); { audioSource.playOnAwake = false; audioSource.dopplerLevel = 0; audioSource.outputAudioMixerGroup = options.audioMixerGroup; audioSource.clip = clip; audioSource.volume = options.GetVolume(); audioSource.pitch = options.GetPitch(); audioSource.spatialBlend = options.Get3D() ? 1 : 0; audioSource.spatialize = options.GetSpatialize() && audioSource.spatialBlend > 0; audioSource.loop = options.GetLoop(); } if (audioSource.spatialize && options.GetOcclusion()) { var steamAudioSource = gameObject.AddComponent(); steamAudioSource.distanceAttenuation = true; steamAudioSource.distanceAttenuationInput = SteamAudio.DistanceAttenuationInput.PhysicsBased; steamAudioSource.occlusion = true; steamAudioSource.occlusionType = SteamAudio.OcclusionType.Raycast; steamAudioSource.transmission = true; steamAudioSource.transmissionType = SteamAudio.TransmissionType.FrequencyDependent; } if (!options.ShouldDestroyOnLoad()) { DontDestroyOnLoad(this); } } IEnumerator Start() { var delay = options.GetDelay(); if (delay > 0) { yield return new WaitForSeconds(delay); } audioSource.Play(); if (audioSource.loop) { yield break; } yield return new WaitForSecondsRealtime(audioSource.clip.length + .1f); Destroy(gameObject); } public void Stop() { Destroy(gameObject); } } }