《土豆荣耀》重构笔记(八)给角色添加动画
前言
  为了提高玩家的游戏体验,我们常常需要在角色运动的时候,根据它的运动状态播放对应的动画。为了能够控制当前播放什么动画,我们首先需要制作动画状态机,再用代码去控制动画状态机切换当前的状态,从而切换当前播放的动画。
制作角色的动画状态机
  我们在给角色制作动画状态机来控制我们之前制作好的角色动画之前,我们需要确定我们有哪些状态,以及控制这些状态转移的条件是什么。
各个角色动画之间的状态转换规则如下:
- 当角色不
着地时,不播放任何状态 - 角色
着地时播放Idle播放动画 - 当角色
着地且水平移动时,播放Walk动画 - 当角色触发
跳跃事件时,播放Jump动画 - Jump动画播放完之后,
着地播放Idle动画 - 当角色触发
射击事件时,播放Shoot动画 - Shoot动画播放完之后,
着地播放Idle动画 - 当角色触发
死亡事件时,播放Death动画 - Death动画播放完之后,自动播放Falling动画
  根据状态转换规则,我们可以得出控制状态转换的所有参数
状态转换参数:
- Grounded:Bool
- Speed:Float
- Jump:Trigger
- Death:Trigger
- Shoot:Trigger
  接着,我们在Unity顶部菜单栏选中Window->Animator打开动画状态机编辑窗口,然后在Hierarchy窗口中选中Player编辑角色的动画状态机。在Unity中,一个状态控制一个动画。根据上面状态转换规则,我们还需要创建一个没有任何动画的空状态,并将其作为整个状态机的默认状态。我们在Animator窗口中点击鼠标右键选择Empty创建一个空状态,将其命名为Empty之后,点击鼠标右键编辑这个状态,然后选择Set as Layer Default State将其设置为默认状态。最后,我们根据上面得到的控制状态转换的所有参数来创建状态转换参数,并构建角色的动画状态机如下:

  创建完动画状态机之后,我们为状态之间的转移边设置条件。点击状态之间的转移边,然后在右侧的Inspector面板进行设置。

每条转移边的具体设置如下:
- Empty -> Idle:
- Has Exit Time:
false - Interruption Source”:
Next State - Conditions:
Grounded(true)
- Has Exit Time:
- Idle -> Empty:
- Has Exit Time:
false - Conditions:
Grounded(false)
- Has Exit Time:
- Idle -> Walk:
- Has Exit Time:
false - Conditions:
Speed(Greater 0.1)
- Has Exit Time:
- Walk -> Idle:
- Has Exit Time:
false - Interruption Source”:
Next State - Conditions:
Speed(Less 0.1)
- Has Exit Time:
- Walk -> Empty:
- Has Exit Time:
false - Conditions:
Grounded(false)
- Has Exit Time:
- AnyState -> Jump:
- Has Exit Time:
false - Can Transition To Self:
false - Conditions:
Jump(Trigger)
- Has Exit Time:
- Jump -> Empty:
- Has Exit Time:
true - Interruption Source”:
Next State - Conditions: List is Empty
- Has Exit Time:
- AnyState -> Shoot:
- Has Exit Time:
false - Can Transition To Self:
True - Conditions:
Shoot(Trigger)
- Has Exit Time:
- Shoot -> Empty:
- Has Exit Time:
true - Interruption Source”:
Current State then Next State - Conditions: List is Empty
- Has Exit Time:
- AnyState -> Death:
- Has Exit Time:
false - Can Transition To Self:
false - Conditions:
Death(Trigger)
- Has Exit Time:
- Death -> Falling:
- Has Exit Time:
true - Conditions: List is Empty
- Has Exit Time:
加入控制代码
  角色的动画状态机编辑完成之后,我们还需要使用代码来控制动画状态机的状态转移。打开PlayerController.cs,插入动画控制代码:
1 | |
修改动画和状态设置
  点击运行游戏,可以看到角色已经有了动画。但是,我们发现角色跳跃的时候,一直在重复播放Jump动画。这是因为我们在制作动画的时候,为了便于预览,Unity默认将我们的动画设置为循环动画。我们需要修改一下Jump、Shoot和Death这三个动画的动画设置。打开Assets\Animation\Player,分别选中这三个动画,然后取消Loop Time的勾选。

  此外,为了让优化动画效果,我们还可以在Animator设置各个状态的动画播放速度。这里,我们将Jump和Shoot这两个状态的Speed分别设置为2.5和4。

  修改完成之后,再次运行游戏,可以看到Jump动画的播放速度变快了。
后言
  至此,我们已经制作好了角色的动画状态机,并使用代码控制Idle、Walk和Jump这三个动画的切换,剩下的动画控制将在后面提到。最后,本篇文章所做的修改,可以在PotatoGloryTutorial这个仓库的essay6分支下看到,读者可以clone这个仓库到本地进行查看。