5 using System.Collections.Generic;
17 [DisallowMultipleComponent]
18 [RequireComponent(typeof(AudioSource))]
28 public static readonly
float NeutralLowFrequency = 10.0f;
37 public static readonly
float NeutralHighFrequency = 22000.0f;
47 [Tooltip(
"Time, in seconds, between audio influence updates. 0 indicates to update every frame.")]
50 private float updateInterval = 0.25f;
51 public float UpdateInterval
53 get {
return updateInterval; }
59 updateInterval = 0.0f;
61 else if (value > 1.0f)
63 updateInterval = 1.0f;
67 updateInterval = value;
79 [Tooltip(
"Maximum distance, in meters, to look when attempting to find the user and any influencers.")]
82 private float maxDistance = 20.0f;
83 public float MaxDistance
85 get {
return maxDistance; }
93 else if (value > 50.0f)
113 [Tooltip(
"Maximum number of objects that will be considered when looking for influencers.")]
116 private int MaxObjects = 10;
121 private DateTime lastUpdate = DateTime.MinValue;
126 private AudioSource audioSource;
131 private float initialAudioSourceVolume;
136 private RaycastHit[] hits;
141 private List<IAudioInfluencer> previousInfluencers =
new List<IAudioInfluencer>();
147 private AudioLowPassFilter lowPassFilter;
148 private float nativeLowPassCutoffFrequency;
149 private AudioHighPassFilter highPassFilter;
150 private float nativeHighPassCutoffFrequency;
154 audioSource = gameObject.GetComponent<AudioSource>();
155 initialAudioSourceVolume = audioSource.volume;
159 lowPassFilter = gameObject.GetComponent<AudioLowPassFilter>();
160 nativeLowPassCutoffFrequency = (lowPassFilter != null) ? lowPassFilter.cutoffFrequency : NeutralHighFrequency;
161 highPassFilter = gameObject.GetComponent<AudioHighPassFilter>();
162 nativeHighPassCutoffFrequency = (highPassFilter != null) ? highPassFilter.cutoffFrequency : NeutralLowFrequency;
165 hits =
new RaycastHit[MaxObjects];
168 private void Update()
170 DateTime now = DateTime.Now;
173 if ((UpdateInterval * 1000.0f) <= (now - lastUpdate).Milliseconds)
175 audioSource.volume = initialAudioSourceVolume;
178 List<IAudioInfluencer> influencers = GetInfluencers();
186 List<IAudioInfluencer> influencersToRemove =
new List<IAudioInfluencer>();
189 MonoBehaviour mbPrev = prev as MonoBehaviour;
194 if (!influencers.Contains(prev) ||
195 ((mbPrev != null) && !mbPrev.isActiveAndEnabled))
197 influencersToRemove.Add(prev);
200 RemoveInfluencers(influencersToRemove);
202 previousInfluencers = influencers;
211 private void RemoveInfluencers(List<IAudioInfluencer> influencers)
223 private List<IAudioInfluencer> GetInfluencers()
225 List<IAudioInfluencer> influencers =
new List<IAudioInfluencer>();
230 Vector3 direction = (gameObject.transform.position - cameraTransform.position).normalized;
231 float distance = Vector3.Distance(cameraTransform.position, gameObject.transform.position);
233 int count = Physics.RaycastNonAlloc(cameraTransform.position,
237 Physics.DefaultRaycastLayers,
238 QueryTriggerInteraction.Ignore);
240 for (
int i = 0; i < count; i++)
243 if (influencer != null)
245 influencers.Add(influencer);
260 return nativeLowPassCutoffFrequency;
271 nativeLowPassCutoffFrequency = frequency;
282 return nativeHighPassCutoffFrequency;
293 nativeHighPassCutoffFrequency = frequency;