#if GRAPH_DESIGNER using UnityEngine; using Opsive.BehaviorDesigner.Runtime.Tasks; using Opsive.BehaviorDesigner.Runtime.Tasks.Actions; using BaseGames.Enemies; namespace BaseGames.Enemies.AI { /// /// 动作:移动到目标并等待 OnGoalReached 事件(事件驱动,替代轮询版 BD_MoveTo)。 /// OnGoalReached 触发后返回 Success;路径失败返回 Failure。 /// [TaskName("Move To And Wait")] [TaskCategory("BaseGames/Enemy/Movement")] [TaskDescription("导航到目标点,到达后原地等待指定时长,然后返回 Success")] public sealed class BD_MoveToAndWait : Action { [SerializeField] private Transform m_Target; private EnemyBase _enemy; private bool _reached; private bool _failed; public override void OnAwake() => _enemy = gameObject.GetComponent(); public override void OnStart() { _reached = _failed = false; if (_enemy?.Nav == null) { _failed = true; return; } _enemy.Nav.OnGoalReached += HandleReached; _enemy.Nav.OnNavPathFailed += HandleFailed; var pos = m_Target != null ? (Vector2)m_Target.position : _enemy.PlayerTransform != null ? (Vector2)_enemy.PlayerTransform.position : (Vector2)transform.position; _enemy.Nav.RequestMoveTo(pos); } public override TaskStatus OnUpdate() { if (_failed) return TaskStatus.Failure; if (_reached) return TaskStatus.Success; return TaskStatus.Running; } public override void OnEnd() { if (_enemy?.Nav != null) { _enemy.Nav.OnGoalReached -= HandleReached; _enemy.Nav.OnNavPathFailed -= HandleFailed; } } private void HandleReached() => _reached = true; private void HandleFailed() => _failed = true; } } #endif