Unity Mecanim動畫的實現(九):動畫層、遮罩與Ik動畫
阿新 • • 發佈:2019-01-24
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動畫。