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

2013年12月13日 | 分类: AI分享 | 标签: , , , , , ,
(6 票,评分 4.33)
Loading...

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

先是数据结构定义

1

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

2

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

3

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

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



发表评论 | Trackback | 已被阅读5,735次
  1. 2016年6月22日16:08

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

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

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

  2. cloudfreexiao
    2016年5月16日18:01

    楼主: 请问这个 UpdateQuest() 是每帧去同步的吗?

    • 2016年5月17日14:43

      不是每帧去调,是需要触发任务更新的点去调,比如升了一级,或者打了怪等等时间点上

  3. ldc
    2015年10月15日14:41

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

    • 2015年11月20日21:12

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

  4. 2015年3月3日10:38

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

  5. lufeng
    2015年3月2日17:43

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

    • 2015年3月2日23:07

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

      • 2015年3月4日10:39

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

        • 2015年3月4日10:43

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

          • 2015年3月4日16:01

            多谢Finney,我好想明白了一些。

          • 2015年3月4日16:45

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

          • 2015年3月4日17:14

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

          • 2015年3月4日20:45

            原来是共享节点型的树啊,你说的后来又写了一种,就是指的是共享节点型的树吧?

          • 2015年3月5日09:48

            对的,c#版的,在unity上可以用,等我整理好了可以放出来

          • 2015年3月5日11:27

            太好了,感谢博主,赞美博主,期待。。这样就可以参考下用在服务器端的怪物AI之中了。。

          • 2015年3月5日14:55

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

  6. china
    2014年10月28日09:37

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

  7. Lee
    2014年5月12日12:00

    在Behavior Tree里的 Loop节点 怎么用啊 请教一下 我这里 此节点只进一次 这是为什么啊

    • 2014年5月16日09:56

      Loop就是循环这个节点n次,如果没有其他的条件,循环n次后结束

  8. Chucky
    2014年3月31日16:25

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

    • 2014年4月1日11:04

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

      • Chucky
        2014年4月1日11:25

        好的,感谢博主这么快回复!

  9. 土匪
    2014年3月5日13:02

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

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

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

    你们又是如何设计呢?

    • 2014年3月28日09:51

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

      • ShionRyuu
        2014年9月19日15:18

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

        • 2014年9月22日09:42

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

  10. lexus1989
    2014年2月12日13:45

    请大神指教,行为树如何做群体智能?比如:组队做任务

    • 2014年2月17日13:50

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

无觅相关文章插件,快速提升流量