State() 仍保持宽松(有则取),用于给已声明的态挂边;DeclareState() 只用于 首次声明行为,重复声明同名状态会抛异常。AiStateFragments 的四个建态原语 (Locomotion/Ability/AbilityOnce/Terminal)改用 DeclareState。同时给 IEngagementModule/IDeathModule/IUnawareModule 补充不变量说明。
32 lines
1.4 KiB
C#
32 lines
1.4 KiB
C#
using System.Collections.Generic;
|
|
using BaseGames.AI;
|
|
|
|
namespace BaseGames.Enemies
|
|
{
|
|
/// <summary>
|
|
/// 未发现层:玩家尚未被发现时的行为形状(单一站桩 / 单向降级 / 定时交替 …)。
|
|
///
|
|
/// 刻意拆成两阶段:AiRuntime 按声明顺序评估条件边,若本模块的内部边(如巡逻计时)
|
|
/// 早于骨架的升级边声明,玩家进入追逐区那一帧若恰好计时到点,敌人会切去另一个待机态
|
|
/// 而不是扑上来。骨架的调用顺序固定为 Declare → 挂升级边 → Link。
|
|
/// </summary>
|
|
public interface IUnawareModule
|
|
{
|
|
/// <summary>只声明状态与行为回调,不挂任何转换。</summary>
|
|
void Declare(BrainBuilder b);
|
|
|
|
/// <summary>挂内部转换(如站立 ⇄ 巡逻的计时边)。没有内部边的模块留空实现。</summary>
|
|
void Link(BrainBuilder b);
|
|
|
|
/// <summary>图入口(出生态)。注意与交战/死亡层的 EntryState 不同:
|
|
/// 本属性会成为整张图唯一的 BrainBuilder.Entry,而 EntryState 只是别处 To() 的目标。</summary>
|
|
string Entry { get; }
|
|
|
|
/// <summary>脱战 / 警觉丢失后回到的态。必须属于 States。</summary>
|
|
string Rest { get; }
|
|
|
|
/// <summary>需要挂升级边的所有未发现态。</summary>
|
|
IReadOnlyList<string> States { get; }
|
|
}
|
|
}
|