AI角色感知的信息多种多样,通常会包含视觉和听觉信息,也可能包括脚步声、死去的同伴或敌人等。其中,视线查询(Line-of-Sight)几乎是必不可少的。
在游戏中,AI角色可以通过两种方式获得游戏世界的信息–轮询和事件驱动。 轮询:通过积极地观察世界的方式来获得信息,例如如果想知道周围有没有其他角色,在代码块中查找所有AI角色,看看是否在附近 事件驱动:通过坐等消息的方式来获取信息 解决方案:触发器 (1) 当玩家射击时,一个声音触发器就被添加到场景中,这样,周围的AI角色会注意到枪声,决定是否逃避或赶来参与战斗 (2) 当玩家打倒一个护卫,护卫倒在地下时,相应的视觉触发器使得其他靠近的AI角色对尸体做出反应,决定避开这个区域或上前查看等 (3) 门的手柄可以是一个接触触发器,当玩家触碰到它时,门就会打开 (4) AI角色沿着昏暗的走廊走向某个地方,地面是对压力敏感的,这样随着AI角色的走动,触发器发出脚步声的回响 (5) 在雪地上行走的角色会留下脚印,当角色被击中而逃走时可能会留下血迹,这些都可以是视觉触发器,AI角色可以沿着脚印或血迹追逐角色
如果只考虑模拟人的感觉,那么上面提到过的触发器似乎已经够了,味觉和嗅觉在游戏中很少使用,而且也可以模拟听觉感知的方式实现。但是,游戏总还有一些其他种类的触发器。例如: (1) 时间相关的触发器。游戏角色可能会需要在6点回家,7点怪物出现几率大 (2) 来自输入接口的触发器。例如,玩家按下Esc键,会触发过场动画等 (3) 当玩家开采资源或建造单位到达一个值后触发,发生某些事情 (4) 某一个单位发生事件后触发,比如,死亡、被攻击、升级、释放一项技能、购买物品等 (5) 单位进入或离开特定区域时触发。例如进入水域时,要播放游泳动画,发生高度突变时,播放攀爬动画 (6) 指定单位的生命值在某个值以上或以下时触发,用于设定剧情
实现: 游戏常用的感知类型是视觉和听觉。对于视觉,需要配对的视觉触发器和视觉感知器;为了实现听觉,需要配对的声音触发器和声音感知器。总的来说,游戏中有多个触发器和多个感知器,可以通过一个管理中心——事件管理器,统一管理。还需要模拟人的记忆,例如,玩家为了躲避射击,躲到墙后,这时AI角色就进入巡逻状态就不合常理了。为此,感知系统还要包括一个记忆感知器。
视觉感知:用视锥体来模拟视觉,视觉的另外一个特性是它不能穿过障碍物,因此在眼睛与能看到的物体之间,不能有障碍物的遮挡。需要进行视线测试(LOS),才能确定最终的结果,有时亮度也会影响到可视性。 为了降低感知的开销,可以采用Level-Of-Detail(LOD)逻辑,当AI角色距离玩家很远时,可以减少感知检测。毕竟大部分最重要的行为都是发生在玩家附近的。 Unity中实现:将感知器和触发器注册到管理器中,感知器如何发现触发器:在触发器中加入,如果这个这个触发器和感知器的类型能对应上,并且在视线范围内且两者之间没有障碍物(射线检测),如果能看到则触发器通知感知器,感知器在做相应的策略
听觉感知:用一个球形区域模拟。另一种方法是当声音被创建时,为它加上一个强度属性,随着传播距离的增加,声音强度会衰减,而每个AI角色也有自己的听觉阙值,如果声音小于这个阙值,AI角色就听不到这个声音 听觉的特殊之处它会很快消失。它的存在会持续一定时间,然后自行消失。例如,枪声持续两秒消失 例如:当武器开火时,在开火的位置创建一个声音触发器,它的半径可以设置为与武器的声音大小成正比。此时,在一定范围内,且具有声音感知器的感知体就能够“听到”这个声音,并做出反应。
触觉:通过Unity自带的触发检测
记忆感知 定义一个记忆列表,列表中保存了每个最近感知到的对象、感知类型、最后感知到改对象的时间以及还能在记忆中保留的时间,当有一段时间没有感知到这个对象,,这个时间超出了记忆时长,就会将这个对象从记忆列表中删除。
|