Unity AnimationRigging笔记

文章讲述了在Unity开发中遇到的错误,包括DoTween库迁移时的Metadata文件丢失问题,以及xLua在C#与Lua交互中关于AppDomain和Delegate的使用错误。解决方法包括修复文件路径、替换AppDomainwithAssemblyBuilder,以及针对Lua调用C#委托的特定注解要求。

首先看一下AnimationRigging出问题时典型的报错:

TwoBoneIKConstraint

把TwoBoneIKConstraint物体挂在枪上,移动枪,手并不跟着移动。移动任何IK_target的父级带动它,手都不移动。只有移动IK_target本身,手才移动。但是可以给IK_target加ParentConstraint带动它,可以带动手。

Multi AimConstraint不生效

观察到的一些现象:

只有打开Animator、修改AnimatorController的一瞬间生效;

如果Source物体是一个物体Axis的子物体,且脚本改变Axis的旋转,瞄准约束就只在开始运行的瞬间生效。看了教程:

【unity教程】完美的武器瞄准!_哔哩哔哩_bilibili

【Unity教程】制作一个第三人称射击的控制器_哔哩哔哩_bilibili

作者是用ScreenPointToRay()发出射线得到目标的位置;

好像不能用动画事件修改Multi Aim Constraint的参数?

我在动画事件里执行一个函数:

这个函数设置了Multi Aim Constraint的权重

public void OpenFire(){
        AimAt();
        multiAimConstraint.weight=1;
        SetFiring(true);
    }

结果它的权重还是0.我在设置为1后立即打印,权重是1.在Update()里打印,一直是0.且在检查器面板可以把它设置1,说明它没有被动画系统接管。

又用动画事件设置了rig的权重,也无效。又用动画事件设置了RigBuilder关闭,有效。

然后我猜想是因为这个动画事件所在的animator不是这个Multi Aim Constraint的父级,于是给这个animator节点加了一个RigBuilder,下面加了Rig,把Multi Aim Constraint放在下面,然后出现下面的报错:

好像AnimationRigging的使用有如下条件:

  •  RigBuilder必须和操控这些约束的animator在同一个对象R;
  • 所有Rig必须是R的子对象;
  • 所有约束组件约束的物体必须是R的子节点;

代码设置sourceObjects无效且会导致内存泄漏?

2025.4.15

发现使用代码设置的sourceObjects不会生效,要运行前在编辑器配置才有效。

还会出现如下提醒:

在人物对象下挂载超过2层非骨骼子对象导致AnimationRigging不工作

试图给人物对象下面挂载第一人称手臂,AnimationRigging不工作。然后一级级删掉骨骼,删掉手臂就正常工作了。然后尝试在人物下建很多层空物体,也会导致不工作。好像人物下的非人体骨骼对象层数达到一定值时AnimationRigging就会不工作。

经过实验人物下的非骨骼子对象达到3层时AnimationRigging就会不工作。

chatGPT回答:unity的AnimationRigging插件,人物下面的非骨骼子对象达到3层时AnimationRigging会不工作

你提到的这个问题非常关键 👍——确实,Unity Animation Rigging 在层级结构上有一些严格的限制,尤其当目标对象(比如角色或约束目标)不直接在骨骼层级内,而是嵌套在多个 GameObject 层下时,会出现“约束不生效”或“姿势不更新”的问题。

下面详细解释原因和解决方法👇


🧩 问题原因:Animation Rigging 依赖 TransformStreamHandle

Animation Rigging 的底层依赖 TransformStreamHandle(即动画流里的 Transform 句柄)来实时修改动画姿势。
这个句柄只能绑定到 Animator 控制的层级下的 Transform。

也就是说:

✅ Rig 组件、约束目标、骨骼等节点必须在 Animator 根节点的子层级中,否则 Unity 的动画流访问不到它们。


🚫 当“非骨骼对象嵌套太深”时

例如你的层级是这样的:

Character (带 Animator)
 ├─ ModelRoot
 │   ├─ Mesh
 │   ├─ NonBoneGroup
 │   │   ├─ SomeObject
 │   │   │   ├─ LeftHandIKTarget

LeftHandIKTarget 已经是第 3 层“非骨骼子对象”,而不是直接在 Animator 子层级的骨骼系统内。
此时:

  • Animation Rigging 的约束在播放时会报 Invalid TransformStreamHandle

  • 或者 RigBuilder 执行时,这个目标 Transform 不会被正确绑定

  • 视觉上表现为 约束完全不生效,手脚或武器不跟随目标移动


✅ 解决方案

✅ 方法 1:把 Rig 和目标对象放进 Animator 的层级下

最推荐的方式:

Character (Animator)
 ├─ Armature
 │   └─ Bones...
 ├─ RigSetup
 │   ├─ LeftHandIKTarget
 │   └─ OtherConstraints

只要目标在 Animator 组件的 Transform 层级下(不论骨骼还是空物体都可以),Animation Rigging 就能工作。


✅ 方法 2:在 RigBuilder 启动时手动 Rebuild

如果你的对象必须放在外层(例如因为Prefab结构限制),可以在启动时执行:

using UnityEngine.Animations.Rigging;

public class RigRebuilder : MonoBehaviour
{
    public RigBuilder rigBuilder;

    void Start()
    {
        rigBuilder.Build();
    }
}

有时 Unity 不会自动检测动态加载或跨层级引用的目标,rigBuilder.Build() 可以强制刷新绑定。


✅ 方法 3:用空节点中转(“桥接节点”)

在 Animator 层级中创建一个空物体:

Character
 ├─ RigBridge

然后让外部对象的 Transform 通过脚本或约束同步到这个 RigBridge 的子节点,从而间接传递位置。
这样可以在保留原层级结构的同时,不破坏 Animation Rigging 的访问规则。


⚠️ 补充提示

  • Animation Rigging 的所有目标、约束、控制器都必须在同一个 Animator 层级内。

  • 约束中引用的 Transform 不能跨 Prefab 实例或引用外部层级。

  • 在 Play 模式下生效、而编辑器下无效,通常也是绑定丢失引起的。


如果你能贴一下你的层级结构(比如截图或用文字表示层次),我可以帮你具体指出哪个层级导致 Rig 不工作,以及最小修改方案。
要我帮你分析一下吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值