Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree
前言:到此为止角色已经实现了移动、跳跃、下蹲,接下来要给角色添加动画,使角色“动”起来。
一、添加动画
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
}
}
至此已经完成了角色的动画设置,接下来将在场景中添加一些收集物并加上动画事件
本文来自博客园,作者:rkmao,转载请注明原文链接:https://www.cnblogs.com/rkmao/p/15725693.html