49 lines
1.7 KiB
C#
49 lines
1.7 KiB
C#
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<Transform> Get() => detected;
|
|
public override UniTask Execute()
|
|
{
|
|
var cacheList = ListPool<Transform>.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<Transform>.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<IAudioObject>(out currentAudioObject))
|
|
{
|
|
return currentAudioObject.GetVolume() >= 1;
|
|
}
|
|
return false;
|
|
}
|
|
public override float GetDistance() => radius;
|
|
}
|
|
} |