using System; namespace AI { public abstract class LeafNodeBase : BehaviorTreeBase { // 已经运行的帧数 protected int _elapsedFrames; // 默认超时帧数 protected int _timeoutFrames = 180; /// /// 获取或设置该叶节点的超时帧数。确保超时帧数至少为1。 /// public int TimeoutFrames { get => _timeoutFrames; set => _timeoutFrames = Math.Max(1, value); } // 剩余帧数 public int RemainingFrames => TimeoutFrames - _elapsedFrames; /// /// 抽象方法,由具体的叶节点实现其核心业务逻辑。 /// 会在计时器管理后调用此方法。 /// /// 节点的执行状态(Running, Success, Failure)。 protected abstract Status ExecuteLeafLogic(); /// /// 的 Tick 方法,包含了计时器和状态管理逻辑。 /// 此方法被密封,子类应实现 而不是重写 Tick。 /// public sealed override Status Tick() { if (CurrentStatus == Status.Ready) { CurrentStatus = Status.Running; _elapsedFrames = 0; } if (CurrentStatus == Status.Running) { _elapsedFrames++; if (_elapsedFrames > _timeoutFrames) { CurrentStatus = Status.Failure; Reset(); return Status.Failure; } var logicResult = ExecuteLeafLogic(); if (logicResult != Status.Running) { CurrentStatus = logicResult; Reset(); } return logicResult; } return CurrentStatus; } /// /// 重置叶节点的状态,包括基类状态和内部计时器。 /// public override void Reset() { base.Reset(); _elapsedFrames = 0; } } }