1. 程式人生 > >Unity中的動畫系統和Timeline(4) AvatarMask和IK動畫

Unity中的動畫系統和Timeline(4) AvatarMask和IK動畫

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);
        }
    }