IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 行为树游戏AI设计 -> 正文阅读

[游戏开发]行为树游戏AI设计

前言

上一篇写的状态机(FSM)(http://t.csdn.cn/DPYUb)有一定的局限性,当我们敌人有多种行为逻辑时,像还是拿我寒假沉迷刷刷刷的无主之地3中,普通的机械警察等拿枪的小怪都不止冲向玩家和攻击玩家两种状态,有很多种状态,比如躲避在障碍物后,近战反击,格挡,回复......等等。更别说boos的状态模式了,那么这些状态间该如何进行切换,如果敌人总共有N个状态,两个状态间都需要进行相互切换,那我们岂不是要考虑(N-1)^2次,那岂不是寄了。所以我们需要一个新的方法,那我们可以介绍一下新伙伴 行为树。

在介绍行为树是什么之前,先吐槽一下不同游戏引擎之间像虚幻引擎(UE)中有免费提供给开发者图形化的行为树建立和编写方法,可以直接用现有的框架,但我最爱的Unity引擎却没有免费的图形化行为树提供给开发者,要使用的话只能在Unity Asset Store中花85美刀购买Behavior Designer才能使用,但作为一个学生党确实是钱包扁扁有心无力。

行为树(Behavior Tree)

首先我们按照传统,那无主之地怪物的AI进行模拟就拿机械警察进行模拟它的行为模式大致如下:

1.当玩家进入攻击范围内会向玩家进行射击,脱出攻击范围在追击范围内进行追击。

2.当血量生命值低于一定值时会在周围环境中寻找掩蔽物进行掩蔽和攻击。

3.当环境内没有掩蔽物时会继续向玩家射击或追击。

我们试着将以上的行为状态抽象为一棵树试试,我们从上至下从左到右理一下思路。

?我们先从定点出发,先会进入Cover节点,然后通过Health Node判断敌人当前的血量,当他的血量低于一定值时就会进入Want Find Node节点,之后通过Is Cover Node进行判断是否已经进行隐蔽,若未隐蔽则进入Find Cover 之后进入Go To Cover Node 进行隐蔽,若无障碍物隐蔽则进入范围判定Take Range 看接下来是直接进行攻击还是追击玩家。拌着我这份图,也许大概能懂一丢丢行为树的思路,当然思路不唯一,我的可能还很烂,欢迎指正!!?

接下来我们来总结一下,什么是行为树

1.行为树的执行顺序是从上到下,从左到右的遍历节点。

2.行为树的除头结点外每个节点都会返回一个情况,我通常设为(True,False,Running)三种,分别代表成功,失败,与正在运转。

3.树的节点分为叶子节点和复合节点(Composite),我就不过多解释了。

不难看出行为树的每一个节点都会返回一个执行情况,就是刚刚所谓的三种情况,像对于 Go To Cover Node它是控制敌人移动向掩蔽物,当它返回True表明已经掩蔽成功,返回Running时表示正在掩蔽途中。有了这种思想我们就可以做出千变万化的复合节点了。

1.selector节点 :它的原则是,其只要有一个子节点返回True时,它就会返回True,大家也能看出来它的作用就是选择,选择其一子节点进行执行。

2.sequence节点:它的原则是,其所有子节点都返回True时,它才会返回True,若他有一个子节点返回False时就会返回False,大家也能看出来它的作用就是要序列的执行每个节点。

除这两种节点外还有很多种节点,比如Repeater(重复执行子节点)等等节点有兴趣可以自行了解,在此我们就不多做介绍,因为以上两种在例子中已经够用了。

代码框架实现

与上一篇不同我们就不具体写功能的实现,而是介绍一下,一个简单地行为树框架如何搭建。

节点基类:Node

public abstract class Node
{
    protected NodeState nodeState;
    public NodeState NodeState{get=>nodeState};
    public abstract NodeState Evaluate();
}
public enum NodeState
{
    True,
    False,
    Running
}

作为所有节点的基类,其实也没太难。?

复合节点基类:Composite Node

public abstract class CompsiteNode : Node
{
    protected List<Node> nodes =new List<Node>();
    public CompsiteNode(List<Node> nodes)
    {
        this.nodes=nodes;
    }
}

修饰节点基类:DecoratorNode?

public abstract class DecoratorNode : Node
{
    protected Node node;
    public DecoratorNode(Node node)
    {
        this.node=node;
    }
}

随便乱说环节

其实比起行为树,我还是更喜欢状态机一些,行为树更适合团队之间使用(大概,还是欢迎指正),作为一个即将入坑的小白独立游戏开发者我还是更倾向于使用状态机,把每一层剥离出来设计,也不给别人看嘛毕竟。以上就是我理解的最简单的行为树AI设计,希望对您能有所帮助和启发。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-02-24 15:38:55  更:2022-02-24 15:40:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 16:41:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码