欢迎大家继续学习《Unity 游戏编程进阶 本节我们具体讲解僵尸AI
的实现方法 本节将
采用PPT讲解+项目演示的方式介绍僵尸AI 的相关知识要点
在项目演示环节,我们演示了僵尸AI 在《慕课英雄 2》的具体应用
希望大家可以根据自己的专业基础和学习能力 从以下几种方法中选择一种来学习。
第一种方法,先看 PPT 讲解 对相关知识有一个系统的了解,然后观看项目演示视频,学习知识点的应用
第二种方法,先看项目演示视频,了解知识要点的具体应用
再回到PPT讲解阶段,有针对性地学习知识要点 第三种方法,跳过PPT讲解,直接进入项目演示
通过理解项目中知识要点的运用,完成相关知识要点的学习 不需要回顾PPT讲解。
下面进入PPT讲解阶段 Chase
追踪状态下,僵尸持续向玩家所在的位置移动
如果僵尸和玩家的距离小于僵尸的攻击距离 僵尸会进入攻击状态。
如果僵尸在追踪状态下 丢失了玩家,比如玩家死亡,或者玩家脱离了僵尸的感知范围
僵尸会进入随机游荡状态 在
Chase 追踪状态处理函数 UpdateChaseState
中 我们使用 zombieSensor 脚本的 getNearbyPlayer
函数获取僵尸的感知结果 如果僵尸的感知范围内没有玩家,僵尸会进入随机游荡状态
如果僵尸的感知范围内有玩家,我们使用 Vector3.Distance
函数计算僵尸和玩家之间的距离 如果该距离小于僵尸的攻击距离,僵尸会进入攻击状态
如果僵尸和玩家之间的距离大于僵尸的攻击距离 我们把玩家对象的
Position 属性复制给僵尸导航代理组件的 Detination
属性 使僵尸继续追踪玩家
Attack 攻击状态下,僵尸会攻击玩家
如果僵尸在攻击状态下丢失了玩家,比如玩家死亡 或者玩家脱离了僵尸的感知范围,僵尸进入随机游荡状态
僵尸在攻击状态下,如果玩家脱离了僵尸的攻击范围 但未脱离僵尸的感知范围,僵尸进入追踪状态
在 Attack 攻击状态处理函数
UpdateAttackState 中,我们使用 ZombieSensor.getNearbyPlayer
函数获取僵尸的感知结果 如果僵尸的感知范围内没有玩家,僵尸会进入随机游荡状态
如果僵尸的感知范围内有玩家,我们使用 Vector3.Distance
函数 计算玩家与僵尸之间的距离,如果该距离超过了僵尸的攻击距离
僵尸会进入追踪状态
如果僵尸和玩家的距离小于僵尸的攻击距离,那么僵尸会保持攻击状态
僵尸仅能攻击它正前方一定范围内的玩家 不能攻击它侧面和身后的玩家。
我们用一个圆锥体来模拟僵尸的可以攻击的范围 计算出僵尸所在的位置到玩家所在位置的向量
direction 然后使用 Vector3.angle 函数计算 direction
向量和僵尸的 forward 向量之间的夹角 如果该夹角小于僵尸的攻击范围角,说明玩家位于僵尸的攻击范围内
僵尸发动攻击,否则我们使用 Rotate
函数 让僵尸转向玩家,继续攻击
[空白_音频] 僵尸处于随机游荡、 搜索、
追踪或者攻击状态 一旦生命值为 0,会进入死亡状态
[空白_音频] 我们在 FSMUpdate
函数中判断僵尸的当前状态 如果僵尸的当前状态 currentState
不是死亡状态 Dead 但僵尸的生命值为 0,我们把 currentState 字段设置为
FSMState.Dead,使僵尸进入死亡状态 僵尸首次进入死亡状态
我们禁用僵尸的导航代理组件和碰撞体组件,使僵尸的位置和朝向 不再受这两个组件的影响。
把 animator 动画组件的 applyRootMotion 设置为 true 激活动画组件的
Trigger 参数 toDie 使动画组件播放僵尸倒地效果。
接着 我们把僵尸的消失时间计时器 disappearTimer 清零
开始统计僵尸的死亡时间 在
Dead 死亡状态下,如果僵尸的死亡时间超过了脚本预设的尸体消失时间
我们调用僵尸对象的 SetActive 函数,禁用僵尸对象 我们把编写好的
Zombie AI 脚本添加到僵尸对象
Zombie AI 脚本的属性包括僵尸的游荡速度、 奔跑速度、
追踪距离 选择随机游荡目的地时的范围,以及死亡后尸体的停留时间等
Zombie AI 脚本还包括僵尸攻击相关的属性
包括僵尸的攻击距离、 攻击范围夹角、 最小攻击间隔、
攻击力和攻击音效等 Zombie AI 脚本的 Current State 和 Current Speed
函数 分别表示僵尸的状态机和当前移动速度 这两个属性方便我们调试
Zombie AI 的脚本 [空白_音频]
下一节我们介绍 Inverse kinematic 逆向动力学
接下来是演示环节 我们为僵尸添加
ZombieHealth 生命值管理脚本 ZombieSensor 感知脚本和
Zombie AI 脚本,制作出智能僵尸 在场景中摆放若干智能僵尸,使用第一人称视角
验证僵尸AI 的正确性