BITFALL/Assets/BITKit/Unity/Scripts/Sensor/RaySensor.cs

53 lines
1.7 KiB
C#

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<Transform> 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();
}
}
}
}