关于游戏行为树和状态机

一、什么是游戏状态机

游戏中状态机就是一个对象或者角色,有多种状态属性,多种状态下切换变化,比如走路,1段跳跃,2段跳跃,战斗,死亡这些状态。根据当前是什么状态下可以切换到什么状态,比如走路的时候我可以切换到1段跳跃。在1段跳跃下才能做2段跳。

简单的有限状态机可以用枚举+switch的方式实现,用Switch语句来获取状态,并且通过特定的方法来设置状态。但我们可能要在项目的很多地方的调用这段Switch方法,或者设置当前人物的状态。

状态机是一种网络结构。它比较符合我们的常规思维,也比较直观。用于做一些简单的AI没什么大问题。(比如走路的时候搜索敌人,发现敌人,对敌人进行攻击,敌人死亡)用状态机其实更加便捷。但是如果AI比较复杂的话,比如它的状态比较多的话,就显的比较复杂。我们用一张网络(如下面的图)表示,如果状态就几个的话,逻辑上就可控,一旦多起来的话,维护的状态量就会成倍的增加,导致代码上写的很繁琐吃力。

二、什么是行为树?

行为树就是一个包含逻辑节点和行为节点的树结构体,我们把每一种情况都抽象成一个类型的节点,然后我们按照这个规范去写节点,然后把这些节点连接成一棵树。我们每次去找一个行为是时候,就会从树的跟节点出发。遍历各个节点,寻找出一个和当前数据相符合的行为。比如我们有一个士兵有无怪物的时候巡逻,视野内有小怪的时候攻击,视野内看到大BOSS逃跑三个行为。我们就在程序中找到这个英雄,让从左到右遍历自己的子节点,如果子节点的准入条件符合信息的话,就执行该子节点。

如果多个节点都符合条件如何选择?比如上面,视野内同时看到大BOSS和小怪,该怎么执行?

一般有以下选择行为节点

(1)优先级型,从左往右逐个测试,执行条件逐渐放宽

(2)非优先级型,每次从上一个执行的节点开始测试准入条件,用互斥避免节点被屏蔽

(3)权重型,根据权重做概率选择

除了行为节点,其余一般称之为控制节点(Control Node),常用的控制节点有以下三种

(1)选择(Selector):选择其子节点的某一个执行

(2)序列(Sequence):将其所有子节点依次执行,也就是说当前一个返回“完成”状态后,再运行先一个子节点

(3)并行(Parallel):将其所有子节点都运行一遍

控制节点其实就是“控制”其子节点(子节点可以是叶节点,也可以是控制节点,所谓“执行控制节点”,就是执行其定义的控制逻辑)如何被执行,所以,我们可以扩展出很多其他的控制节点,比如循环(Loop)等,与行为节点不同的是,控制节点是与游戏无关的,因为他只负责行为树逻辑的控制,而不牵涉到任何的游戏代码。如果是作为一个行为树的库的话,其中就一定会包含定义好的控制节点库。

如果我们继续考察选择节点,会产生一个问题,如何从子节点中选择呢?选择的依据是什么呢?这里就要引入另一个概念,一般称之为前提(Precondition),每一个节点,不管是行为节点还是控制节点,都会包含一个前提的部分,如下图

前提就提供了“选择”的依据,它包含了进入,或者说选择这个节点的条件,当我们用到选择节点的时候,它就是去依次测试每一个子节点的前提,如果满足,则选择此节点。由于我们最终返回的是某个行为节点(叶节点),所以,当前行为的“总”前提就可以看成是:

当前行为节点的前提 And 父节点的前提 And 父节点的父节点的前提 And….And 根节点的前提(一般是不设,直接返回True)

行为树就是通过行为节点,控制节点,以及每个节点上的前提,把整个AI的决策逻辑描述了出来。

总结:

1、行为树拥有3种节点:

(1)根节点 Root

(2)(逻辑节点(可拓展):

            Priority Selector

            Sequence

            Parallel

   (3)行为节点

2、行为树在复杂的情况比有限状态机更清晰,更可拓展

3、行为树有利于逻辑的重用

行为树(Behavior Tree, BT)和状态机(State Machine, FSM)都是在游戏开发、自动化控制和人工智能领域中常用的两种结构化编程模型。它们各有特点,适用于不同的场景。 **行为树的优点:** 1. **模块化**:BT通过组合不同的行为节点,可以清晰地表示复杂的行为逻辑,便于理解和维护。 2. **可扩展性**:新行为可以轻松添加到树中,支持灵活的动态调整。 3. **易于理解**:对于非程序员或非专业人员,图形化的结构直观易懂。 4. **并行处理**:节点可以并发执行,提高效率。 **行为树的缺点:** 1. **复杂度**:随着树的深度和节点数量增加,设计和调试可能变得复杂。 2. **缺乏上下文**:不像状态机那样明确地表达上下文关联,有时难以处理复杂的因果关系。 **状态机的优点:** 1. **明确的状态转移**:状态机的每个状态都有明确的规则,适合描述系统在不同条件下的响应。 2. **易于理解和调试**:因为每个状态都对应一个明确的功能,状态之间的转变逻辑清晰。 3. **良好的可预测性**:状态转换遵循预定义的流程,有利于预测系统的运行结果。 **状态机的缺点:** 1. **维护成本**:当状态过多或转换条件复杂时,状态机可能会变得庞大且难以管理。 2. **难以并行执行**:除非特殊设计,状态机通常是串行的,不擅长处理并发操作。 **相关问题--:** 1. 行为树常用于哪些类型的系统? 2. 状态机在什么场景下特别有效? 3. 如何权衡使用行为树状态机
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值