下坠死亡判定的准备
设置下坠死亡判定区域
类似于Day08 修补前5天的内容(3) 中“地面接触检查”,我们可以创建一个空对象并为它设置触发器模式的碰撞器,将其设置在整个场景下方一定深度的位置(宽度最好离场景边缘再给出一点富余,如下图所示),当人物下坠与整个对象产生碰撞时,判定人物死亡。

小知识:在编辑碰撞区域时,按住Alt键再拖动控制点可以让碰撞区域对称修改(中心保持不变,往左边拖动一定距离,右边也会增加同样的距离;上下同理)。
添加后,类似于在Day08 修补前5天的内容(3) 中给地面添加标签的步骤,我们需要为其添加一个特定的标签(这里称为DeadFall)以便在脚本值使用。
修改Switch on string节点
选择在Day08 修补前5天的内容(3) 中创建的地面接触检查空对象,编辑它的可视化脚本。类似于之前的地面接触检查,在“Switch on string”节点中添加一个值为“DeadFall”(一定要与之前设置的标签保持一致)的Option。

自定义事件
为了方便绘图还有脚本的重用(有可能以后别情况下也会触发死亡逻辑),我们可以自定义一个死亡事件,然后在角色触碰下坠死亡判定区域时触发这个死亡事件。在可视化脚本窗口中右键,点击Events → Trigger Custom Event即可触发自定义事件,下方的Custom Event则可以新建一个类似于Update这样的事件节点,但触发则是由Trigger Custom Event节点来完成。

这里我们在之前的地面接触检查对象中先设置好Trigger Custom Event节点,会触发一个Dead事件(事件名字可以自定义),这个事件应该在Player(地面接触检查对象的父节点)中来编写逻辑,所以我们把执行的对象定为父对象(如下图所示)。稍后我们再来处理这个事件的逻辑编写。

状态机组件
之前我们为Player创建的第一个脚本已经包含了许多人物动作的行为逻辑,例如跳跃、奔跑、朝向更改等。但是后续Player会有更多的行为会和人物的状态有关,例如“下坠”到一定程度时会死亡,“空中”才能执行的特定操作、“爬梯子”时只能上下爬不能左右移动等等。我们需要用专门的脚本来管理这些状态,就是这里所说的State Machine(状态机)。
添加状态机组件
类似于添加Script Machine的方法,我们可以为Player添加一个名为State Machine的组件,并为其新建一个可视化脚本。

最好也为State Machine专门建立一个文件夹来管理相关的脚本。
删除Start节点、导入之前的逻辑并删除对应Script Machine组件
默认情况下State Machine脚本会有一个Start节点用来表示初始默认状态下的逻辑,由于我们之前实际上已经编写好了跳跃、奔跑、朝向更改逻辑作为初始默认状态的逻辑,所以这里我们不需要使用这个节点,将其删除。

接下来我们将之前编写的跳跃、奔跑、朝向更改逻辑所在的那个脚本文件从Project窗口拖拽到State Machine脚本中(这里我将其重新命名为Player Movement,Script的Title也作了修改):

为了将这个Player Movement代替Start节点的功能,我们需要在这个节点上右键选择Toggle Start(切换为Start节点):

这样就设定好了初始状态。在State Machine脚本中,后续通过上图中的Make Transition(创建状态转移)就可以方便的切换到其他的状态逻辑。
添加到State Machine脚本中的脚本就可以在Player中删除对应的Script Machine组件了。这些脚本现在由State Machine组件来挂载到游戏中。
死亡事件的逻辑编写
我们希望角色触发死亡事件时,会播放死亡动画,在原地弹跳一下再掉出场景,然后等待片刻重置场景。接下来我们来编写这些逻辑。
挂载死亡事件处理脚本
我们在Project窗口中新建一个Script Graph脚本作为我们编写处理死亡事件逻辑的文件,并在其中添加之前我们提到的Custom Event节点,事件名称设置为Dead(一定要和Trigger Custom Event中的事件名称一致)。

接下来将这个脚本文件从Project窗口拖入State Machine脚本中,并类似之前的Player Movement脚本将其切换为Start节点来默认开启这个脚本的功能。

添加死亡动画
类似Day05 角色的跳跃逻辑&动画效果中添加奔跑动画的方法,我们可以为其添加死亡动画,使用素材包中名为“hurt”的动画素材:

在Animator窗口中,我们将这个动画状态的转移条件、参数设置为如下状态:

由于任何情况下都有可能触发死亡,我们希望从任何状态都可能转换到死亡动画,在第1步中从Any State节点建立状态转移到我们的死亡动画,而转移到死亡动画后自然就不会再回到其他状态了,也就不需要设置其他的转移条件。2~3步之前介绍过了,这里不再赘述。第4步取消Can Transition To Self(允许自己过渡到自己)实际上是取消了动画的循环播放。
添加表示角色死亡状态的对象变量
选择Player对象,然后在窗口中的Variables组件中添加如下变量,以便后续我们在脚本中使用。

注:其实很多地方都可以添加对象变量,如和对象绑定好的Script Machine脚本中的Blackboard窗口。
触发死亡动画
双击State Machine脚本中导入的Script Graph脚本节点即可跳转到该节点来编辑,再点击下图中的位置即可回到State Machine脚本中。

Player Dead脚本可以设置为下图所示的逻辑来切换死亡状态。

然后在我们之前的挂载在Player对象上的Player Animation Controller脚本中添加如下逻辑:

这样就可以正确触发死亡动画了。
实现弹跳效果
为了让角色在触碰到下坠死亡区域时弹跳一下,我们需要将下坠死亡区域对象的碰撞器还原为非Trigger模式,让物理引擎实现碰撞物理效果:

然后,在Player的Player Dead脚本中添加如下逻辑:

第一步是将Player自己的碰撞体关闭,让人物在弹跳后可以顺利掉出场景而不会被下坠死亡区域对象阻挡;第二步是为人物添加一个向上的力来实现这个弹跳效果。
修BUG:反复弹掉
在上面的逻辑下试玩游戏会发现,人物会下坠死亡弹起,然后落下的时候又触发弹起,反复几次后下落。
这是因为地面检查碰撞体在每次碰到下坠死亡区域对象时总会触发死亡事件,从而Player Dead脚本中的逻辑被反复执行。
我们希望这个弹跳效果只触发一次,所以需要在触发死亡动画时将地面检查碰撞体关闭。
选择Player对象,在Animation窗口中选择死亡动画剪辑:

然后点击Add Property(添加属性),选择地面检查对象 → Is Active(激活状态):

然后将其激活状态关闭:

这节内容太多了,明天继续写相机停止跟随的部分……
本文详细介绍了如何在Unity中设置下坠死亡判定区域,自定义死亡事件,应用状态机管理角色行为,并实现死亡动画和弹跳效果。涉及的技术包括碰撞器设置、脚本切换、动画触发和StateMachine的运用。
35万+

被折叠的 条评论
为什么被折叠?



