This commit is contained in:
CortexCore
2023-10-06 23:43:19 +08:00
parent ebf9c1f526
commit 2c4710bc5d
186 changed files with 111802 additions and 764 deletions

View File

@@ -0,0 +1,18 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace BITKit.Sensors
{
public class MixSensor : Sensor
{
[SerializeReference, SubclassSelector] private ISensor[] sensors;
public override IEnumerable<Transform> Get()=>sensors.SelectMany(x => x.Get());
public override bool IsValid(Collider _collider) => sensors.Any(x => x.IsValid(_collider) is false) is false;
public override float GetDistance() => sensors.Min(x => x.GetDistance());
public override UniTask Execute() => UniTask.WhenAll(sensors.Select(x => x.Execute()));
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8b7c7e7c8cf1efe4aac0c8eddbd05e1c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -19,6 +19,7 @@ namespace BITKit.Sensors
[SerializeField] private Optional<LayerMask> detectedLayer;
[SerializeField] private bool allowStatic;
[SerializeField] private bool useRigidbody;
[SerializeField] private bool immediately = false;
[Header(Constant.Header.Events)] public UnityEvent<Collider> onDetected = new();
public UnityEvent<Collider> onLost = new();
@@ -29,14 +30,17 @@ namespace BITKit.Sensors
private readonly Queue<Collider> triggerEnterQueue=new();
private readonly Queue<Collider> triggerExitQueue=new();
private bool diagnosisNextFrame;
private void OnTriggerEnter(Collider _collider)
{
triggerEnterQueue.Enqueue(_collider);
if(immediately)Rebuild();
}
private void OnTriggerExit(Collider _collider)
{
triggerExitQueue.Enqueue(_collider);
if(immediately)Rebuild();
}
private void OnCollisionEnter(Collision collision)
@@ -83,11 +87,19 @@ namespace BITKit.Sensors
}
private void Update()
{
if (immediately is false)
{
Rebuild();
}
}
private void Rebuild()
{
while (triggerEnterQueue.TryDequeue(out var _collider))
{
if (IsValid(_collider) is false) return;
if (triggerExitQueue.Contains(_collider) || detected.Contains(_collider))continue;
if (detected.Contains(_collider))continue;
detected.Add(_collider);
}
while (triggerExitQueue.TryDequeue(out var _collider))
@@ -95,6 +107,14 @@ namespace BITKit.Sensors
if (IsValid(_collider) is false) return;
detected.Remove(_collider);
}
diagnosisNextFrame = detected.Any(x =>x is not null &&x.enabled is false);
if (diagnosisNextFrame)
{
detected = detected.Where(x => x.enabled).ToList();
diagnosisNextFrame = false;
}
}
}
#if UNITY_EDITOR