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

至此已經完成了角色的動畫設置,接下來將在場景中添加一些收集物並加上動畫事件

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM