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 : Sensor { [Header(Constant.Header.Settings)] public float radius; [Header(Constant.Header.InternalVariables)] IAudioObject currentAudioObject; Collider currentCollider; Collider[] colliders = new Collider[32]; public override IEnumerable Get() => detected; public override UniTask Execute() { var cacheList = ListPool.Get(); for (int i = 0; i < Physics.OverlapSphereNonAlloc(transform.position, radius, colliders, detectLayer); i++) { currentCollider = colliders[i]; if (IsValid(currentCollider)) { cacheList.Add(currentCollider.transform); } } detected = cacheList.ToArray(); ListPool.Release(cacheList); return UniTask.CompletedTask; } public override bool IsValid(Collider _collider) { if (ignoreColliders.Contains(_collider) is false) if (Vector3.Distance(transform.position, _collider.transform.position) <= radius) if (_collider.TryGetComponent(out currentAudioObject)) { return currentAudioObject.GetVolume() >= 1; } return false; } public override float GetDistance() => radius; } }