上次分享了《用行为树的方式思考》后,有同学想让我详细说一下任务系统,我这里就贴几个代码片段(伪代码)再详细说明一下
先是数据结构定义
由于Condition和Objective都定义成了树结构,所以我们就可以很方便的组织逻辑,下面是一个具体Condition的例子,Objective也可用同样的方式定义出来
这样接任务和更新任务就变的很简单
所以我们只需要定义出单个的逻辑片段,然后游戏设计去拼搭任务逻辑就可以了,和行为树的思路是很像很像的。当然任务系统还有很多细节需要处理,但这样的逻辑结构可以大大的帮助理清思路,实现出漂亮的代码
————————————————————————
作者:Finney
Blog:AI分享站(http://www.aisharing.com/)
Email:finneytang@gmail.com
本文欢迎转载和引用,请保留本说明并注明出处
————————————————————————
您好,想问下如果用行为树来做一个符合“万物可裂变、万物可交互”的思路的物品系统应该怎么入手?
初步考虑的是,物品在裂变的时候有个类似于配方的东西,大致是:材料+条件+行为+顺序+配方=新物品。但是不知道怎么跟行为树的节点进行结合。
感觉树模型是逻辑复用的利器,博主写得很棒,我也按照文章完成了一个复用的任务系统,所有逻辑的检查全变成了查表,就是实现繁琐。树模型和多态是OOP的一种绝妙的组合。
Hi ,博主,用在任务系统上真的很爽,就是简单的继承和重写就能优美的解决一个复杂的系统,非常感谢!
你好 请问有demo栗子么 想学习下
@Finney 请教一个策略类型的游戏AI。我就拿《蘑菇战争》作例子,这个游戏的战斗是这样的:
蘑菇战争网址 http://mgzz.163.com/
1.假设有3个阵营。1个真人玩家阵营,1个电脑玩家阵营,1个中立阵营(中立不用AI,他不做任何决策)
2.每个阵营初始有a个城池。
3.游戏胜利规则:占领所有敌方的城池。
4.城池功能–兵力(相当血量),每个城池兵力有上限值(相当最大血量)
4.城池功能–兵力回复(相当血量回复)
4.城池功能–升级(有3个等级),可以提升兵力上限、兵力回复速度
4.城池功能–调兵,可以把兵派到任意城池,目标城池如果是自己的就是“调兵决策”给目标城池补充兵力,如果是敌人的就是”攻打“抵消目标城池兵力。调兵会消耗当前发兵城池的兵力。
AI需要做的就是 “城池升级”、”调兵“这两个行为。初步感觉AI对象有两种方式(或者叫两个层次) ”城池“和”玩家势力“。
#针对”城池“写的话可以用你之前的那些思想比较好实现。
#针对”玩家”,我主要就是想知道这里你有什么建议?
楼主: 请问这个 UpdateQuest() 是每帧去同步的吗?
不是每帧去调,是需要触发任务更新的点去调,比如升了一级,或者打了怪等等时间点上
Condition_LevelRequirement和Condition_FinishQuest所要用于条件检查的数据对象是不一样的(一个是等级大小,一个是任务完成否),应该不是inputParam。请问二者的条件检查要如何进行?
我这里inputparam可以理解成一个any的数据结构,不同的语言可以有不同的表示方式,比如c++里面就可以用void*,当然你也可以用一个统一的数据结构,里面可以提供一些变量位,然后根据不同的类来解析,这就类似于协议的做法
Finney,您好,我想问下行为树AI如果用在游戏中的服务器端关于怪物的实现,要怎么做比较好呢?
不太明白关于根节点该怎么设计,能想到的大概的思路应该是:
1、根据怪物的不同表现,设计不同的行为节点(攻击,巡逻,逃跑,回巢,召唤怪物,汉喊话,释放技能等)
2、设计不同的控制节点(血量降低百分之多少,周期间隔,出生时,死亡时,在战斗状态中,不在战斗状态中等)
具体的求指导。
Finney,您好,我想问下行为树AI如果用在游戏中的服务器端关于怪物的实现,要怎么做比较好呢,没明白关于根节点该怎么设计,大概能知道的思路应该是,根据怪物的不同表现,设计不同的行为节点(攻击,巡逻,逃跑,回巢,召唤怪物,汉喊话,释放技能等)和控制节点(血量降低百分之多少,周期间隔,出生时,死亡时,在战斗状态中,不在战斗状态中等)求指导。
可以先列出所有的行为节点,就像你说的这样,然后再列出触发这些行为的前提条件,不是用控制节点,控制节点指的是行为间的关系,不是指前提。比如你有一个序列行为,控制节点就是这个序列,里面有几个子节点是行为(释放暴走技能,召唤怪物,喊话),这个序列行为的前提是血量降低到30%以下。类似于这样,然后把这些都挂到根节点上去,一般根节点是一个选择节点
恩,大致明白了,多谢Finney的解答,根节点其实是个控制节点吧(比如您说的选择节点?或者序列节点?),然后把这个根节点挂到怪物身上?然后根节点下有各种行为节点和他们的前提?(释放技能当血量降低80%,刚出生时喊话)类似这样的对吧?
对的,就是这样,其实不只是根节点,根节点下面还可以连控制节点,这样逻辑就一层层关连起来了
多谢Finney,我好想明白了一些。
您好,我想再问一下,看了你的DEMO,发现tsiublogver_2这里的用到了Task,和之前的第一版的demo不一样,这里的Task主要是用来干啥的呢?
这个是共享节点型的行为树,可以看http://www.aisharing.com/archives/563,不过这个实现比较繁琐,我后来又写了一种,感觉会比这个好一点
原来是共享节点型的树啊,你说的后来又写了一种,就是指的是共享节点型的树吧?
对的,c#版的,在unity上可以用,等我整理好了可以放出来
太好了,感谢博主,赞美博主,期待。。这样就可以参考下用在服务器端的怪物AI之中了。。
博主你好,再问下,关于共享节点型的树,这里没有用到前提,而是直接写到了Update里面,是不是吧前提也提出来,这样耦合度不高,是不是会好一些?
你好,我想要在程序中模拟,游戏人物之间不能够相互穿越这个效果。目前的想法是,如果两个人物之间隔得太远就给他一个靠近的力。如果隔得很近就给他一个远离的力。但是我没有算好这个力和距离还有速度的关系?请问作者有没有相关的经验。
你可以网上搜搜steering behavior
在Behavior Tree里的 Loop节点 怎么用啊 请教一下 我这里 此节点只进一次 这是为什么啊
Loop就是循环这个节点n次,如果没有其他的条件,循环n次后结束
博主你好,我是入行不久的游程一枚,博主的AI相关的博文写的很好,受益匪浅,想问下博主有没有AI相关的书籍推荐,想深入学习下AI,谢谢
如果是学院派的书,我也不是很了解,因为我本身也不是科班研究人工智能的,如果是游戏相关的,大部分都是类似于论文集的书,像游戏编程精粹里有专门的AI部分可以看看,还有就是一些常用的游戏AI技术可以去了解一下,比如状态机,行为树,黑板,模糊逻辑,神经网络,贝叶斯等等,有个网站叫aigamedev,很不错,也可以经常上上。由于游戏AI比较特殊,更多的学习和经验需要在实践中积累。
好的,感谢博主这么快回复!
谢谢,之前是我提出来的要求,这么快就看到了伪代码实现。
—————————-
我看到里面的inputParm,很显然,应该是属于一种万金油的结构(如 any),任务函数的调用方和内部互相协商传递的结构,可以解决沟通上的问题,但是,在序列化到数据库里面的时候,似乎也只能使用一个万金油结构了?
如 A 打怪任务(需要记录打怪数量) B 循环任务(需要记录第几环/第几次 + 当前环/第几次的 参数)
你们又是如何设计呢?
在一个quest里每一个objective都对应一个唯一(quest里唯一)的id,每一个objective里面每一个要存的数据也对应一个唯一(objective里唯一)的id,这两个id会拼成一个key,数据库里面是存了一系列的key/value对,这样就可以序列化和反序列化了
土匪上面说的应该是数据的问题(objectiveA的属性只有一个数值代表打怪数量,objectiveB的属性有一个数值代表第几环,一个代表第几次),要怎么序列化和反序列化不同的objective类?
首先我有quest id,我就能找到那个quest,就可以重建这个quest的类,这个是静态数据,然后就是通过这个quest里的objective的唯一id去重建每一个objective的类和数据
请大神指教,行为树如何做群体智能?比如:组队做任务
群体智能的一种解决方案是,需要专门做一个群体决策的行为树,然后用一块黑板来作为共享知识库,然后个人的行为树再基于这个黑板来做个人决策