Unity简单的IK使用-持枪武器绑定

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会做两次计算,前面的右手修改的结果会重新进行计算套入到左手

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值