using System; using System.Collections; using System.Collections.Generic; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.Pool; using System.Linq; namespace BITKit.Sensors { public interface IAudioObject { float GetVolume(); } public class AudioSensor : MonoBehaviour,ISensor { [Header(Constant.Header.Settings)] [SerializeField] private bool autoUpdate; [SerializeField]private float radius; private readonly CacheList cache = new(); private readonly CacheList data = new(); public AudioSensorService.AudioSensorData[] Noises => data.ValueArray; private void OnEnable() { Id = GetInstanceID(); SensorQueue.Register(Id,this); } private void OnDisable() { SensorQueue.UnRegister(Id); } public UniTask Execute(float delta) { var position = transform.position; cache.Clear(); data.Clear(); foreach (var x in AudioSensorService.QuadtreeRoot.Find(new Bounds(position, Vector3.one * radius))) { var distance = Vector3.Distance(position, x.Position); if (distance > radius) continue; if (x.Transform) cache.Add(x.Transform); data.Add(x); } return UniTask.CompletedTask; } public HashSet Ignores { get; } = new(); public int Id { get; set; } public IEnumerable Get() => cache.ValueArray; public bool IsValid(Collider _collider) => false; public float GetDistance() => radius; public bool AutoUpdate=>autoUpdate; } }