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

猜你喜欢

转载自blog.csdn.net/qq_40338728/article/details/83215540