feat(ai): IAiDefinition + AiRecipeSO 配方基类(含关闭域重载的缓存重置)

This commit is contained in:
2026-07-29 14:32:45 +08:00
parent 7327a5fe09
commit 6d8db95046
6 changed files with 73 additions and 2 deletions
+36
View File
@@ -0,0 +1,36 @@
using UnityEngine;
using BaseGames.Core.Events;
namespace BaseGames.AI
{
/// <summary>
/// AI 配方资产基类。子类以序列化字段描述一张图,Build 里组装。
/// 一个资产 = 一种敌人 AI;所有引用该资产的实例共享同一张 AiGraphflyweight)。
/// </summary>
public abstract class AiRecipeSO : ScriptableObject, IAiDefinition
{
AiGraph _cached;
void OnEnable()
{
// 项目已关闭 Domain ReloadSO 的运行时态在多次 Play 会话间会残留,
// 改了配方再进 Play 仍用旧图。登记到统一的"进入 Play 前重置"通道。
PlayModeResetHook.Register(ClearCache);
}
void ClearCache() => _cached = null;
public AiGraph GetOrBuildGraph()
{
if (_cached == null)
{
var b = new BrainBuilder();
Build(b);
_cached = b.Build();
}
return _cached;
}
protected abstract void Build(BrainBuilder b);
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3b4ea7eede5a322448cfccec3eff2acf
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+1 -1
View File
@@ -14,7 +14,7 @@ namespace BaseGames.AI
/// 一种敌人 AI 的声明基类(唯一事实来源)。子类实现 Build 用 fluent 描述状态机。 /// 一种敌人 AI 的声明基类(唯一事实来源)。子类实现 Build 用 fluent 描述状态机。
/// 构建结果 AiGraph 每类型只建一次、实例共享(flyweight)。 /// 构建结果 AiGraph 每类型只建一次、实例共享(flyweight)。
/// </summary> /// </summary>
public abstract class AiScript public abstract class AiScript : IAiDefinition
{ {
AiGraph _cached; AiGraph _cached;
+2 -1
View File
@@ -2,7 +2,8 @@
"name": "BaseGames.AI", "name": "BaseGames.AI",
"rootNamespace": "BaseGames.AI", "rootNamespace": "BaseGames.AI",
"references": [ "references": [
"BaseGames.Core" "BaseGames.Core",
"BaseGames.Core.Events"
], ],
"includePlatforms": [], "includePlatforms": [],
"excludePlatforms": [], "excludePlatforms": [],
+12
View File
@@ -0,0 +1,12 @@
namespace BaseGames.AI
{
/// <summary>
/// 能产出共享 AiGraph 的东西。两个实现:
/// AiScript(定制路径,写 C# 类)与 AiRecipeSO(配方路径,建资产)。
/// </summary>
public interface IAiDefinition
{
/// <summary>惰性构建并缓存共享图(flyweight:每个定义只建一次)。</summary>
AiGraph GetOrBuildGraph();
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: bdf86cde06fe7b8468b243b2bca11d22
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: