技术扫盲贴)揭开游戏设计的神秘面纱------游戏怪物NPC 的人工智能分析        在游戏中,
如果只有玩家操控的角色在游戏世界里孤单的产生一系列行为, 而没有其他任何可以和玩家角色形成交互活动、产生事件的话,
玩家会觉得非常索然无味。此时如果在游戏中加入一些有一定功能和智能的人物和怪物, 使之与玩家形成各种事件的互动, 我们通常就把这些角色称为NPC(NO
people control)———游戏世界中无需玩家操控而具备智能的物体。玩家就与这些有“智能”的NPC 共同构成一个有故事有内容的游戏世界,
这样既能让玩家在游戏中了解到如同看故事书或看电影般的内容情节, 又能亲身操控角色参与到这个虚拟的世界里面。
   有了NPC 在游戏世界里, 我们就必须赋予他们足够的“思想”, 才能让他们行动起来, 形成一个有生命的世界, 通常我们将之称谓NPC AI( 即NPC
的人工智能) 。NPC 一些精彩的思想, 所做出的事件往往会让玩家得到更多惊喜的体验。所以NPC 的智能思想在游戏设定中越来越重要乃至于整个AI
系统也越来越庞大。
   下面就让我们在这篇文章里面着重分析游戏中怪物NPC 的AI 系统设定的规律和原则, 从而揭开NPC AI 的神秘面纱。
  
(据说绿色可以使人心情愉悦,好吧,我知道这样的帖子通常会让人觉得索然无味。但是作为一个游戏的爱好者,我觉得具有一定的相关知识还是必须的,毕竟这样,你可以理直气壮一些的对别人说,我爱好游戏。)

      1 怪物NPC AI 系统
      设计怪物的AI 系统需主要考虑怪物处于主动和被动状态下会做出什么样反应。在怪物处于主动状态下时, 设定一个警戒范围, 如果没有目标进入这个范围,
那么怪物会自发的进行行走, 停留等动作, 反之如果有目标进入, 怪物则会进入战斗状态准备攻击目标; 在怪物处于被动状态时, 就该考虑怪物应该被施与哪些被动动作。

      2 怪物NPC 的属性
       怪物在主动和被动状态下会做出的任何反应都需要依赖于其自身的各种属性设定, 也就是AI 系统的运作是根据其各种属性来进行判定。根据怪物NPC
当前状态下的不同属性, 驱动产生出多种行为事件。通常我们将怪物NPC 的AI 中涉及到的属性归纳为两类:
      2 .1 基本属性
       我们在AI 系统设定时考虑的第一个基本属性为怪物的种类。一个游戏中怪物种类的设定是多种的, 设定时由种类不同得到特性会有不同,
或可以说“智商”会有不同, 比如: 人形怪的AI 通常都设定非常高, 当被猎杀而打不过时会聪明地选择逃跑保命, 而动物系的怪AI 设定一般就比较低,
在一样的情况下可能会选择一味的猛攻直到死亡。第二个要考虑的基本属性是等级。原则上等级越高给其设定的AI 也会越高,
但不是绝对。第三个要考虑的属性就是怪物的性别。一般设为三种性别, 雌、雄、无性别。
       2.2 AI 相关的战斗属性
       战斗属性中的各种属性一般是由公式计算得到的具体数据值, 是AI 系统判定的重要指标。先分析战斗属性的基本属性: HP(Health
Point)属性------怪的血量值, 也称为生命值, 需要设定怪的当前血量值和最大血量值, 怪会依据血量值有不同动作, 可能继续战斗, 或呼唤同伴帮忙,
或死亡。MP(Magic Point)属性----- 怪的魔法值或法力值, 需要设定怪的当前魔法值和最大魔法值,
怪物会依据魔法值施出不同的技能或不同的攻击方式。还有物理攻击力属性, 物理防御力属性, 魔法攻击力属性,
魔法防御力属性分别代表对物理或魔法的适性。以及闪避(Dodge)属性———怪物NPC 躲避玩家角色攻击的几率, 在AI 设计中, 通常会让某些怪物NPC
具备增强闪避率的技能, 增强对玩家攻击的躲闪能力, 以至于给玩家造成足够的麻烦。而命中, 致命一击和格挡属性在AI 中应用和闪避属性类似,
不再敷述。命中(Hit)属性———怪物NPC 攻击玩家角色的命中率。致命一击(Critical)———怪物NPC 攻击中的致命一击的概率。格
挡(Block)———怪物NPC 抵挡玩家角色的概率。
      
      3 自发性动作事件
      AI 系统中, 设定自发性动作事件首先考虑怪物的生成情况。怪物的生成第一考虑的是怪物生成区域,
也就是怪物在自发性动作事件中的活动区域。需要设定一个坐标点Point=[x,y]为中心, r 为半径的圆形区域内生成某种类型怪物NPC;
其次要设定怪物生成数量, 在单位区域内某类型怪物NPC 最大生成个数; 再来是怪物生成时间间隔, 设定N 秒生成1 个怪物,
直到达到最大生成个数。最后还需设定怪物生成坐标, 某一个怪物NPC 生成的坐标位置。以及怪物活动关键点, 每两个关键点之间可任意生成行动路径,
怪物在行动路径上活动。
       生成设定好了以后, 再考虑怪物的自发性动作。包括停留, 行走, 警戒。行走, 是通过预先在一定区域内随机分布停留点,
每两个停留点之间的连线就形成了该怪物NPC 行走的路径; 停留, 是在一定区域内随机设定单位数量无重复的坐标点, 也就是怪物NPC行走的停留点; 警戒,
包括“警戒范围”的设定, 主动性攻击怪物NPC 在停留或行走过程中始终在警戒范围内进行着敌对目标的搜索行为, 一旦发现敌对目标进入该警戒范围内,
就会主动攻击目标。 

      4 反应性动作事件
      对主动攻击性怪来将, 当目标进入警戒范围内, 就会由自发性动作事件转换为反应性动作事件。开始对目标进行一系列的攻击动作。而对被动攻击性怪来说,
当目标攻击时才转换为反应性动作攻击目标。怪物的反应动作事件包括: 目标选取判定, 战斗技能使用判定, 追击判定, 逃跑判定。
      4.1 目标选取判定
       目标选取判定的关键是怪物属性之一的“仇恨值”。怪物攻击目标可以设定首先遵从仇恨值最大原则。再依次考虑当前HP( 血量) 少的对象攻击原则,
就近攻击原则, 低等级对象攻击原则, 原先仇恨值排位较高原则。
       仇恨值最大原则, 根据仇恨值计算方法得出当前怪物仇恨值列表,
怪物会选择攻击当前仇恨列表中“仇恨值”最大的目标。那么什么是仇恨值呢?是对玩家打击程度的数值累加, 其范围为正整数,
是决定该怪物的攻击对象判定的关键数据。引起一个怪物仇恨值产生有三种方式: 进入“主动攻击性”怪物的“警戒范围”, 如果玩家A
第一个主动或被动进入某个处于“和平状态”的主动攻击物的“警戒范围”内, 该怪物将会对玩家A 产生N 点“初始仇恨值”, 并进入“战斗状态”,
主动攻击玩家角色; 第二种, 该怪物被攻击, 每一次攻击怪物都会使怪物对该玩家产生新的除“初始仇恨值”以外的增量仇恨值; 第三种,
帮助攻击该怪物的对象(间接敌对)。玩家A 对怪物X 仇恨列表中存在的玩家B 使用辅助或恢复技能, 怪物X 会对玩家A
产生一定的仇恨增量。仇恨值产生以及值的变化会造成仇恨列表刷新, 也就会引起怪物仇恨值的变化, 怎么进行仇恨列表刷新呢?
需从三方面考虑,一方面怪物在每完成一次进攻后(不论成功或失败), 就会触发“仇恨列表”刷新事件, 重新从仇恨列表中选取仇恨值最高的玩家作为攻击目标;
另一方面需设定一次攻击动作事件的时间和仇恨列表固定刷新时间, 这个时间定义为N 秒, 这项设定作用在于为了防止交替出现仇恨数值变化, 如两个玩家远程攻击怪物,
使怪物仇恨交替上升造成怪物跑来跑去; 再者由玩家的特殊技能( 只改变自身的仇恨值而不造成伤害和增减益效果的技能) 造成“仇恨列表刷新”引起的时候,
怪物会立刻强制响应这个变化。
          仇恨值最大原则的另一重要设定是仇恨列表的删除。玩家A 如果处于怪物B 的仇恨列表中, 当玩家A 跑出怪物B 的追击范围后, 怪物B
会从自身的仇恨列表内将玩家A 的仇恨信息删除; 玩家A 如果处于怪物B 的仇恨列表中, 当玩家A 跑出怪物B 所在的场景地图后, 怪物B
会从自身的仇恨列表内将玩家A 的仇恨信息删除; 玩家A 如果处于怪物B 的仇恨列表中, 如果玩家A 死亡, 怪物B 会从自身的仇恨列表内将玩家A
的仇恨信息删除; 玩家A 如果处于怪物B 的仇恨列表中, 如果玩家B 因为非正常退出游戏或者直接返回人物选择界面, 那么在玩家A
的登出延迟时间结束并完全退出游戏后, 怪物B 会从自身的仇恨列表内将玩家A 的仇恨信息删除; 怪物死亡后, 怪物的仇恨列表所有内容会被清空,
不再记录玩家的仇恨值。
   4.2 战斗技能使用判定
   也就是怪物NPC 在战斗中选择怎样的攻击方式, 其判定的主要依据则和第3 节列举出来的怪物NPC 属性关联甚密。先分析怪物NPC
在和玩家角色的战斗中通常会使用的技能攻击种类有:
普通攻击、单体近战技能、群体近战技能、单体远程技能、群体远程技能、单体法术技能、群体法术技能、单体增益技能、群体增益技能、单体减益技能、群体减益技能。
      4.3 怪物NPC 追击判定
   当玩家角色离开怪物攻击范围后,怪物会选择追击。具体追击条件一般设定为两种:
   玩家角色离开怪物攻击范围; 该玩家A 在怪物仇恨列表里排第一位, 将继续追击玩家A, 达到怪物的进攻范围就实行攻击。
   4.4 怪物NPC 逃跑判定:
   4.4.1 逃跑与否判定
   据该怪物的“逃跑率”进行判定, 逃跑率越大则逃跑的可能性越高, 取值范围0.00~1.00。当HP( 血量) 值在15%-
20%之间时进行第一次逃跑判定; 如果第一次判定逃跑失败, 当前HP 值在5%-
10%之间时进行第二次逃跑判定。根据该怪物的“逃跑率”进行判定是否逃跑成功。如果超出HP 值判定范围, 出现范围溢出, 将自动失去逃跑判定机会。根据怪物NPC
的具体特性设置怪物逃跑方式:
       彻底逃跑, 根据该怪物的“逃跑率”进行判定, 逃跑率越高越易逃跑。逃跑成功后仇恨列表内容将全部清除。
       4.4.2 逃跑方向判定
       当怪物NPC 的HP 值下降到一定百分比时, 在AI 设计中往往会设计让该怪物NPC 选择逃跑,
以摆脱玩家角色的继续攻击。AI设计基本原则通常以下三点:
(1)与玩家角色当前相反的方向逃跑。
(2)逃跑范围必须满足始终不超出“怪物生成区域”。
(3)尽可能往最近同伴位置逃跑, 并且使用“呼叫”使周围同伴前来援助

技术
©2019-2020 Toolsou All rights reserved,
Map 判断key对应的value值是否存在-containsKey()SpringBoot JpaRepository 数据库增删改查迷宫的最短路径之BFS算法(python实现)vs2017,创建C++Win32窗体应用程序Vue页面跳转传递参数及接收(精华2020年6月3日更新) TypeScript中接口详解TypeScript中的数据类型这一篇就够了ajax get请求中文参数乱码解决Three.js - OrbitControls 轨道控件的围绕目标 target 参数npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! test_vue_0613@1.0.0 dev: 错误的解决方法