1. 程式人生 > >Unity Mecanim動畫的實現(九):動畫層、遮罩與Ik動畫

Unity Mecanim動畫的實現(九):動畫層、遮罩與Ik動畫

1.動畫層

        (1)新建動畫層
這裡寫圖片描述
可以通過
        (2)動畫層的屬性。
這裡寫圖片描述
        

  • Weight代表某個動畫層的權重,權重為0,該層動畫不對模型產生影響,權重為1時,將產生最大影響。
  • Mask:動畫遮罩
  • Blending,該層動畫與其他層動畫的混合方式,包括Override(複寫方式,即取不同層動畫的中間值)和additive(直接疊加)。
  • Sync,同步。同步是本層動畫直接同步其他層動畫狀態之間的邏輯狀態,一般需要選取同步源。同步之後需要給本層的動畫狀態新增動畫剪輯。
  • IK Pass即本層動畫是否支援IK動畫。
            

2.遮罩

        遮罩表示遮住某個部位的動畫,即被遮著的部位將不會在本動畫剪輯中運動。遮罩可以在兩個地方進行設定:
- 在Animation動畫剪輯中的Mask,下圖紅色的右臂將在本剪輯中將不再運動。。
這裡寫圖片描述


- 在動畫層中,將Mask啟用,並新增Avatar Mask資源(在Asset中新增即可),通過在Avatar Mask中設定紅色部分,也可以新增遮罩,在動畫圖層新增的遮罩隻影響本層的所有動畫狀態。

3.IK動畫(可用於製作人物爬鐵塔、樓梯的動畫?)

        一般的人物動畫是由根骨骼帶動下級骨骼運動,比如大手臂帶動小手臂運動,然後帶動手指運動。但是有時候,會反過來,比如取一件東西,一般是手指頭先動,最後帶動身體運動。這是需要用到IK動畫。製作IK動畫需要現在動畫層中啟用IK Pass。IK動畫在指令碼中實現控制。比如我們需要右手取東西,可以通過如下程式碼實現:

using UnityEngine;
using
System.Collections; public class IKBehaviourScript : MonoBehaviour { public Transform HandPoint;//需要抓取的地點 public bool isIK; private Animator _animator; // Use this for initialization void Start () { _animator=GetComponent<Animator>(); } // Update is called once per frame
void OnAnimatorIK () {//IK動畫必須在這個函式裡面呼叫,這個動畫也是和Update類似 if(isIK){ _animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1f);//啟動右手Position的IK動畫,如果權重為0則為不啟用。 _animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1f);//啟動右手Rotation的IK動畫,如果權重為0則為不啟用。 _animator.SetIKPosition(AvatarIKGoal.RightHand,HandPoint.position);//改變右手位置抓取物體; _animator.SetIKRotation(AvatarIKGoal.RightHand,HandPoint.rotation);//改變右手旋轉抓取物體; }else{ _animator.SetIKPositionWeight(AvatarIKGoal.RightHand,0f);//啟動右手Position的IK動畫,如果權重為0則為不啟用。 _animator.SetIKRotationWeight(AvatarIKGoal.RightHand,0f);//啟動右手Rotation的IK動畫,如果權重為0則為不啟用。 } } }

        可以做IK動畫一般包括左右手和腳,通過SetIKPositionWeight、SetIKRotationWeight與AvatarIKGoal來進行編輯;同時還可以通過SetLookAtWeight和SetLookAt來實現頭部的IK動畫。