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

<think>我们正在讨论Unity中的动画系统,特别是Animator Controller和Animator Override Controller的区别。根据引用内容,我们可以总结如下: 1. **Animator Controller**:这是Unity动画系统的核心组件,它定义了动画状态机,包括状态(如空闲、行走、奔跑等)、状态之间的转换条件(参数控制)、层级、遮罩等逻辑。它包含了完整的动画控制逻辑。 2. **Animator Override Controller**:这是一种特殊的控制器,它基于一个已有的Animator Controller(称为基础控制器)创建,并允许重写其中状态所对应的动画片段(Animation Clip)。它不改变基础控制器的结构、参数和逻辑,只替换动画片段。 主要区别: - **功能**:Animator Controller定义动画逻辑,而Animator Override Controller用于复用这个逻辑但替换动画资源。 - **复用性**:当有多个角色需要相同的动画逻辑但不同的动画表现时,可以使用同一个基础控制器创建多个Override Controller,每个指定不同的动画片段集。 - **运行时**:根据引用[3],在运行时(RunTime)可以实时切换Animator Override Controller,但切换Animator Controller只能在编辑器(Editor)中,否则打包程序会报错。 - **文件大小**:引用[3]提到,Animator Override Controller的文件大小比Animator Controller小很多,因为它只存储了重写的动画片段,而不存储状态机逻辑。 使用场景: - 当多个角色共享相同的动画状态机逻辑,但使用不同的动画资源时(比如不同角色有不同的行走、攻击动画),使用Animator Override Controller可以避免重复创建状态机。 - 当需要在运行时动态切换动画资源(比如更换角色皮肤或装备)时,使用Animator Override Controller可以实现。 创建方法(引用[2][5]): - 在Project窗口中右键选择“Create -> Animator Override Controller”。 - 在Inspector窗口中,将“Controller”属性设置为一个已有的Animator Controller(基础控制器),然后就可以为每个状态指定新的动画片段。 总结:Animator Controller是完整的动画状态机,而Animator Override Controller是对Animator Controller的动画片段重写,以实现逻辑复用和资源替换。 相关问题: 1. 如何在Unity中创建Animator Override Controller? 2. Animator Override Controller在运行时切换有什么限制? 3. 使用Animator Override Controller有什么优势?</think>### Unity中Animator Controller与Animator Override Controller的区别 在Unity动画系统中,**Animator Controller**和**Animator Override Controller**是两种关联但功能不同的资源类型,核心区别在于复用性与资源管理: #### 1. **Animator Controller(基础控制器)** - **本质**:完整的动画状态机,包含: - 动画状态(Idle, Walk, Attack等) - 状态间转换逻辑与条件参数(如`bool isWalking`) - 动画层级、遮罩配置 - 动画事件回调 - **特性**: - 直接驱动角色动画,是动画系统的核心逻辑载体 - 文件体积较大(存储完整状态机数据)[^4] - **运行时无法动态切换**(打包后替换会导致错误)[^3] #### 2. **Animator Override Controller(覆写控制器)** - **本质**:基于现有Animator Controller的**逻辑复用模板**,仅替换动画资源: - 继承原始控制器的所有状态、参数和转换逻辑 - 允许为每个状态指定**不同的Animation Clip**(如将"Walk"替换为"持枪行走")[^5] - **特性**: - 文件体积小(仅存储动画片段引用)[^3] - **支持运行时动态切换**(如装备武器时实时更换动画)[^3] - 图标带`+`符号(区别于基础控制器)[^2] #### 关键区别总结 | **特性** | Animator Controller | Animator Override Controller | |------------------------|------------------------------|------------------------------------| | **核心内容** | 完整状态机逻辑 | 仅替换动画片段 | | **运行时切换** | ❌ 不支持 | ✅ 支持 | | **复用性** | 独立使用 | 必须绑定基础控制器[^1] | | **文件体积** | 较大(含完整逻辑) | 较小(仅存储动画引用)[^3] | | **使用场景** | 定义基础动画逻辑 | 角色换装/武器切换等变体动画[^5] | #### 典型工作流(引用[2][5]) ```mermaid graph LR A[创建Animator Controller] --> B[设计状态机逻辑] B --> C[创建Animator Override Controller] C --> D[绑定基础控制器] D --> E[替换特定状态动画] E --> F[应用于不同角色/装备] ``` > **示例**:同一套"移动-攻击"逻辑,通过Override Controller实现: > - 基础版:徒手动画 > - 覆写版1:持剑动画 > - 覆写版2:持枪动画 > 三者共享状态机逻辑,仅动画资源不同[^1][^5]。 --- ### 相关问题 1. **如何在运行时动态切换Animator Override Controller?** 2. **Animator Override Controller是否支持混合树(Blend Tree)的覆写?** 3. **使用Animator Override Controller时如何避免动画资源冗余?** 4. **为什么Unity限制Animator Controller的运行时切换?** 5. **Animator Override Controller与Animation Layer Mask有何协同作用?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值