This commit is contained in:
CortexCore
2023-11-15 23:55:06 +08:00
parent 5446067f91
commit 70247f0242
82 changed files with 3271 additions and 579 deletions

View File

@@ -7,6 +7,11 @@ using BITKit;
using Cysharp.Threading.Tasks;
namespace BITKit.Sensors
{
public static class SensorGlobalSettings
{
public static bool Enabled = true;
}
/// <summary>
/// 传感器的接口定义
/// </summary>

View File

@@ -0,0 +1,29 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
namespace BITKit.Sensors
{
public class SensorEditorWindow : EditorWindow
{
private Toggle _toggle;
[MenuItem("Tools/Sensor/EditorWindow")]
public static void ShowWindow()
{
GetWindow<SensorEditorWindow>("SensorEditorWindow");
}
private void CreateGUI()
{
_toggle = rootVisualElement.Create<Toggle>("Enable Sensor");
_toggle.label = "Enable Sensor";
_toggle.value = SensorGlobalSettings.Enabled;
}
private void Update()
{
SensorGlobalSettings.Enabled = _toggle.value;
}
}
}

View File

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

View File

@@ -6,6 +6,8 @@ using System.Linq;
using Cysharp.Threading.Tasks;
using UnityEngine.Jobs;
using UnityEngine.Pool;
using UnityEngine.Profiling;
namespace BITKit.Sensors
{
public class RangeSensor : Sensor
@@ -21,11 +23,20 @@ namespace BITKit.Sensors
private FrameUpdate frameUpdater;
private readonly Collider[] colliders = new Collider[32];
private RaycastHit[] hits;
public override IEnumerable<Transform> Get() => detected;
public override IEnumerable<Transform> Get()
{
if (!_detectedDoubleBuffer.TryGetRelease(out var newRelease)) return _detectedBuffer;
Profiler.BeginSample("Release Detected Buffer");
_detectedBuffer = newRelease;
Profiler.EndSample();
return _detectedBuffer;
}
private readonly DoubleBuffer<IEnumerable<Transform>> _detectedDoubleBuffer=new();
private IEnumerable<Transform> _detectedBuffer;
private void Update()
{
if (autoUpdate)
if (autoUpdate && SensorGlobalSettings.Enabled)
{
Execute().Forget();
}
@@ -35,14 +46,11 @@ namespace BITKit.Sensors
if (frameUpdater.Allow is false) return UniTask.CompletedTask;
var location = new Location(transform);
var length = Physics.OverlapSphereNonAlloc(location, radius, colliders, detectLayer);
var list = new List<Transform>();
list.AddRange(from x in colliders.Take(length) where IsValid(x) select x.transform);
detected = list.ToArray();
list.Clear();
// detected = colliders
// .Take(length)
// .Select(x => x.transform)
// .ToArray();
Profiler.BeginSample("Filter Detected Colliders");
var _newDetected = from x in colliders.Take(length) where IsValid(x) select x.transform;
Profiler.EndSample();
//detected = _newDetected.ToArray();
_detectedDoubleBuffer.Release(_newDetected);
return UniTask.CompletedTask;
}
@@ -81,15 +89,24 @@ namespace BITKit.Sensors
Vector3.Distance(location, position),
blockLayer
);
if (length > 0)
switch (length)
{
if (hits[0].collider == _collider)
{
case 0:
return true;
}
case 1:
if (hits[0].collider == _collider)
{
return true;
}
break;
default:
if (hits.Take(length).Any(x => ignoreColliders.Contains(x.collider) is false))
{
return false;
}
break;
}
else return true;
return false;
return true;
}
}
}

View File

@@ -7,6 +7,7 @@ using UnityEditor;
using UnityEditor.UIElements;
#endif
using UnityEngine;
using UnityEngine.Profiling;
using UnityEngine.UIElements;
namespace BITKit.Sensors
@@ -21,13 +22,8 @@ namespace BITKit.Sensors
/// </summary>
[Header(Constant.Header.Settings)]
[SerializeField] private bool autoUpdate;
/// <summary>
/// 目标有效性验证
/// </summary>
[Header(Constant.Header.Providers)]
[SerializeField,SerializeReference,SubclassSelector] private IValidityProvider validityProvider;
[SerializeField] private Optional<string[]> ignoreTags;
[SerializeField] private Optional<IntervalUpdate> optionalRetargetInterval;
/// <summary>
/// 主传感器
/// </summary>
@@ -40,37 +36,59 @@ namespace BITKit.Sensors
#endif
public IEnumerable<Transform> Get() =>CurrentTarget is not null ? new[] { CurrentTarget }:Enumerable.Empty<Transform>();
public bool IsValid(Collider _collider) =>validityProvider?.IsValid(_collider) ?? true;
public bool IsValid(Collider _collider)
{
if (ignoreTags.Allow)
{
if (_collider.TryGetComponent<ITag>(out var iTags))
{
var tags = iTags.GetTags();
foreach (var x in ignoreTags.Value)
{
if (tags.Contains(x))
{
return false;
}
}
}
}
return true;
}
public float GetDistance() => sensor.GetDistance();
public Transform CurrentTarget { get; private set; }
private readonly List<Transform> detected = new();
private IEnumerable<Transform> detected = ArraySegment<Transform>.Empty;
public async UniTask Execute()
{
await sensor.Execute();
var _detected = sensor.Get().ToList();
if (_detected.Contains(CurrentTarget))
Profiler.BeginSample("Release Detected Buffer");
var newDetected = sensor.Get();
Profiler.EndSample();
// ReSharper disable once PossibleMultipleEnumeration
if (newDetected.Contains(CurrentTarget))
{
if (detected.Count is 1 && detected[0] == CurrentTarget)
if (optionalRetargetInterval.Allow && optionalRetargetInterval.Value.AllowUpdate)
{
}
else
{
detected.Clear();
detected.Add(CurrentTarget);
return;
}
return;
}
CurrentTarget = _detected
Profiler.BeginSample("Filter Detected");
// ReSharper disable once PossibleMultipleEnumeration
CurrentTarget = newDetected
.Where(_transform => IsValid(_transform.GetComponent<Collider>()))
.OrderBy(_transform => Vector3.Distance(transform.position, _transform.position))
.FirstOrDefault();
Profiler.EndSample();
}
private void Update()
{
if(autoUpdate)Execute().Forget();
if(autoUpdate && SensorGlobalSettings.Enabled)Execute().Forget();
}
void IAction.Execute()