当前课程知识点:游戏程序设计 > 第十五章 《游戏人工智能》 > 15.2 人工智能在游戏中主要方法 上 > 15.2 人工智能在游戏中主要方法 上
我叫林智超
前面潘老师已经介绍过了
潘老师开了一个很好的头啊
然后接下去呢
就跟大家一起分享
人工智能
在游戏制作当中的主要的方法
左边这一部分
是传统的那个人工智能的方法
就一个决策
一个导航
右边的是棋盘游戏AI 高阶的技巧
这个待会有下一位老师来给大家分享
那我们先来看一下决策
决策呢
其实传统的有分成三种
一个是有限状态机
还有一个是行为树
还有个是GOAP
其实一般也就是上面两种会用得更加普遍一点
GOAP也有 GOAP呢
就是你是基于目标的
它不是偏规则的决策方式
是属于目标导向的决策方法
也有那么一点点的不可控
在讲之前我们先播放一个视频吧
大家玩过这个游戏吗
知道这是哪个游戏吗
这是最新的一版奥德赛
大家平时玩游戏的时候有没有去想过
那个游戏里的AI是怎么做的呢
这是一个
主角去打一个狮子的一个视频
这个是一个比较典型的一个AI
当然有很多方法可以制作这个狮子的AI
这样我前面提到一个状态机
一个行为树都可以 我待会会
分别跟大家讲
这个相关的制作方法
所以大家先欣赏一下
你可以很
可以观察下这个AI的表现
它远距离的表现跟近距离的表现是不一样的
所以在针对这种AI制作方面
它是有很
很强烈的规则上面的区分
所以是基于规则的一些AI的制作
它也是比较传统
这个游戏是卖了一千万套
制作了三年
卖了一千万套
哈
你看到近距离是会甩一个手
然后远距离会一个冲刺
我们仔细看这个
我这两句话总结
就是这个狮子的一个AI的一个大概的框架
很多四足的怪物
它们的AI就是这样结构这样来的
这是刺客信条
包括怪物猎人
还有很多其他的一些
只要四足怪
基本上都是向这一个方向
刺客信条应该已经是育碧的王牌IP了一个游戏
首先
我们来看一下用有限状态机
来分析下这个狮子的AI
那我们先看有限状态机的概念是什么
有限状态机顾名思义
就是拥有有限多个状态
然后状态之间
存在着一种转移
这样的一个数学模型叫有限状态机
那状态
代表了某个对象的某个形态
它可以是一种行为
也可以是一些属性
转移就是表明状态之间的变更
转移是通过一些条件来满足的
它有两个特性
一个是离散性
一个是有限性
离散性就是说
它首先是每个状态
每个状态之间是
每个状态是独立的
各自独立的
然后有限性是因为他状态不会无限多
那如果我们要用有限状态机来描述
前面那个狮子的AI
会是怎么样的一个情况呢
其实很一目了然啊
首先
怪物可能会在徘徊
徘徊之后呢
如果进入进程攻击的范围了
它就甩手攻击
那如果进入远程攻击范围呢
那就冲刺攻击
就这样很简单的一个模型啊
就可以表现出前面一个
怪物的AI的一个逻辑出来了
但是有限状态机真那么好用吗
用是蛮好用的
但是也有很多缺点
它会什么样子的缺点呢
但首先优点是肯定上手快速简单
计算开销小
它只要做个判断
相互转换就可以了
但是当状态过多的时候呢
因为存在一种可能性
每个状态和每个状态间都有连接的可能性
就会变得非常复杂
你看就像这样的一个状态
这样一个图就会难以维护对吧
那怎么解决这个问题呢
那我们有个分层的概念啊
就是
首先
我们把状态啊
现在有这种状态
冲刺寻敌甩手闲逛睡觉
不分层的话
就每个都有两两的一个关系要去进行分析
那如果分层了
会是什么样子呢
我们把冲刺寻敌甩手
作为一个大状态叫战斗状态
然后
休息也是一个大状态
里面可以有闲逛
睡觉
那么大状态
战斗跟休息之间的可以做一个转换
小状态呢
冲刺寻敌甩手相互做转换
那个闲逛跟睡觉之间做转换
那这样的一个分类呢
就可以把这样的一个混乱的结构呢
拆分的清楚
那这是有限状态机
来做前面那个狮子的AI的一个分析
那么还有什么别的方法呢
我们来看一下行为树
行为树呢
其实是一个
如果你们学过编程
这种你应该知道这是一棵树的结构
树的结构
首先这上面有叶子节点跟中间节点
这个就是叶子节点
这些叶子节点是
表明它的一个行为
而那些中间节点呢
就是它编译整棵树的一个逻辑
那我们一个个来分析啊
首先
每个节点都是有一个返回值
是success
Failure Running就表明这个这个节点啊
返回成功了还是失败了
还是在执行
Selector节点就是这个节点
它的编译的逻辑是什么呢
它首先是编译
下面一颗左子树
如果说
这样从左边的一棵子树如果是返回成功的话
它这里就直接返回成功了
它也不会再去继续编译下去
如果说是Sequence的话
它是怎么了
也是从左边开始
往右它的子树一个一个编译
但是它必须是全部编译成功
它才返回成功
如果当中有一个失败
它就直接返回失败
Selector如果说
左子树是返回失败了
它会继续访问右子树
如果右子树也是失败的话
那么它也是失败
那如果说右子树是成功的话
它也是成功
也就是说
Selector下面的子数有一个是成功
从左边到右边里有一个成功
那么它这个Selector也就是成功
所以
从刚才的那个狮子的AI
那我们可以去
用这一颗树的逻辑来去
进行分析 首先呢
它是进行发现玩家
如果发现玩家了呢
它就判断跟玩家的距离是近还是远
如果是近的话
那就甩手攻击远的话那就冲刺攻击
如果没有发现玩家
那就是闲逛
那么这样就是一个图的形式
来表现出整个
刚才的一个狮子的AI的结构
跟状态机还是有点区别的啊
那当然中间节点可能
不止这一个Sequence
也不只Selector
还有别的像代表循环的Until Fail
甚至是取反的
取反的一个那个中间节点Non
那你大家就可以发现行为树其实是一个
以图片形式的一个脚本逻辑
好 行为树
有什么优劣呢
首先它
逻辑结构非常清晰
就是其实你看图啊
你一看就知道
这个逻辑的规则的那个遍历
是什么样的规则
行为跟数据逻辑分离就很好做
而且它每一个那个
叶子节点作为那个
作为表现的叶子节点
它可以到处使用
而且并且是可视化的 但是呢
它的缺点在于呢
它的遍历开销特别大
它树也依然可能很复杂
然后过于抽象
因为他是一个小本形式过于抽象
那节点的颗粒度比较小
那针对这样一个劣势呢
我们怎么做
去改变这样的一个
改进行为树的一种方法
我们再来看
看这棵简单的行为树
首先
它是否看到玩家 看到玩家的话就打
如果没有看到玩家的话
看它自己是不是困了
困了的话就睡觉
如果又没看到玩家用又不困
那就是继续闲逛
就这样一个很简单的一个逻辑
我前面说过
每个节点都有返回值
是success Failure Running
我们假设
三号节点
是返回成功的话
三号节点返回成功的话
那么根据Selector的属性
因为它要判断下一个节点
所以说三号节点返回成功的话
它必然是执行四号节点
对吧
我们在看下六号节点
六号节点返回成功的话
根据Selector的属性
它必须要执行七号节点
这是根据Selector的属性来决定的
它不会跳开
去执行别的命令没有可能
所以有没有可能就是说
当前节点
返回成功
那我下一个运行的节点是不是固定的
其实每一个都可以分析出来
其实就是固定的
你看三号节点返回成功
它去执行四号节点
所以说固定时用四号
六号成功执行七号节点
那假如八号节点执行成功
那代表Selector这个执行成功
那么它遍历从头开始执行三号节点
对吧
所以说每一个节点
返回成功
后继的节点执行是固定的
那么这是一个Success的情况
那么
如果说节点执行失败是不是也是一样呢
我们来看一下
假设三号节点执行
失败了
那么根据Selector
又执行到六号线
就是说三号几点执行失败的话
是执行六号节点
然后
如果六号节点执行失败呢
那这里Sequence就执行失败了
根据Selector的属性
我要去遍历这个八号节点
六号节点失败执行八号节点
也就是说
当当前节点执行失败
它后继执行什么节点也是固定的
对吧
所以
那么整体来分析呢
也就说
我们可以得出
针对成功或者失败
能出两个序列
-1. 1什么是游戏(上)
--选择题
-1.2 什么是游戏(下)
--选择题
-1.3 游戏是如何开发出来的
-1.4 游戏引擎(上)
-1.5 游戏引擎(下)
--单选题
-1.6 如何成为一个游戏开发者
--多选题
-2.1 什么是游戏服务器
--单选题
-2.2 游戏服务器的和分类发展
--单选题
-2.3 核心技术和实现难点
--单选题
-2.4 设计原理与方法论
--单选题
-3.1 三维坐标系统
--多选题
-3.2 向量与运算
--单选题
-3.3 矩阵与线性变换
--双选题
-3.4 四元数
--3.4 四元数
--多选题
-4.1 游戏循环概述(上)
--多选题
-4.2 游戏循环概述(下)
--单选题
-4.3 《无尽之路》的实现
--单选题
-4.4 支撑游戏的功能
--选择题
-4.5 支撑游戏的机制与系统
--多选题
-5.1 基本介绍
--5.1 基本介绍
--单选题
-5.2 随机数生成器
--单选题
-5.3 随机数分布与应用
--单选题
-6.1 什么是游戏玩法开发
--单选题
-6.2 建立愿景 Vision
--单选题
-6.3 划定边界 Scope
-6.4 迭代 Iteration
--单选题
-6.5 迭代 Iteration+抛光Polish
--单选题
-7.1实时图形渲染管道 宏观渲染系统
--单选题
-7.2实时图形渲染管道 应用阶段
--单选题
-7.3实时图形渲染管道 几何阶段
--单选题
-7.4实时图形渲染管道 光栅化阶段
--单选题
-7.5实时图形渲染管道 总结 参考
-8.1 物理回顾1
--单选题
-8.2 物理回顾2
--单选题
-8.3 材质 1
--8.3 材质 1
-8.4 材质 2
--8.4 材质 2
-8.5 材质3
--8.5 材质3
-8.6局部光照
--8.6局部光照
--单选题
-8.7 全局光照
--8.7 全局光照
--单选题
-9.1 动画介绍
--9.1 动画介绍
--多选题
-9.2 游戏动画介绍
-9.3 动画技术类型
--多选题
-9.4 骨骼蒙皮动画
--多选题
-9.5 动画流水线
--多选题
-9.6 动画前沿趋势
--多选题
-10.1 .基本概念
--多选题
-10.2 设计目标
--多选题
-10.3 传输数据分析
--多选题
-10.4 常用同步方案 1
-10.4 常用同步方案 2
-10.4 常用同步方案 3
-10.4 常用同步方案 4
--多选题
-10.5 方案对比
--多选题
-11.1 基本图元
--单选题
-11.2 图元距离(上)
--单选题
-11.2 图元距离(下)
--单选题
-11.3 图元相交测试+ 其他几何方法
--单选题
-12.1 著名物理引擎介绍
--单选题
-12.2 物理引擎原理(上)
--单选题
-12.3 物理引擎原理(下)
--单选题
-12.4 游戏中的物理体
--单选题
-12.5 物理引擎使用入门
--单选题
-13.1开发语言
--13.1开发语言
--单选题
-13.2 开发环境
--单选题
-13.3 腾讯开发组件介绍
--单选题
-13.4 网络通信+业务框架介绍
--多选题
-14.1 进程间通信(上)
-14.2 进程间通信(下)
-14.3 通信格式
-14.4 并发模型
-14.5 超时处理
-14.6 大系统小做(上)
--多选题
-14.7 大系统小做(下)
-14.8 架构层面的技术支持(上)
--单选题
-14.9 架构层面的技术支持(下)
-14.10 分布系统的关键能力
--多选题
-15.1 游戏人工智能综述
-15.2 人工智能在游戏中主要方法 上
--多选题
-15.3人工智能在游戏中主要方法 (下)
-15.4 人工智能在游戏制作中的应用领域1
--多选题
-15.5 人工智能在游戏制作中的应用领域2
-15.6 人工智能在游戏制作中的应用领域3
--多选题
-15.7 人工智能在游戏运营中的应用实践(上)
-15.8 人工智能在游戏运营中的应用实践(下)
--多选题
-16.1 游戏支撑系统(1)
--单选题
-16.2 游戏支撑系统(2)
--单选题
-16.3 游戏支撑系统(3)
--单选题
-16.4 游戏支撑系统(4)
--单选题
-16.5 游戏支撑系统(5)
-17.1 游戏逻辑服务器(上)
--单选题
-17.1 游戏逻辑服务器(下)
-17.2 外挂与反外挂(上)
-17.2 外挂与反外挂(下)
--多选题
-18.1运行环境
--18.1运行环境
--多选题
-18.2物理部署
--18.2物理部署
--多选题
-18.3系统的可运维性
--多选题
-18.4运维案列分析
--多选题