Files
zeling_v2/Assets/_Game/Scripts/Enemies/AI/BD_MoveToAndWait.cs
Joywayer a1b4e629aa feat: Implement Room Streaming System
- Add RoomStreamingManager to manage room loading and unloading based on player proximity.
- Create StreamingBudgetConfigSO for memory and performance budgeting of the streaming system.
- Introduce TransitionDirector to handle seamless and atmospheric fade transitions between rooms.
- Develop WorldGraph to represent room connectivity and facilitate neighbor queries and distance calculations.
- Implement RoomNode and RoomEdge classes to structure room data and connections.
2026-05-23 19:10:29 +08:00

59 lines
2.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#if GRAPH_DESIGNER
using UnityEngine;
using Opsive.BehaviorDesigner.Runtime.Tasks;
using Opsive.BehaviorDesigner.Runtime.Tasks.Actions;
using BaseGames.Enemies;
namespace BaseGames.Enemies.AI
{
/// <summary>
/// 动作:移动到目标并等待 OnGoalReached 事件(事件驱动,替代轮询版 BD_MoveTo
/// OnGoalReached 触发后返回 Success路径失败返回 Failure。
/// </summary>
[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<EnemyBase>();
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