前言:到此为止角色已经实现了移动、跳跃、下蹲,接下来要给角色添加动画,使角色“动”起来。
一、添加动画
1. 在Project -> Asset中创建两个文件夹 Animation -> Player。
2. 打开工具栏window -> Animation -> Animation,把窗口拖到你觉得方便的位置。
3.在Hierarchy窗口中选中Player,然后在Animation窗口点击Create创建动画,保存到刚才建立的 Animation -> Player文件夹下
这样Animation -> Player文件夹下会生成一个Animatior Controller(名为Player的)和 Animation(idle),同时在Player的Inspector窗口中,能看到已经挂上了Animator组件。
(另一种创建方式:1. 在Animation -> Player文件夹中右键创建Animator拖拽到Player的Inspector窗口 2.右键创建Animation拖拽到Player上)
4. 打开SunnyLand -> artwork -> sprites -> player -> idle,选中所有idle动画,在Inspector窗口把Pixels Per Unit改为16,然后选中Player,拖拽到Player的Animation窗口中。
这时,点击Animation窗口中的播放动画,就能看的角色动起来了。(可以拖动图中蓝色动画帧来调整动画播放速度)
5.通过同样的步骤,按下图添加动画选项把crouch和run文件夹中的动画添加到角色上,jump文件夹中的两个动画需要分别创建jump和fall的Animation。
完成添加,稍作调整后如下图
(注意到下蹲crouch部分,为了角色动作更加顺滑可以多补上一帧)
二、添加动画参数
1.双击Animation -> Player中的动画控制器Animator Controller(Player)会弹出Animator窗口。我们需要在Parameters栏中添加几个控制右边窗口中状态机的参数。
Float:xVelocity,yVelocity; Bool:isOnGround,isCrouch
三、使用动画参数控制动画间的切换
1. 如下图所示,在Animator窗口右边部分右键创建两个Blend Tree,分别命名为Grounded和Mir Air
2.设置Blend Tree
双击Grounded打开,右键在Blend Tree添加两个Motion
在Blend Tree的Inspector窗口上分别挂上idle和run的动画
设置下图相关参数(意为横向速度xVelocity在0~1之间变化时,角色在站立和跑步动画间切换)
3.同理,设置Mid Air的参数如下图
4. 整理状态机
因为我们在Blend Tree中以及建立idle,run以及jump和fall之间的关键,在这里可以删掉这些状态
右键Entry把默认状态指向Grounded
调整之后我们的状态机变成了下图简洁的结构
5. 建立动作间的切换关系
右键Grounded,选择Make Transition指向Mir Air和Crouch(意为idle和run状态可以转为jump和fall状态)。
同理,创建指向Grounded的Transition。
6.建立动作间的切换条件
选中建立的Transition
在Inspector窗口中修改切换动作的条件
同理设置其他转换条件
四、添加脚本控制
通过上述步骤,我们已经建立起来角色动作间的切换,接着还需要通过脚本把键盘输入传递这些动作。
1.对(03)笔记中PlayControl脚本进行优化并添加一些状态
using UnityEngine; public class PlayerControl : MonoBehaviour { public bool isOnGround; //修改private->public public bool isCoruchHeld;//添加 判断是否在下蹲状态变量 } void Update() { //保持原逻辑 //按下下蹲键 S (添加判断下蹲逻辑) if (Input.GetButtonDown(Key_Crouch) && isOnGround) { isCoruchHeld = true; } } private void MidAirMovement() { if (isJumpPressed && isOnGround) { isJumpPressed = false; if (!isCoruchHeld)//添加判断:!isCoruchHeld,下蹲时不能跳跃 player_Rbody.AddForce(new Vector2(0, jumpForce), ForceMode2D.Impulse);//对角色刚体添加纵向的力 } } private void Crouch() { if (!isOnGround) return; if (isCrouch) { //保持原逻辑 } else if (!isHeadBlocked) { //保持原逻辑 //解除下蹲状态 (添加部分:站起来时才算解除下蹲状态) isCoruchHeld = false; } }
2.在Scripts->Player文件夹下创建一个C#脚本,命名为PlayerAnimation
using UnityEngine; public class PlayerAnimation : MonoBehaviour { Animator anim; //动画器 PlayerControl playerControl;//角色控制脚本 Rigidbody2D player_Rbody;//角色刚体 //动画器中设置的参数的id int isOnGroundID; int isCrouchID; int xVelocityID; int yVelocityID; void Start() { anim = GetComponent<Animator>(); playerControl = GetComponent<PlayerControl>(); player_Rbody = GetComponent<Rigidbody2D>(); //注意:StringToHash中的参数要和Animator中设置Parameters一致 isOnGroundID = Animator.StringToHash("isOnGround"); isCrouchID = Animator.StringToHash("isCrouch"); xVelocityID = Animator.StringToHash("xVelocity"); yVelocityID = Animator.StringToHash("yVelocity"); } void Update() { //通过playerControl中的输入控制Animator中的参数,达到控制角色动作切换 anim.SetBool(isOnGroundID, playerControl.isOnGround);//切换到Mid Air的条件 anim.SetBool(isCrouchID, playerControl.isCoruchHeld);//切换下蹲条件 anim.SetFloat(xVelocityID, Mathf.Abs(player_Rbody.velocity.x));//横向速度,idle和run anim.SetFloat(yVelocityID, player_Rbody.velocity.y);//纵向速度,jump和fall } }
至此已经完成了角色的动画设置,接下来将在场景中添加一些收集物并加上动画事件