怪物ai与行为树设计
https://www.fgba.net/sitemap.xml
说到怪物ai和行为树,网上有很多文章进行了介绍,很多人可能都有一定的了解,但在实际运用过程中又好像有点是似而非。
这里我们简单的梳理一下:ai表示的是人工智能,就是用程序逻辑模拟人的行为。而行为树是一种程序实现ai的一种方法,策划可以用行为树的方式进行ai设计,也可以采用比较常规的状态机机制进行设计。
不管用什么方式进行设计。
策划本质上要设计的是怪物行为,这些怪物行为能够针对周围的环境和玩家行为作出反馈。因此在进行怪物ai设计的时候,最本质的表达就是:
怪物有哪些行为?
行为有哪些前置条件?
举个例子
移动逻辑:
- 当警戒范围内没有敌方单位时:巡逻
- 当警戒范围内出现敌方单位时: 向敌人移动。
- 当怪物生命值低于500时:逃跑
攻击逻辑:
- 当角色进入攻击范围进行攻击。
- 当怪物血量低于1000时进行疯狂攻击攻击。
- 当怪物血量高于或等于1000时进行疯狂攻击。
很明显可以看出,上面的这种描述大致描述了这个单位的一些ai特征,然后我们就可以利用程序中思想来描述我们所要表达的怪物ai,从而补充我们所思考的一些漏洞。在做这个工作之前,我们先抽象怪物有哪些前置条件和行为。
上面我们提到了警戒却没有用战斗状态这个元素。选择攻击目标也没有提到大家熟悉的威胁值这个元素。因为我们的ai需求里面不需要这样的元素来进行更复杂的逻辑判断。因此在抽象前置条件时,并不是把我们印象中知道的一些元素塞进来,而是根据需要制定相关的元素来满足我们所需要的设定目标。
因此我们得到了我们将这些前置条件和行为进行逻辑整理,就得到了如下的mind图:
上图中因为没有特殊的移动,因此把QQ靓号转让移动的执行省略了。
我们可以看到每个特定的条件都能执行到一个确定的行为结果。这是一个非常简单的ai例子,实际运用过程中的ai行为会因为阵营,技能,地形等因素有许多复杂的判断。如果按上面的脑图方法进行程序设计时,可能引入的是一种“状态机”的机制,就是每间隔一段时间检查一下当前的状态,当状态发生改变时,执行接下来的行为,并且执行后改变状态。
状态态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:
现态:是指当前所处的状态。
条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
这种方式下当元素判断过于庞大,多个对象同时存在时,无论是这种方式的设计还是对程序逻辑的执行起来了巨大的障碍,为了解决这一障碍于是就提出了行为树的概念,行为树(BehaviorTree)是Next-Gen AI提出的一个原型。
它以图形的形式展现了AI系统的结构,将上述的流程图整理之后于是得到如下的图形:
1)顺序节点(Sequence):顺序执行子节点,只要它的一个子节点返回false,则整个分支返回false,反之返回true,类似程序中的逻辑与(AND)。
2)选择节点(Selector): 顺序执行子节点,只要它的一个子节点返回true,则整个分支返回true,反之返回false,类似程序中的逻辑或(OR)。
3)条件节点(Condition): 属于叶子节点(该种节点不允许有任何子节点),用于描述一个条件是否成立。
4)行为节点(Action) : 属于叶子节点(该种节点不允许有任何子节点),用于描述一个最终执行的动作,一般返回true。
假设当前怪物的生命值为450,警戒范围内有敌军,满足逃跑条件。怪物要执行逃跑行为,首先判断所有的条件:
- 警戒范围内是否有敌军,是为true,否为false
- 自身生命值是否高于或等于500,是为true,否为false
- 自身生命值是否高于或等于1000,是为true,否为false
- 自身是否正在遭受攻击,是为true,否为false
根据行为树的执行规则,则得到逃跑的结果。
从上面的表述我们可以看到,用“状态机”的机制我们可以更加直观的看到怪物在什么条件下执行出什么行为,但是在判断条件非常多的时候,会产生许多的状态跳转关系,维护成本会比较大,程序执行效率也会相对比较低。而用行为树的机制,我们比较难直接的看出怪物的具体行为,但是在维护成本和执行效率方面会得到较大的提高。
因此,在设计规模不是特别庞大,修改次数比较少的ai类型时,用一般的状态机机制即可满足条件,而在设计复杂,经常需要调整维护的ai时,尽可能的使用行为树机制。至于策划是使用行为树机制还是状态机机制,个人建议还是从状态机机制入手,对怪物的行为设定有了足够的了解之后,在设计复杂的ai时慢慢转向行为树机制。
但是不管用什么方式,作为策划最首先要考虑到的是我们究竟要什么样的结果,这些设定能带来什么样的体验。因此作为怪物ai设计,我们要考虑到的是我们所要的玩法需要什么样的怪物行为和前置条件进行支撑,然后再利用状态机机制或是行为树机制进行细节的逻辑漏洞补充和方便程序进行实现。
更多推荐
所有评论(0)