Unity中的動畫系統和Timeline(4) AvatarMask和IK動畫
阿新 • • 發佈:2018-12-16
AvatarMask(骨骼遮罩)
在前面角色動畫的基礎上,角色在奔跑過程中撿起一塊木頭,雙手要抱著這塊木頭。如果使用前面的方法,直接切換動畫,那麼就只剩下抱木頭的動畫,其它動畫就沒了。這時我們要使用下面的方法。
在這裡建立新的一層,在這個新的層上控制抱木頭的動畫。
這裡層屬性設定中,Weight表示佔有權重,Mask表示骨骼遮罩,Blending表示混合型別(Override表示重寫,Additive表示在此基礎上新增)。其中,Additive適用於,每個層控制不同部位的動畫。當混合型別為Override且權重為1時,角色的所有動畫都將是本層的。
在上面的例子中,我們需要用這一層來控制角色抱木頭的動畫,用到的只有雙手,而其它動畫和原先一樣。所以,我們需要在本層的Mask中新增一個骨骼遮罩。直接右鍵--Avator Mask可以建立
建立好後,在Humanoid中,點選各個部位,變紅表示重寫時不重寫這部分,還是用以前的動畫。這裡雙手是綠色的,表示在抱著木頭後,雙手的動畫由本層控制,其它部位的動畫還是和以前一樣。
IK動畫
在上面,我們雖然設定好了角色抱木頭的動畫,但是可能角色和木頭之間位置是不匹配的,我們需要把角色的雙手設定到木頭上的兩個位置點。這個時候就需要用到IK動畫了。首先要開啟IK Pass,會自動執行函式OnAnimatorIK,在這個函式中我們設定角色的手和位置點匹配。
private void OnAnimatorIK(int layerIndex) { // 說明當前是被Hold Log這一層呼叫 if (layerIndex == 1) { // 權重,只有在抱著木頭的時候才為1 int weight = anim.GetBool(isHoldLogID) ? 1 : 0; // 左手位置匹配 anim.SetIKPosition(AvatarIKGoal.LeftHand, leftHand.position); // 左手旋轉匹配 anim.SetIKRotation(AvatarIKGoal.LeftHand, leftHand.rotation); // 設定權重 anim.SetIKPositionWeight(AvatarIKGoal.LeftHand, weight); anim.SetIKRotationWeight(AvatarIKGoal.LeftHand, weight); anim.SetIKPosition(AvatarIKGoal.RightHand, rightHand.position); anim.SetIKRotation(AvatarIKGoal.RightHand, rightHand.rotation); anim.SetIKPositionWeight(AvatarIKGoal.RightHand, weight); anim.SetIKRotationWeight(AvatarIKGoal.RightHand, weight); } }