using System.Collections; using System.Collections.Generic; using UnityEngine; public class AmbientSoundGenerator : MonoBehaviour { public GameObject AmbientSfxPrefab; public float MinDistance; public float MaxDistance; public AudioClip[] Clips; [Header("Cooldown configuration")] public float MinCooldown; public float MaxCooldown; public int TooManySoundsCount; [Tooltip("")] public float TrackingDuration; [Header("Runtime values")] public float AmbientNoiseCooldown = 0f; private Transform World; private List SoundTimes = new List(); private void Awake() { World = GameObject.FindGameObjectWithTag("World").transform; } private void Update() { AmbientNoiseCooldown -= Time.deltaTime; if (AmbientNoiseCooldown <= 0) { AmbientNoiseCooldown += Random.Range(MinCooldown, MaxCooldown) + TrackingDuration * Mathf.Pow(SoundTimes.Count / TooManySoundsCount, 2); int RemoveUntil = -1; for (int I = 0; I < SoundTimes.Count; I++) { if (Time.time - SoundTimes[I] > TrackingDuration) { RemoveUntil = I; } else { break; } } SoundTimes.RemoveRange(0, RemoveUntil + 1); SoundTimes.Add(Time.time); float Distance = Random.Range(MinDistance, MaxDistance); float Rads = Random.Range(0, 2 * Mathf.PI); Vector3 Offset = new Vector3(Mathf.Cos(Rads) * Distance, Random.Range(0f, 5f), Mathf.Sin(Rads) * Distance); GameObject Obj = Instantiate(AmbientSfxPrefab, transform.position + Offset, new Quaternion(), World); AudioSource Sfx = Obj.GetComponent(); if (Sfx != null) { Sfx.clip = Clips[Random.Range(0, Clips.Length)]; Sfx.volume = Mathf.Sqrt(Random.Range(0.3f, 1f)); Sfx.Play(); } } } }