Files

78 lines
2.3 KiB
C#
Raw Permalink 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.

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