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!
可以成功運行了!還真是不容易呢!(๑ᵔ⌔ᵔ๑)