Unity简单的IK使用-持枪武器绑定
参考:https://www.bilibili.com/video/BV1zS4y1b7oK
引入资源
-
导入资源渲染管线不兼容:
找到材质资源,修改shader类型为当前渲染管线类型(选中材质后Inspector名字下方就是),例如URP Simple lit,并且重新将材质应用于资源上 -
资源引入大小修改:
模型在场景中调制相应大小后,记录scale数值,找到模型包(蓝色封条的资源),Model->Scale Factor乘以相应scale值
调整位置
- 枪械握把点设一个位置,将其绑定于右手,随后根据动画调整枪械位置,保存
动作精细化-IK
对于枪械握持点,设置左右手IK位置,右手点置于胸口前(rightHandGrid),左手设于前握把区(leftHandGrid)
代码,需要在至少一层动画层设置IK PASS
private void OnAnimatorIK(int layerIndex)
{
animator.SetIKPosition(AvatarIKGoal.LeftHand, leftHandGrid.position);
animator.SetIKRotation(AvatarIKGoal.LeftHand, leftHandGrid.rotation);
animator.SetIKPosition(AvatarIKGoal.RightHand, rightHandGrid.position);
animator.SetIKRotation(AvatarIKGoal.RightHand, rightHandGrid.rotation);
animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1f);
animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1f);
animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1f);
animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1f);
}
屏蔽IK与动画层级权重修改时的平滑处理
在没有瞄准的情况下需要屏蔽掉IK,且切换至瞄准状态下如果秒切IK权重(setIKxxx的第二个参数),会因为武器拔出时左手附着点变化,右手马上进入附着点导致不平滑。
直接上简单的改造代码,通过平滑添加IK权重实现
private void OnAnimatorIK(int layerIndex)
{
if (starterAssetsInputs.aim)
{
animator.SetIKPosition(AvatarIKGoal.RightHand, rightHandGrid.position);
animator.SetIKRotation(AvatarIKGoal.RightHand, rightHandGrid.rotation);
animator.SetIKPosition(AvatarIKGoal.LeftHand, leftHandGrid.position);
animator.SetIKRotation(AvatarIKGoal.LeftHand, leftHandGrid.rotation);
animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, ikValue);
animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, ikValue);
animator.SetIKPositionWeight(AvatarIKGoal.RightHand, ikValue);
animator.SetIKRotationWeight(AvatarIKGoal.RightHand, ikValue);
ikValue = (ikValue < 1) ? ikValue + Time.deltaTime * 2f : 1f;
}
else
{
ikValue = 0;
animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 0f);
animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 0f);
animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 0f);
animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 0f);
}
}
左右手不联动问题
需要打开两个IK PASS,可能是因为两个IKpass会做两次计算,前面的右手修改的结果会重新进行计算套入到左手