36 lines
1.1 KiB
C#
36 lines
1.1 KiB
C#
using System;
|
|
|
|
namespace BaseGames.AI
|
|
{
|
|
/// <summary>标注一个 AiScript 对应的敌人类型 id,供 AiDefinitionRegistry 反射收集(第 3 阶段)。</summary>
|
|
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
|
|
public sealed class AiDefinitionAttribute : Attribute
|
|
{
|
|
public string Id { get; }
|
|
public AiDefinitionAttribute(string id) => Id = id;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 一种敌人 AI 的声明基类(唯一事实来源)。子类实现 Build 用 fluent 描述状态机。
|
|
/// 构建结果 AiGraph 每类型只建一次、实例共享(flyweight)。
|
|
/// </summary>
|
|
public abstract class AiScript
|
|
{
|
|
AiGraph _cached;
|
|
|
|
/// <summary>惰性构建并缓存共享 AiGraph。</summary>
|
|
public AiGraph GetOrBuildGraph()
|
|
{
|
|
if (_cached == null)
|
|
{
|
|
var b = new BrainBuilder();
|
|
Build(b);
|
|
_cached = b.Build();
|
|
}
|
|
return _cached;
|
|
}
|
|
|
|
protected abstract void Build(BrainBuilder b);
|
|
}
|
|
}
|