1
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Cysharp.Threading.Tasks;
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
using UnityEditor.UIElements;
|
||||
#endif
|
||||
using UnityEngine;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
namespace BITKit.Sensors
|
||||
{
|
||||
/// <summary>
|
||||
/// 智能目标传感器,根据条件,智能选择目标
|
||||
/// </summary>
|
||||
public class SmartTargetSensor :MonoBehaviour,ISensor,IAction
|
||||
{
|
||||
/// <summary>
|
||||
/// 自动更新
|
||||
/// </summary>
|
||||
[Header(Constant.Header.Settings)]
|
||||
[SerializeField] private bool autoUpdate;
|
||||
|
||||
/// <summary>
|
||||
/// 目标有效性验证
|
||||
/// </summary>
|
||||
[Header(Constant.Header.Providers)]
|
||||
[SerializeField,SerializeReference,SubclassSelector] private IValidityProvider validityProvider;
|
||||
|
||||
/// <summary>
|
||||
/// 主传感器
|
||||
/// </summary>
|
||||
[Header(nameof(Sensor))]
|
||||
[SerializeField,SerializeReference,SubclassSelector] private ISensor sensor;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
[Header(Constant.Header.Debug)]
|
||||
[SerializeField] private Transform sensorTransform;
|
||||
#endif
|
||||
|
||||
public IEnumerable<Transform> Get() =>CurrentTarget is not null ? new[] { CurrentTarget }:Enumerable.Empty<Transform>();
|
||||
public bool IsValid(Collider _collider) =>validityProvider?.IsValid(_collider) ?? true;
|
||||
public float GetDistance() => sensor.GetDistance();
|
||||
public Transform CurrentTarget { get; private set; }
|
||||
private readonly List<Transform> detected = new();
|
||||
|
||||
public async UniTask Execute()
|
||||
{
|
||||
await sensor.Execute();
|
||||
var _detected = sensor.Get().ToList();
|
||||
if (_detected.Contains(CurrentTarget))
|
||||
{
|
||||
if (detected.Count is 1 && detected[0] == CurrentTarget)
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
detected.Clear();
|
||||
detected.Add(CurrentTarget);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
CurrentTarget = _detected
|
||||
.Where(_transform => IsValid(_transform.GetComponent<Collider>()))
|
||||
.OrderBy(_transform => Vector3.Distance(transform.position, _transform.position))
|
||||
.FirstOrDefault();
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if(autoUpdate)Execute().Forget();
|
||||
}
|
||||
|
||||
void IAction.Execute()
|
||||
{
|
||||
Execute().Forget();
|
||||
}
|
||||
#if UNITY_EDITOR
|
||||
private void OnDrawGizmosSelected()
|
||||
{
|
||||
if (CurrentTarget is null) return;
|
||||
Gizmos.DrawLine(sensorTransform.position,CurrentTarget.position);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#if UNITY_EDITOR
|
||||
[CustomEditor(typeof(SmartTargetSensor))]
|
||||
public class SmartTargetSensorInspector:BITInspector<SmartTargetSensor>
|
||||
{
|
||||
private ObjectField _objectField;
|
||||
public override VisualElement CreateInspectorGUI()
|
||||
{
|
||||
FillDefaultInspector();
|
||||
|
||||
CreateSubTitle("Editor Debug Field");
|
||||
|
||||
_objectField = root.Create<ObjectField>();
|
||||
|
||||
_objectField.objectType = typeof(Transform);
|
||||
|
||||
_objectField.SetEnabled(false);
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
protected override void OnUpdate()
|
||||
{
|
||||
if (_objectField is not null)
|
||||
{
|
||||
_objectField.value = agent.CurrentTarget;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 33d6f52a9de8ea149ab70ac4e67a0c36
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Reference in New Issue
Block a user