前言:到此為止角色已經實現了移動、跳躍、下蹲,接下來要給角色添加動畫,使角色“動”起來。
一、添加動畫
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
}
}
至此已經完成了角色的動畫設置,接下來將在場景中添加一些收集物並加上動畫事件