1相关文章
使用行为树(Behavior Tree)实现网游奖励掉落系统
从有限状态机(FSM)到行为树(Behavior Tree)
在行为树(Behavior Tree)中使用黑板(BlackBoard)
Handling Complexity in the Halo 2 AI
2相关工具和库
GameBrains GameBrains:The First Behavior Tree Middleware Runtime and Editor 包含AI编辑器,生成的格式是xml。解析库。远程连接调试。
owyl A python behavior tree for implementing fast and flexible AI.
treesharp Behavior Tree Implementation in C#
3减少脚本数量
Composite Decorator 所有游戏通用,condition和action就各有各的不同了。
3.1condition
函数:TestSingle()用于测单体的属性(设计多个对象的全局性测验需要另加函数)
对象:自己、队友、敌军、所有战斗单位、建筑、全局context。
属性:血、蓝、血量百分比、蓝百分比、力量、距离自己、距离出口(这个距离XX可以提炼,但是会破坏现有结构).......
关系:大于、小于、等于...
数值:N
buff:中毒、无敌.....
有无:true, false。
数量关系:大于、小于、等于... (用于描述有几个处于上述的属性状态)
数量值:N
其中对象,可以根据所拥有的共同属性再分类,需要加个condition的属性 “对象类型”,然后根据所选对象类型,自动只显示相关的对象和属性。
其中buff可以合到属性中,关系是等于,数值是0,1、truefalse、或持续时间。
3.2action
函数:攻击、使用物品、休息、走、跑
参数:
攻击:技能ID
物品:物品ID
走跑:位置
攻击和物品还需要选取目标:需要的参数和上面contition中用到的一致。这些参数全作为攻击函数的参数。
这样可以用统一的方式和脚本处理,就不需要像一些文章中,每种condition都要写个脚本。
4.仍然存在的问题
4.1多个条件
上面提到的只能描述一个人,只能描述:有个敌人血量少于3,而且有个敌人力量大于5,通过sequence实现。
而不能描述有个敌人血量少于3且力量大于5。 针对这个就必须单独写个脚本了;或者改变经典的行为只有这4个node的格式,自己附加一套描述对象属性的格式。
4.2涉及多个对象
这应该属于全局context。
比如有3个敌人站在一起就放某个范围群攻技能,这就无法通过TestSingle实现,需要再加函数了, 参数是敌人数量和范围。
全局context的一些属性(比如环境、副本内造成总伤害等)还是留在TestSingle中,虽然和自己一样用不到数量关系和数量值(因为全局唯一)。
4.3持续性Action
行为树DEMO中到花店和买花放一个sequnce下,但是到花店是个持续型行为。解决方法有两个:
1.到花店不马上返回,本次AI检测不马上返回,到了花店后返回,然后到下个action买花。
2.把到花店和买花放在两个sequnce节点,买花的condition是在花店。
3.Action中只有买花,没有到花店。由买花脚本自己判断是否需要到花店。
个人认为应该才用方案3。
4.4定时与触发
这些AI行为树脚本,应该是定时检测的。但是如果有些AI却是事件触发的,比如被击中前开启无敌,死亡时掉落物品(掉落也作为AI)。
我目前能想到的是和定时脚本放到不同的行为树中,每个触发事件对应一颗行为树。
或者是延迟事件触发,还是定时检测,死亡就不能马上死亡了,要等定时器AI检测过后才死掉。
5最佳的描述解决方案
额,估计还是本体(Ontology)啊,但是解析库太少了,只有jena这个java库。