using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Cysharp.Threading.Tasks; using UnityEngine; namespace BITKit.Sensors { public class RaySensor : Sensor { [Header(Constant.Header.Settings)] [SerializeField] private float radius = 0.16f; public float distance; public override IEnumerable Get() => detected; private readonly RaycastHit[] raycasts = new RaycastHit[16]; public override UniTask Execute() { var _transform = transform; var forward = _transform.forward; var position = _transform.position; var size = 0; if (radius is not 0) { size = Physics.CapsuleCastNonAlloc(position, position + forward * distance, radius, forward, raycasts , distance, detectLayer); } else { var ray = new Ray(_transform.position,_transform.forward); size = Physics.RaycastNonAlloc(ray, raycasts, distance, detectLayer); } detected = raycasts .Take(size) .Select(x => x.collider) .Where(IsValid) .Select(x=>x.transform) .ToArray(); return UniTask.CompletedTask; } public override bool IsValid(Collider _collider) => ignoreColliders.Contains(_collider) is false; public override float GetDistance() => distance; private void Update() { if (autoUpdate) { Execute().Forget(); } } } }