文章目录

  • 前言
    • AI和游戏
      • AI在Gameplay中的模块
    • 移动和寻路
      • 移动
      • 到达目的地的判断
      • 寻路
      • 世界表述
    • 决策制定
      • 行动列表(Action Lists)
      • 状态机
      • 行为树
      • GOAP
    • AI的战术和策略
      • 战术点(Waypoint Tactics)
      • 战术分析(Tactics Analyses)
      • 团队协作(Coordinated Action)

前言

继续抽空学一学公司的课程,最近可真是懒得不行。

AI和游戏

AI,人工智能,这几年很火的概念,简单来说,人工智能就是让计算机能够完成人类/动物的思维。人工智能也许比你想象的更广范,早期人工智能,称为专家系统,就是一种穷举大法,也算是人工智能。
在游戏中,我们也大量使用人工智能,人工智能运用于游戏性提升,游戏内容创作(美术),玩家数据分析。运用人工智能也会带来成本上升,以及有可能带来游玩时的不可控性。由于考虑到成本和收入不匹配,最新的机器学习以及神经网络还没有被运用到商业游戏中。

AI在Gameplay中的模块

由于不能截图,我也只能简单表达一下。

#mermaid-svg-wzHmHHuVpSnrQ2zu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-wzHmHHuVpSnrQ2zu .error-icon{fill:#552222;}#mermaid-svg-wzHmHHuVpSnrQ2zu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wzHmHHuVpSnrQ2zu .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-wzHmHHuVpSnrQ2zu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wzHmHHuVpSnrQ2zu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wzHmHHuVpSnrQ2zu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wzHmHHuVpSnrQ2zu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wzHmHHuVpSnrQ2zu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wzHmHHuVpSnrQ2zu .marker.cross{stroke:#333333;}#mermaid-svg-wzHmHHuVpSnrQ2zu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wzHmHHuVpSnrQ2zu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-wzHmHHuVpSnrQ2zu .cluster-label text{fill:#333;}#mermaid-svg-wzHmHHuVpSnrQ2zu .cluster-label span{color:#333;}#mermaid-svg-wzHmHHuVpSnrQ2zu .label text,#mermaid-svg-wzHmHHuVpSnrQ2zu span{fill:#333;color:#333;}#mermaid-svg-wzHmHHuVpSnrQ2zu .node rect,#mermaid-svg-wzHmHHuVpSnrQ2zu .node circle,#mermaid-svg-wzHmHHuVpSnrQ2zu .node ellipse,#mermaid-svg-wzHmHHuVpSnrQ2zu .node polygon,#mermaid-svg-wzHmHHuVpSnrQ2zu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wzHmHHuVpSnrQ2zu .node .label{text-align:center;}#mermaid-svg-wzHmHHuVpSnrQ2zu .node.clickable{cursor:pointer;}#mermaid-svg-wzHmHHuVpSnrQ2zu .arrowheadPath{fill:#333333;}#mermaid-svg-wzHmHHuVpSnrQ2zu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wzHmHHuVpSnrQ2zu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wzHmHHuVpSnrQ2zu .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-wzHmHHuVpSnrQ2zu .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-wzHmHHuVpSnrQ2zu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wzHmHHuVpSnrQ2zu .cluster text{fill:#333;}#mermaid-svg-wzHmHHuVpSnrQ2zu .cluster span{color:#333;}#mermaid-svg-wzHmHHuVpSnrQ2zu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wzHmHHuVpSnrQ2zu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

世界接口 AI获取游戏中的信息
集群AI 计算整个集群的策略 单个角色AI 做出决策 移动
表现动画/物理
执行管理器

移动和寻路

移动

AI移动方式可以分为:

  • 掌舵移动(Steering Behaviors):可以理解为AI拥有比较完整的控制器,我们可以像普通玩家控制游戏角色一样控制AI,只需要通过传入输入参数。这种AI移动更真实,更复杂。
  • 坐标移动(Coordinated Behaviors):Unity navmesh导航系统中,给AI一个坐标他就会自动移动到那个位置。这种基于终点坐标的移动就是坐标移动。
  • 物理模拟(Predicting Physics):就是使用物理引擎来移动AI。

到达目的地的判断

当然是使用和目的地的位置对比/碰撞检测。但是有时候AI物体的
体积太大,速度太快,或者集群AI数量太多,导致AI物体在目的地附近蠕动,对此我们往往需要做出相应调整。比如按物体大小加权的方式加大目的地检测范围,外围添加一个更大的减速圈。

寻路

寻路往往首先需要我们将场景抽象为一系列空间节点,然后根据寻路算法计算出起点到目的地的路径。游戏中最常见的最短路径算法为迪杰斯特拉/A算法,及其自定义魔改算法。
使用A
算法,当运用于大量房间的场景时,可以将每个房间看作一个节点,先找到房间到房间的路径,再在每个房间中单独寻路,能节省不少。

世界表述

前面提到运用寻路算法需要将场景抽象为一个个空间节点。我们有好几种技术去实现。

  • 网格类(Tile Graphs):先前的A*算法学习笔记中的项目使用的就是网格类,将场景抽象为一个二维/多维网格,网格中的每个节点表示场景中的一个位置。要考虑角色是否能被一个网格容纳,以及当网格空间中的一部分有障碍物时应该如何判定网格性质。
    网格类更多运用于战棋类游戏。
  • 狄利克雷域/圆锥域(Dirichlet Domains):由空间中某个高度的点向下的圆锥投影决定的一块区域,这块区域的大小,形状对于程序来说其实很好定义,但往往需要关卡策划进行实际的配置。特别适合大型网游中的AI寻路。
  • 可视点(Points of Visibility):将场景中的每个转角点看作节点,通过射线检查判断点与点之间的连接情况。这是一种很直观的世界表述法,有时对于节点我们更愿意选择一个偏移点作为实际移动目的地,因为节点完全靠墙。可视点方法的缺点是往往会生成很多无意义的连接。
  • 导航网格(Navigation Meshes):这是现在最流行的方式,导航网格有点集大成的感觉,具体方案就是将场景分割为一个个三角形/多边形,类似模型网格的感觉,然后以各个多边形的重心作为一个节点位置。通过记录上一帧物体所在位置,就可以很快得到当前帧物体在网格中的位置。和网格一样,我们需要主要划分的多边形能够容纳角色,由于导航网格是二维的,在三维空间中也需要判断上下。
    当然,导航网格实际上要更复杂一些,往往根据项目进行不同优化。

决策制定

决策指定就是定义AI的若干种行为,通过设计的算法计算当前应该执行那个行为。

行动列表(Action Lists)

行动列表通过定义你希望AI进行的若干行为,并让行为按照优先级排序。通过从高到低迭代整个行为列表找到能运行的第一个行动,执行并检查该行动是否需要阻止接下来的操作,如果需要则退出列表,否则继续执行列表中当前行为的下一个行为,直到列表执行完毕或被某个行为阻止下一步的进行。要支持AI对象的多行动同时执行,可以使用枚举将行动分类从而选择性的阻止其他行为的执行。
行动列表特别适合那种非常简单,行为设计的很死的AI对象,比如塔防游戏里的AI敌人。由于太简单,行动列表无法实现复杂的结构和变化的行为。

状态机

定义AI的有限个状态,根据条件在状态间转换。对于游戏编程,状态机非常好用且直观,应用场合也不仅仅局限于AI。状态机的缺点是由于每个状态与其它状态理论上都可以相互转换,所以设计状态机时需要考虑(n-1)^2 种转换,随着状态的增加,状态机会变得难以设计和维护。为了更好的维护,我们往往对状态机进行分层。

行为树

一个树的数据结构,和数据结构一样,有根节点。有复合节点,叶子节点,以及装饰器。节点有三个结果:成功、失败和正在执行。
复合节点定义行为树的执行逻辑,分为选择节点和序列节点,选择节点从左到右依次执行,直到执行到成功的节点就会返回成功,没有返回成功的节点就返回失败。顺序节点则相反,从左到右依次执行,直到执行到失败的节点就会返回失败,没有返回失败的节点就返回成功。叶子节点执行实际要做的行为。装饰器就是对结果进行修改,比如取反什么的。
通俗一点讲,行为树就好比一个人可以做若干件事(选择节点),这些事情有一个轻重缓急(从左到右),他会选择能够完成的最优先的事情做。一个人要做一件事情,这件事情分为若干步骤(序列节点),这些步骤中有一个步骤不能完成整件事就无法完成。比如一个NPC敌人有两个事情要做,一个是巡逻,一个是追击玩家,我们规定:巡逻是它最重要的事情,但是如果玩家出现在视野中,巡逻就无法实现(虽然有点奇怪),它会去看我是否能追击玩家,我们又规定如果玩家在视野内则可以追击,那么NPC敌人的当前行为就是追击玩家。
行为树的复用性好,但是比状态机更难理解,而且由于每一帧遍历整棵树一次,如果行为树的深度大,执行起来就比较慢,而且行为树往往要制作太多小节点。我们可以将状态机和行为树混用,比如在状态机进入某一个状态时执行一个子行为树。

GOAP

现在我们的AI有一个目标和若干行为,我们从所有行为中筛选能达成目标的一系列行为去执行,这就是GOAP。上述的行为和目标会被抽象成图,运用寻路算法(据说叫IDA*)来获取行为路径,这被称为Planner。
GOAP的决策灵活,但是稳定性欠佳,因为AI对象的行为不可预测。模拟人生就使用了这种方案。

AI的战术和策略

战术点(Waypoint Tactics)

路径点(Waypoint)就是游戏关卡中的一个位置。这个位置定义一个战术。比如LOL的草丛,AI会蹲进去埋伏。

战术分析(Tactics Analyses)

通过势力图(Influence Masp),也就是一个定义了游戏区域中的控制区域、影响区域的图,让AI分析出战术。比如有一队AI马润要抢滩登陆,我们提前做好了海岸的敌人势力图,比如机枪碉堡的位置和射击范围,敌人士兵的分布位置和巡逻路线,甚至敌方士兵的作战能力,考虑上述要素形成的势力图。AI马润就可以根据势力图以最小的代价策划进攻路径。或者LOL队友在地图的某个地方和敌人打起来了,要让AI去参团,等等。
我们还可以加入地形分析,比如在RPG游戏中,射手站在高地攻击范围更远,伤害更高,也可以影响AI的战术分析。
势力图是相当有用的,但是往往会造成更多消耗,往往需要一些优化。

团队协作(Coordinated Action)

AI往往还有考虑和团队的协调,比如简单的,一对AI要一起走到一个地方,走的快的AI等走得慢的队友跟上自己。或者RPG游戏中让战士在前排承担伤害,射手和法师在后排输出。这些都需要团队的AI算法来实现。


谈谈游戏AI的一些基础知识相关推荐

  1. 谈谈游戏动画的一些基础知识

    文章目录 前言 3D动画的分类 刚性层阶式动画 顶点动画 骨骼蒙皮动画 动画流转 动画融合(Blend) 动画状态机 万向锁 程序动画 程序动画的用处 FK(Forward Kinematics) I ...

  2. 从文本进度条开始:谈谈自己缺失的Python基础知识

    从文本进度条开始:谈谈自己缺失的Python基础知识 一.文本进度条 二.基础知识 (一)Python center()方法 (二)time.perf_counter() (三)print() 三.练 ...

  3. 前端必看 | 2D游戏化互动入门基础知识

    简介:在非游戏环境中将游戏的思维和游戏的机制进行整合运用,以引导用户互动和使用 本文作者:淘系前端团队-Eva.js作者-明非 CodeDay#7 北京站报名ing,欢迎点击免费报名. 背景 现在越来 ...

  4. 所有前端都要看的2D游戏化互动入门基础知识

    背景 现在越来越多的公司和APP开始使用游戏化的方式去做产品了,所谓游戏化,是指在非游戏环境中将游戏的思维和游戏的机制进行整合运用,以引导用户互动和使用的方法.支付宝里面的蚂蚁庄园.蚂蚁森林,通过游戏 ...

  5. 【新手基础教程】MaixPy AI 硬件加速基础知识

    MaixPy AI 硬件加速基本知识 1. 模型使用和硬件加速原理 前面我们知道了模型是一个数据机构以及很多参数, 最终以一个文件比如kmodel格式的文件的形式存在. 而这个模型要能在 MaixPy ...

  6. 游戏建模有哪些基础知识?

    文章目录 第一 :学3d建模需要美术基础,但是不代表现在就需要美术基础 第二:没有学不好的3D建模,只有不会学的人 第一 :学3d建模需要美术基础,但是不代表现在就需要美术基础 很多朋友想学3d建模, ...

  7. Android 游戏开发必备的基础知识

    Android游戏开发: View类开发框架 SurfaceView开发框架 Graphics类开发框架 Paint与Color类介绍 Canvas介绍 几何图形绘制 字符串绘制 图像的绘制 图像的旋 ...

  8. 微信小游戏开发入门(一)-基础知识

    技术简介 微信小游戏是在微信小程序的基础上添加了游戏库 API.小游戏只能运行在小程序环境中,所以小游戏既不是原生游戏,也不完全等同于 HTML5 游戏.但实际上小游戏面向的就是 HTML5 游戏开发 ...

  9. 游戏专用键盘的基础知识game-keyboard

    游戏键盘 游戏键盘要求按键段落感较强,从而产生适于游戏娱乐的特殊手感,实现玩家在游戏中的良好体验.键盘是我们生活中不可或缺的电脑外设产品之一,之前的键盘一直用来办公打字的输入设备,电脑游戏的出现键盘也 ...

最新文章

  1. 【机器翻译】transformer
  2. 【疑问】SD更新凭证流
  3. 徐教授的对于商业模式创新的讲座!十分有用!
  4. Android开发:自定义GridView/ListView数据源
  5. 尚硅谷_MySQL常见命令介绍
  6. 【机器视觉学习笔记】Harris 角点检测算法(C++)
  7. SAR成像(七):RD成像算法
  8. linux安装系统ftp服务器配置,linux系统搭建ftp服务器的配置方 - 电子发烧友网
  9. 怎么改python系统路径_动态修改python系统路径
  10. read while循环 tar脚本
  11. ubuntu-12.04.5-desktop-amd64.iso:ubuntu-12.04.5-desktop-amd64:安装Oracle11gR2
  12. linux c++开发环境_玩转 WSL 在 Win10 上打造 Linux 开发环境
  13. 如何阅读“三巨人”的源码(1)-比特币
  14. c语言算除法会把小数转成整数,在C语言中除法运算为什么没有小数部分?
  15. 联想计算机如何设置bios密码,Lenovo 消费笔记本如何设置BIOS密码
  16. 三个网络接口计算机主板,电脑主板接口安装详解
  17. 敲开脑洞(一),如何摆脱痛苦,记自己的短期修行
  18. 在三层交换机上配置Trunk并指定接口封装为802.1q
  19. TSU-求最大最小数
  20. Centos启动默认打开网络

热门文章

  1. Web开发中图片上传功能总结
  2. 计算机图形及分类的相关知识,“计算机图形学”课程教与学
  3. HLW8110在86盒上的应用
  4. 执法记录仪提示内存不足时怎么办?快速解决方法
  5. sql语句多条件筛选
  6. ubuntu 16.04 安装php扩展
  7. (C语言)八大排序之:堆排序、快速排序
  8. Grid++Report报表工具C/S实战篇(五)
  9. java里用set写自我介绍代码_【优质】java程序员自我介绍-优秀word范文 (8页)
  10. 逻辑卷、物理卷、卷组 的关系