1. 程式人生 > 實用技巧 >Ruby's Adventure 06 人物動畫的新增

Ruby's Adventure 06 人物動畫的新增

6.

6.1動畫幀

6.2關聯動畫

6.3新增跑動動畫

動畫幀

首先在Windows中開啟Animation介面,create new floder,建立四個方向的ruby的待機動畫godown\goup\goright\goleft

將Assets中的動畫拖入到裡面,拖動動畫幀,這裡我們複製動畫的第一幀貼上到最後一幀的後面,這樣能夠使得動畫更加自然。總長設定為0.40.

這裡因為官方資源沒有ruby向右的動畫幀,所以我們複製向左的所有幀貼上到goright中後,選擇Add Property -> Sprite Renderer -> Flip X

刪去自動新增的一幀,選擇所有幀,勾選

執行動畫,就會發現人物朝右啦!

關聯動畫

之後,我們在Animation資料夾中找到這個並開啟

選中這些元件並delete

右鍵新建Blend Tree,雙擊進入Blend Tree,開啟parameteris面板,刪去blend,點選加號,新建float型別

新建兩個float型別,命名為look x , look y .

點開混合樹,檢視面板,選擇Blend Type -> 2D FreeForm Directional

Parameters選擇look x and look y

點開 ‘+’ 選擇 Add Motion Field,新增四個,分別對應上左右下。

選中我們之前設定好的動畫,設定X & Y 數值。

這裡 0 代表無的意思,1代表向正方向(向上或向右),-1代表負方向(向下或向左),於是得到如下圖的設定:

之後開啟在ruby身上的C#指令碼,編輯加入設定的待機動畫。

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 
 5 public class PlayerContal : MonoBehaviour
 6 {
 7     public float speed = 5f;
 8 
 9     Rigidbody2D rbody;
10 11 private float _x; 12 private float _y; 13 14 private Vector2 lookDir = Vector2.down;//向量向下  ////// 15 private Vector2 currentInput; 16 private Animator _animator;    /////// 17 18 void Start() 19 { 20 rbody = GetComponent<Rigidbody2D>(); 21 _animator = GetComponent<Animator>(); ////// 22 //初始化 23 } 24 25 void Update() 26 { 27 _x = Input.GetAxis("Horizontal"); 28 _y = Input.GetAxis("Vertical"); 29 30 Vector2 movement = new Vector2(_x, _y); 31       ////////******/////// 32 //動畫部分,移動發生時,對朝向進行賦值 33 if(!Mathf.Approximately(movement.x, 0.0f) || !Mathf.Approximately(movement.y, 0.0f)) 34 { 35 lookDir.Set(movement.x, movement.y); 36 //對朝向進行歸一化,更好的控制人物 37 lookDir.Normalize(); 38 } 39 //選擇SetFloat和之間設定的浮點型進行對應 40 //lookx looky 就是之前設定的blend tree中的名稱 41 _animator.SetFloat("lookx",lookDir.x); 42 _animator.SetFloat("looky",lookDir.y); 43       ////////*******/////// 44 currentInput = movement; 45 } 46 47 private void FixedUpdate() 48 { 49 Vector2 position = rbody.position; 50 position += currentInput * speed * Time.deltaTime; 51 rbody.MovePosition(position); 52 } 53 }

加入了Animator和向量lookDirection。!Mathf.Approximately(string name, float num),是用來判斷位置移動,是將位置移動與0.0進行比較。

lookDirection.Set();是對朝向進行賦值,是將我們通過鍵盤移動的值和lookDirection關聯起來。

lookDirection.Normalize();我們只考慮方向,所以要進行歸一化,方向在0~1範圍,就不會出現奇怪的朝向。

然後將設定的lookx和looky和Animator關聯起來。增加Animator變數,並進行GetConponent初始化。

_animator.SetFloat("string", ...)(這裡是要和我們之前設定好的東西一致,SetFloat\SetBool\...)

注意_animator.SetFloat中的名稱一定要和之前設定的名稱相同,比如設定的是"look x",就不能寫成"lookx",這裡我出錯了之後將unity中的設定改為了lookx & looky

新增跑動動畫


類似於之前新增幀動畫的操作,新建後拖入幀,然後複製第一幀到最後一幀的位置。

回到我們建立的Animation資料夾下的Player的圖中,刪除新加入的runup...,新建Blend Tree,雙擊進入Tree,與上面同樣的操作,注意一定要是上左右下。如圖:

然後回到面板建立Run與Idle兩個樹之間的聯絡。

右鍵選中Make Translation

雙向指向,因為兩者同時有反饋能夠傳達給對方。接下來設定聯絡的屬性。選中由Idle到Run的箭頭,右邊面板更改屬性如下(Speed依然是在parameters中新增的):

就是說,當我的速度大於0.1時,我操作的人物的運動狀態更改為Run。

由Run到Idle的箭頭則設定為speed -> Less -> 0.1

當速度小於0.1時人物運動狀態更改為idle 。

接下來設定運動狀態的轉移時間:

因為我們希望人物能夠立刻更改運動狀態,所以將Inspector -> Has Exit Time去掉勾選 -> Setings -> Fixed Duration去掉勾選 -> Transtion Duration設為0

兩個箭頭是一樣的設定(๑ᵔ⌔ᵔ๑).

之前圖片上面的引數設定錯了不知道你有沒有發現TVT.

讓我們先去編碼吧!

_animator.SetFloat("speed", movement.magnitude);
 //magnitude(求模)是將數值變換限制在我們規定的範圍內

只加入了這一句就能夠完成我們所需要的功能了!

哈哈,但是我執行之後發現我的人物在跑動的時候只有向後和向左的動畫,這是怎麼回事呢?找了半天最後發現是這裡的問題orz

之前兩個元素都選成了lookx! orz!

可以成功運行了!還真是不容易呢!(๑ᵔ⌔ᵔ๑)