重构游戏AI开发:ET框架行为机的创新实践
解决传统AI开发的核心痛点
游戏AI开发长期面临三大挑战:状态机的复杂度爆炸、行为树的协程管理难题、非技术人员参与门槛高。传统状态机随着状态增多,转换逻辑呈N²增长,形成难以维护的网状结构;行为树虽解决了部分复杂性,但在处理异步任务时缺乏优雅的取消机制;而纯代码实现的AI逻辑,让策划和设计师难以参与调优。
传统方案对比:
- 有限状态机:适合简单场景,但状态转换逻辑随状态数呈几何增长
- 行为树:结构化层级决策,但异步任务管理复杂
- 分层状态机:引入状态继承关系,但仍需手动维护转换条件
- ET行为机:通过"条件-行为"模型实现线性复杂度,结合协程取消机制,解决上述所有问题
实现行为机核心架构
构建基础节点抽象
行为机的核心是AINode基类,它定义了所有AI行为的统一接口。每个节点包含条件判断与行为执行两个核心方法:
public abstract class AINode
{
/// <summary>
/// 条件检查:返回true表示节点可执行
/// </summary>
public abstract bool Evaluate(GameObject agent);
/// <summary>
/// 行为执行:返回可取消的协程
/// </summary>
public abstract ETVoid Execute(GameObject agent, ETCancelToken cancelToken);
}
核心实现
避坑指南:确保Evaluate方法执行高效,避免在条件检查中执行复杂计算,建议控制在1ms内完成。
设计优先级调度机制
行为机通过定期扫描+优先级排序实现行为切换,核心逻辑如下:
public class BehaviorMachine
{
private List<AINode> nodes = new List<AINode>();
private ETCancelToken currentCancelToken;
private AINode currentNode;
public async ETVoid Start()
{
while (true)
{
// 每秒检查一次节点条件
await TimerComponent.Instance.Wait(1000);
// 按优先级查找第一个满足条件的节点
AINode nextNode = nodes.FirstOrDefault(n => n.Evaluate(agent));
if (nextNode != currentNode)
{
// 取消当前行为
currentCancelToken?.Cancel();
currentCancelToken = new ETCancelToken();
// 执行新行为
currentNode = nextNode;
currentNode.Execute(agent, currentCancelToken).Coroutine();
}
}
}
}
调度实现
工作流程:
graph TD
A[开始] --> B[等待检查间隔]
B --> C[遍历节点数组]
C --> D{节点条件满足?}
D -- 是 --> E[取消当前行为]
E --> F[执行新节点行为]
D -- 否 --> C
F --> B
避坑指南:节点优先级顺序直接影响AI行为逻辑,建议将紧急行为(如躲避危险)放在高优先级位置。
开发Unity可视化编辑工具
实现节点配置界面
为使非技术人员能配置AI行为,我们开发了基于Unity的可视化编辑器。工具主要包含三个区域:节点列表区、画布区和属性面板。
图:AI行为节点配置界面,可通过拖拽调整节点优先级
核心实现代码:
public class AIBehaviorEditor : EditorWindow
{
private AIBehaviorAsset currentAsset;
private List<AINodeConfig> nodeConfigs = new List<AINodeConfig>();
void OnGUI()
{
// 节点列表区域
GUILayout.BeginArea(new Rect(10, 30, 200, position.height - 40));
// 绘制节点列表...
GUILayout.EndArea();
// 画布区域
GUILayout.BeginArea(new Rect(220, 30, position.width - 440, position.height - 40));
// 绘制拖拽区域...
GUILayout.EndArea();
// 属性面板区域
GUILayout.BeginArea(new Rect(position.width - 210, 30, 200, position.height - 40));
// 绘制属性编辑...
GUILayout.EndArea();
}
}
编辑器实现
避坑指南:保存配置时需验证节点参数合法性,特别是数值范围和必填项检查。
实现配置序列化系统
使用ScriptableObject存储AI行为配置,确保数据持久化和运行时高效加载:
[CreateAssetMenu(fileName = "NPCBehavior", menuName = "ET/AI行为配置")]
public class AIBehaviorAsset : ScriptableObject
{
[SerializeReference]
public List<AINodeConfig> nodeConfigs = new List<AINodeConfig>();
public float checkInterval = 1000; // 检查间隔(毫秒)
}
[Serializable]
public class AINodeConfig
{
public string nodeType; // 节点类型全名
public string nodeName; // 节点显示名称
public bool enabled = true; // 是否启用
public List<NodeParameter> parameters = new List<NodeParameter>(); // 自定义参数
}
配置定义
避坑指南:使用[SerializeReference]而非普通引用,避免资产序列化时丢失多态类型信息。
实战案例:自动售货机AI系统
需求分析
为智能售货机构建AI系统,实现以下行为:
- 补货行为:当商品库存低于阈值时触发
- 促销行为:定时推出优惠活动
- 待机行为:无其他任务时进入节能模式
节点实现
补货节点:
public class RestockNode : AINode
{
public float minStockThreshold = 5; // 最低库存阈值
public override bool Evaluate(GameObject agent)
{
VendingMachine machine = agent.GetComponent<VendingMachine>();
return machine.GetLowestStock() < minStockThreshold;
}
public override async ETVoid Execute(GameObject agent, ETCancelToken cancelToken)
{
VendingMachine machine = agent.GetComponent<VendingMachine>();
// 通知仓库补货
await machine.NotifyWarehouse(cancelToken);
// 等待补货完成
while (!machine.IsStockFull() && !cancelToken.IsCanceled)
{
await TimerComponent.Instance.Wait(500, cancelToken);
}
}
}
补货节点实现
配置与集成
- 在Unity编辑器中创建"NPCBehavior"资产
- 添加三个节点并设置优先级:补货节点(1) > 促销节点(2) > 待机节点(3)
- 配置各节点参数:
- 补货节点:最低库存阈值=5
- 促销节点:间隔=1800秒,折扣=20%
- 待机节点:屏幕亮度=30%,风扇转速=低
在自动售货机实体上挂载AI组件:
public class VendingMachineAIComponent : MonoBehaviour
{
public AIBehaviorAsset behaviorAsset;
private BehaviorMachine behaviorMachine;
void Start()
{
behaviorMachine = new BehaviorMachine();
behaviorMachine.Initialize(gameObject, behaviorAsset);
behaviorMachine.Start().Coroutine();
}
}
AI组件实现
最佳实践与社区贡献
节点设计模式
- 单一职责:每个节点只负责一种行为逻辑
- 参数化配置:通过可配置参数调整行为表现,避免硬编码
- 状态独立性:节点间不共享状态,通过agent组件交换数据
性能优化建议
- 复杂条件检查使用缓存机制
- 高频执行的节点降低检查频率
- 长时间运行的行为添加进度保存机制
社区贡献指南
我们欢迎开发者通过以下方式参与ET行为机的改进:
- 节点库扩展:开发通用节点并提交PR到[Scripts/AI/CommunityNodes/]
- 编辑器功能:改进可视化工具,添加节点调试功能
- 文档完善:补充使用案例和API文档
- 性能优化:提交性能改进建议或代码
贡献流程:
- Fork项目仓库:
git clone https://gitcode.com/GitHub_Trending/et/ET - 创建特性分支:
git checkout -b feature/your-feature-name - 提交修改:
git commit -m "Add xxx node" - 推送分支:
git push origin feature/your-feature-name - 提交PR并描述功能改进点
ET框架的AI行为机通过创新的"条件-行为"模型,彻底改变了传统AI开发的复杂度问题。配合直观的可视化编辑工具,让AI开发变得高效而灵活。无论你是经验丰富的开发者还是刚入门的新手,都能快速构建出复杂而可靠的AI系统。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0151- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
LongCat-Video-Avatar-1.5最新开源LongCat-Video-Avatar 1.5 版本,这是一款经过升级的开源框架,专注于音频驱动人物视频生成的极致实证优化与生产级就绪能力。该版本在 LongCat-Video 基础模型之上构建,可生成高度稳定的商用级虚拟人视频,支持音频-文本转视频(AT2V)、音频-文本-图像转视频(ATI2V)以及视频续播等原生任务,并能无缝兼容单流与多流音频输入。00
auto-devAutoDev 是一个 AI 驱动的辅助编程插件。AutoDev 支持一键生成测试、代码、提交信息等,还能够与您的需求管理系统(例如Jira、Trello、Github Issue 等)直接对接。 在IDE 中,您只需简单点击,AutoDev 会根据您的需求自动为您生成代码。Kotlin03
Intern-S2-PreviewIntern-S2-Preview,这是一款高效的350亿参数科学多模态基础模型。除了常规的参数与数据规模扩展外,Intern-S2-Preview探索了任务扩展:通过提升科学任务的难度、多样性与覆盖范围,进一步释放模型能力。Python00
skillhubopenJiuwen 生态的 Skill 托管与分发开源方案,支持自建与可选 ClawHub 兼容。Python0112
