用行为树的方式思考(后续)- 任务系统设计

上次分享了《用行为树的方式思考》后,有同学想让我详细说一下任务系统,我这里就贴几个代码片段(伪代码)再详细说明一下

先是数据结构定义

1

由于Condition和Objective都定义成了树结构,所以我们就可以很方便的组织逻辑,下面是一个具体Condition的例子,Objective也可用同样的方式定义出来

2

这样接任务和更新任务就变的很简单

3

所以我们只需要定义出单个的逻辑片段,然后游戏设计去拼搭任务逻辑就可以了,和行为树的思路是很像很像的。当然任务系统还有很多细节需要处理,但这样的逻辑结构可以大大的帮助理清思路,实现出漂亮的代码

————————————————————————
作者:Finney
Blog:AI分享站(http://www.aisharing.com/)
Email:finneytang@gmail.com
本文欢迎转载和引用,请保留本说明并注明出处
————————————————————————

(已被阅读14,365次)

34 评论

  1. 您好,想问下如果用行为树来做一个符合“万物可裂变、万物可交互”的思路的物品系统应该怎么入手?
    初步考虑的是,物品在裂变的时候有个类似于配方的东西,大致是:材料+条件+行为+顺序+配方=新物品。但是不知道怎么跟行为树的节点进行结合。

  2. 感觉树模型是逻辑复用的利器,博主写得很棒,我也按照文章完成了一个复用的任务系统,所有逻辑的检查全变成了查表,就是实现繁琐。树模型和多态是OOP的一种绝妙的组合。

  3. Hi ,博主,用在任务系统上真的很爽,就是简单的继承和重写就能优美的解决一个复杂的系统,非常感谢!

  4. @Finney 请教一个策略类型的游戏AI。我就拿《蘑菇战争》作例子,这个游戏的战斗是这样的:
    蘑菇战争网址 http://mgzz.163.com/

    1.假设有3个阵营。1个真人玩家阵营,1个电脑玩家阵营,1个中立阵营(中立不用AI,他不做任何决策)
    2.每个阵营初始有a个城池。
    3.游戏胜利规则:占领所有敌方的城池。
    4.城池功能–兵力(相当血量),每个城池兵力有上限值(相当最大血量)
    4.城池功能–兵力回复(相当血量回复)
    4.城池功能–升级(有3个等级),可以提升兵力上限、兵力回复速度
    4.城池功能–调兵,可以把兵派到任意城池,目标城池如果是自己的就是“调兵决策”给目标城池补充兵力,如果是敌人的就是”攻打“抵消目标城池兵力。调兵会消耗当前发兵城池的兵力。

    AI需要做的就是 “城池升级”、”调兵“这两个行为。初步感觉AI对象有两种方式(或者叫两个层次) ”城池“和”玩家势力“。
    #针对”城池“写的话可以用你之前的那些思想比较好实现。
    #针对”玩家”,我主要就是想知道这里你有什么建议?

  5. Condition_LevelRequirement和Condition_FinishQuest所要用于条件检查的数据对象是不一样的(一个是等级大小,一个是任务完成否),应该不是inputParam。请问二者的条件检查要如何进行?

    1. 我这里inputparam可以理解成一个any的数据结构,不同的语言可以有不同的表示方式,比如c++里面就可以用void*,当然你也可以用一个统一的数据结构,里面可以提供一些变量位,然后根据不同的类来解析,这就类似于协议的做法

  6. Finney,您好,我想问下行为树AI如果用在游戏中的服务器端关于怪物的实现,要怎么做比较好呢?
    不太明白关于根节点该怎么设计,能想到的大概的思路应该是:
    1、根据怪物的不同表现,设计不同的行为节点(攻击,巡逻,逃跑,回巢,召唤怪物,汉喊话,释放技能等)
    2、设计不同的控制节点(血量降低百分之多少,周期间隔,出生时,死亡时,在战斗状态中,不在战斗状态中等)
    具体的求指导。

  7. Finney,您好,我想问下行为树AI如果用在游戏中的服务器端关于怪物的实现,要怎么做比较好呢,没明白关于根节点该怎么设计,大概能知道的思路应该是,根据怪物的不同表现,设计不同的行为节点(攻击,巡逻,逃跑,回巢,召唤怪物,汉喊话,释放技能等)和控制节点(血量降低百分之多少,周期间隔,出生时,死亡时,在战斗状态中,不在战斗状态中等)求指导。

    1. 可以先列出所有的行为节点,就像你说的这样,然后再列出触发这些行为的前提条件,不是用控制节点,控制节点指的是行为间的关系,不是指前提。比如你有一个序列行为,控制节点就是这个序列,里面有几个子节点是行为(释放暴走技能,召唤怪物,喊话),这个序列行为的前提是血量降低到30%以下。类似于这样,然后把这些都挂到根节点上去,一般根节点是一个选择节点

    2. 恩,大致明白了,多谢Finney的解答,根节点其实是个控制节点吧(比如您说的选择节点?或者序列节点?),然后把这个根节点挂到怪物身上?然后根节点下有各种行为节点和他们的前提?(释放技能当血量降低80%,刚出生时喊话)类似这样的对吧?

    3. 对的,就是这样,其实不只是根节点,根节点下面还可以连控制节点,这样逻辑就一层层关连起来了

    4. 您好,我想再问一下,看了你的DEMO,发现tsiublogver_2这里的用到了Task,和之前的第一版的demo不一样,这里的Task主要是用来干啥的呢?

    5. 这个是共享节点型的行为树,可以看http://www.aisharing.com/archives/563,不过这个实现比较繁琐,我后来又写了一种,感觉会比这个好一点

    6. 博主你好,再问下,关于共享节点型的树,这里没有用到前提,而是直接写到了Update里面,是不是吧前提也提出来,这样耦合度不高,是不是会好一些?

  8. 你好,我想要在程序中模拟,游戏人物之间不能够相互穿越这个效果。目前的想法是,如果两个人物之间隔得太远就给他一个靠近的力。如果隔得很近就给他一个远离的力。但是我没有算好这个力和距离还有速度的关系?请问作者有没有相关的经验。

  9. 博主你好,我是入行不久的游程一枚,博主的AI相关的博文写的很好,受益匪浅,想问下博主有没有AI相关的书籍推荐,想深入学习下AI,谢谢

    1. 如果是学院派的书,我也不是很了解,因为我本身也不是科班研究人工智能的,如果是游戏相关的,大部分都是类似于论文集的书,像游戏编程精粹里有专门的AI部分可以看看,还有就是一些常用的游戏AI技术可以去了解一下,比如状态机,行为树,黑板,模糊逻辑,神经网络,贝叶斯等等,有个网站叫aigamedev,很不错,也可以经常上上。由于游戏AI比较特殊,更多的学习和经验需要在实践中积累。

  10. 谢谢,之前是我提出来的要求,这么快就看到了伪代码实现。

    —————————-
    我看到里面的inputParm,很显然,应该是属于一种万金油的结构(如 any),任务函数的调用方和内部互相协商传递的结构,可以解决沟通上的问题,但是,在序列化到数据库里面的时候,似乎也只能使用一个万金油结构了?

    如 A 打怪任务(需要记录打怪数量) B 循环任务(需要记录第几环/第几次 + 当前环/第几次的 参数)

    你们又是如何设计呢?

    1. 在一个quest里每一个objective都对应一个唯一(quest里唯一)的id,每一个objective里面每一个要存的数据也对应一个唯一(objective里唯一)的id,这两个id会拼成一个key,数据库里面是存了一系列的key/value对,这样就可以序列化和反序列化了

    2. 土匪上面说的应该是数据的问题(objectiveA的属性只有一个数值代表打怪数量,objectiveB的属性有一个数值代表第几环,一个代表第几次),要怎么序列化和反序列化不同的objective类?

    3. 首先我有quest id,我就能找到那个quest,就可以重建这个quest的类,这个是静态数据,然后就是通过这个quest里的objective的唯一id去重建每一个objective的类和数据

    1. 群体智能的一种解决方案是,需要专门做一个群体决策的行为树,然后用一块黑板来作为共享知识库,然后个人的行为树再基于这个黑板来做个人决策

发表评论

邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Copyright © 2011-2020 AI分享站    登录