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 readonly HashSet _addedSet = new(); private void OnEnable() { Id = GetInstanceID(); SensorQueue.Register(Id,this); } private void OnDisable() { SensorQueue.UnRegister(Id); } public async UniTask Execute(float delta) { var position = transform.position; cache.Clear(); data.Clear(); _addedSet.Clear(); await UniTask.SwitchToTaskPool(); var value = AudioSensorService.QuadtreeRoot.Find(new Bounds(position, Vector3.one * radius)).ToArray(); for (var index = 0; index < value.Length; index++) { var x = value[index]; var distance = Vector3.Distance(position, x.Position); if (distance > radius) continue; if (Ignores.Contains(x.Id)) continue; _addedSet.Add(index); // if (x.Transform) // cache.Add(x.Transform); // data.Add(x); } await UniTask.SwitchToMainThread(); if (destroyCancellationToken.IsCancellationRequested) return; foreach (var x in _addedSet) { if (value[x].Transform) cache.Add(value[x].Transform); data.Add(value[x]); } } 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; } }