1
This commit is contained in:
@@ -7,6 +7,11 @@ using BITKit;
|
||||
using Cysharp.Threading.Tasks;
|
||||
namespace BITKit.Sensors
|
||||
{
|
||||
public static class SensorGlobalSettings
|
||||
{
|
||||
public static bool Enabled = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 传感器的接口定义
|
||||
/// </summary>
|
||||
|
29
Src/Unity/Scripts/Sensor/Editor/SensorEditorWIndow.cs
Normal file
29
Src/Unity/Scripts/Sensor/Editor/SensorEditorWIndow.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
11
Src/Unity/Scripts/Sensor/Editor/SensorEditorWIndow.cs.meta
Normal file
11
Src/Unity/Scripts/Sensor/Editor/SensorEditorWIndow.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b0ad25384d3d5d74a95d99ceed99ec8d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -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()
|
||||
|
Reference in New Issue
Block a user