我倾向于避免采用 "unity 方式",因此最终编写了大量的自定义系统。现在,行为包(Behavior)是相当不错的,但是如往常一样,我决定自己实现一个功能简洁的包,完美适应我的现有工具架构。
在完成选择器、序列和装饰器的核心类后,需要开始实现叶子节点来执行任务,我意识到存在一个棘手的问题。
我仍然非常渴望利用可视化图形系统来设计树状结构,但经过一番研究后,我 couldn't 找到适合的任何东西。也很不愿意在unity上花一个周末写一个基于节点的编辑器,也不愿意手动写JSON。可脚本化对象(Scriptable objects)也是不可能的,因为序列化限制使它们在 nested 复杂数据结构中的应用过于有限。
看似要实现可视化图形来创建树状定义,我必须要么购买第三方工具,要么自建一个自定义工具。
然后,我灵光一现。Unity中的Game Object(游戏对象)是一个非常完美的树状结构。所有我需要的就是一系列空的游戏对象:
GameObject:GoblinWarriorBehavior标签:TreeDefinition
子节点:序列
序列的子节点:移动至近战范围
序列的子节点:选择攻击
保存为预置件。
将预置件丢入AI mono行为。
在我的行为树类中,接受一个.Blackboard(黑板)和一个带有TreeDefinition标签的Game Object。
在BuildTree函数中,将每个对象名传递给行为节点工厂(BehaviorNodeFactory),以创建树状结构。
最后我添加了一个简单的编辑器脚本,它验证了游戏对象名是否有效以消除 typos。
最后,也可以向TreeDefinition标签的任何GameObject添加一个组件来实现装饰功能,例如,如果想要实现重复器(repeater)节点重复执行5次,只要检查预置件是否附带了装饰器组件即可。
这个approach的优点:
极简轻量(Super light weight)
行为树类(Single BehaviorTree class)。
构建行为图谱就像在Unity编辑器中构建一个预置件一样容易。
自定义编辑器脚本防止类型错误并提供警告,如果名称不包含在工厂中。
无使用脚本化对象。
无JSON。
无第三方工具、库或付费资产。
不会在构建自定义工具方面浪费周末。
不会在滚动查看图谱并连接节点。
如果您有兴趣,可以看看一些代码示例。
评论 (0)