Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

前言:到此为止角色已经实现了移动、跳跃、下蹲,接下来要给角色添加动画,使角色“动”起来。

 

一、添加动画

1. 在Project -> Asset中创建两个文件夹 Animation -> Player。

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

2. 打开工具栏window -> Animation -> Animation,把窗口拖到你觉得方便的位置。

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

3.在Hierarchy窗口中选中Player,然后在Animation窗口点击Create创建动画,保存到刚才建立的 Animation -> Player文件夹下

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

这样Animation -> Player文件夹下会生成一个Animatior Controller(名为Player的)和 Animation(idle),同时在Player的Inspector窗口中,能看到已经挂上了Animator组件。

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

(另一种创建方式:1. 在Animation -> Player文件夹中右键创建Animator拖拽到Player的Inspector窗口  2.右键创建Animation拖拽到Player上)

 

4. 打开SunnyLand -> artwork -> sprites -> player -> idle,选中所有idle动画,在Inspector窗口把Pixels Per Unit改为16,然后选中Player,拖拽到Player的Animation窗口中。

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

 

这时,点击Animation窗口中的播放动画,就能看的角色动起来了。(可以拖动图中蓝色动画帧来调整动画播放速度)

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

 

5.通过同样的步骤,按下图添加动画选项把crouch和run文件夹中的动画添加到角色上,jump文件夹中的两个动画需要分别创建jump和fall的Animation。

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

 

完成添加,稍作调整后如下图

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

(注意到下蹲crouch部分,为了角色动作更加顺滑可以多补上一帧)

 

二、添加动画参数

1.双击Animation -> Player中的动画控制器Animator Controller(Player)会弹出Animator窗口。我们需要在Parameters栏中添加几个控制右边窗口中状态机的参数。

Float:xVelocity,yVelocity; Bool:isOnGround,isCrouch

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

 

三、使用动画参数控制动画间的切换

1. 如下图所示,在Animator窗口右边部分右键创建两个Blend Tree,分别命名为Grounded和Mir Air

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree


2.设置Blend Tree

双击Grounded打开,右键在Blend Tree添加两个Motion

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

在Blend Tree的Inspector窗口上分别挂上idle和run的动画

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

设置下图相关参数(意为横向速度xVelocity在0~1之间变化时,角色在站立和跑步动画间切换)

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

3.同理,设置Mid Air的参数如下图

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree


4. 整理状态机

因为我们在Blend Tree中以及建立idle,run以及jump和fall之间的关键,在这里可以删掉这些状态

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

右键Entry把默认状态指向Grounded

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

调整之后我们的状态机变成了下图简洁的结构

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree


5. 建立动作间的切换关系

右键Grounded,选择Make Transition指向Mir Air和Crouch(意为idle和run状态可以转为jump和fall状态)。

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

同理,创建指向Grounded的Transition。

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

6.建立动作间的切换条件

选中建立的Transition

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

在Inspector窗口中修改切换动作的条件

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

同理设置其他转换条件

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

Unity横版2D游戏学习实例(04)- 为角色添加动画&状态机&Blend Tree

 

四、添加脚本控制

通过上述步骤,我们已经建立起来角色动作间的切换,接着还需要通过脚本把键盘输入传递这些动作。

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
    }
}

至此已经完成了角色的动画设置,接下来将在场景中添加一些收集物并加上动画事件

上一篇:知识图谱:【图数据库Nebula(五)】——Nebula Importer导入数据


下一篇:资源导入中遇到的坑