![]()
Unite Shanghai 2025于 10 月 23-24 日圆满举办。在团结引擎专场中,Unity 中国高级技术研发经理王刚带来分享《团结动画系统新功能(AnimGraph,RigGraph,IK&Retarget)》,本文为演讲全文实录。点击阅读原文,可以访问 Unite Shanghai 2025 演讲录像,一起学习 Unite 分享的最新技术干货。
![]()
王刚:非常感谢大家的到来,今天给大家汇报一下团结动画系统过去一年已经上线的功能。从长远目标来看,动画系统的改造是四个方面。首先,很多动画功能要节点化,而且要增加更多的动画功能。第二,关于 timeline 的长期目标是蒙太奇化。第三,在团结系统里给大家提供轻量级实时绑定系统和角色物理系统。第四,animation 要往性能优化的方向走,提供群体动画的方案。
今天主要讲这三个功能:
通用骨骼 IK & Retarget
动画功能编辑器 AnimGraph
Rig 编辑器 RigGraph
IK & Retarget
我们先看第一块。原来 Unity 的动画系统重定向只基于 humanoid 骨骼,但很多用户都是通用骨骼,所以我们想在通用骨骼基础上扩展 IK 和重定向的能力,尽量能让大家复用以前项目的动画资产。
首先,为了基于通用骨骼,新的动画系统有两个新的资产,TRig 和 TRetargeter。它们主要应用于以下两个核心场景——定制化 IK 绑定:借助 TRig 资产,开发者可以为特定骨架结构创建个性化的 IK 绑定方案,以满足不同角色在动作表现上的独特需求。定制化动画重定向:通过结合使用 TRig 与 TRetargeter,可以实现灵活高效的动画重定向功能,使动画资源能够在不同骨架之间共享与复用。TRig、TRetargeter 和其他部分的关系图如下:
![]()
在上图中,Generic Avatar 是通用骨骼,然后 TRetargeter 必须由 TRig (source) 和 TRig (Target) 两个骨骼的资产确定,进行骨骼链匹配。无论是 IK 还是 Retarget,都有 play mode 和 editor mode。editor mode 就是传统需要在 editor里面来做的编辑流程,支持 play mode 是为了在 runtime 里面可以用,以便很多角色实时动捕后要进行实时重定向、实时 IK 调整。
![]()
在 editor 模式下,TRig 有自己的编辑界面,可以配置 IK 求解器、骨骼链,也有自己的预览画面。在预览效果里,可以对 Retarget 也进行预览、编辑和修正。同样,在 editor 模式下,如果您对重定向结果满意,可以把它 bake 成 Animation clip。在 Play Mode下,结合 AnimGraph 实时修改参数查看效果。
![]()
通用 IK 组件中,所有加 T 开头的都可以支持 generic 的骨骼。
TOverrideTransform 作用于单个骨骼对象
TTwoBoneIK 作用于三关节骨骼链
TFABRIK 作用于超过三个关节的骨骼链
TFBIK 作用于任意骨骼模型。我们改造了它的求解器方法,现在基于 PBD 的方法进行求解。
中间的流程图是 IK 更新的顺序,也就是说,如果想动态设置 IK goal,就需要在 LateUpdate 环节设置。

在上图界面中,因为 IK 是分组的,您可以添加很多 IK 求解器,IK 求解过程会根据该顺序依次执行求解器,可以拖动求解器来修改求解器的求解顺序。当 IK 目标绑定上 IK 组件的时候,会跟对应的骨骼绑定在一起。
![]()

上图是运行时态的例子,团结引擎中结合 AnimGraph 来实现运行时的 IK,可以动态进行 IK 功能的调节。左边是一个 AnimGraph Node 节点界面,该界面中先有两个 Animation clip,进行了 blend,如果对某一个关节的功能不满意,可以添加实时的 IK Node 节点,该节点可以关联 TRig 资产,在运行时修改 IK 目标的相关设置。可以在添加 IK Node 后的 AnimGraph Inspector 界面关联 TRig 资产,也可以直接将 TRig 资产拖入图中自动生成 IK Node。一些IK相关的控制参数可以在此节点中暴露出来,凡是暴露出来的参数就可以动态每一帧进行修改。


这是我们重定向的编辑界面。一个 TRetargeter 资产关联了两个 TRig 资产,分别表示源角色和目标角色。首先我们需要设置他们的重定向姿势,在 inspector 里有提供了一些快速设置的方式,你可以将他们都设置为 TPose,也可以使用 clip 中的姿势或者自动对齐。基础的重定向我们是基于骨骼链去进行计算的。我们需要在各自的 TRig 资产中配置他们的骨骼链。将他们对应的骨骼链进行映射之后,我们就可以预览动画重定向后的效果。骨骼链的信息分别存储在各自的 TRig 资产中,同样对于人形角色我们可以一键自动生成。只有位于骨骼链上的骨骼会被作用重定向。

我们可以在这个界面中配置 source 和 target 之间的关系,和所有重定向相关的配置,最后可以选择用IK来进行修正。这就是无论是 editor 状态还是实时状态,基于IK的重定向过程,用它来支持通用骨骼。这个通用骨骼我们也做了一个镜像功能,比如好多格斗类的游戏就会需要镜像。

上方的动图是在运行时模式下,Retarget node 就需要编辑 TRetargeter 的参数,在节点里暴露出来,然后实时进行修改。

上方动图展示的就是加了 IK 的修正。把 source 机器人 Retarget 到角色之后,对于脚踝关节进行了 IK 修正。
对于重定向的结果,既可以离线保存为 clip,也可以在运行时配合 AnimGraph 实时地重定向,可以开放特定端口进行修改。整体的话,对于类人形角色,基本全流程都配置了自动操作的按钮,大家可以很轻松的完成类似 humanoid 的重定向流程。但不同的是,对于结果不满意的时候,也可以对其中的每一个环节进行参数和配置上的修改
最后,欢迎大家多尝试去重定向不同类型的角色,我们会根据更多实际中的例子来完善我们的工作流程。
AnimGraph
接下来讲 AnimGraph。AnimGraph 其实就是两个编辑器,一个是动画功能节点的编辑器,一个是动画控制逻辑脚本的编辑器。
在上方的 demo 中,我们把以前的两个项目的动作合到新的角色上。上面的角色是由 motion matching 控制的,下面的是由状态机控制的。拿枪的动作都是从下面角色来的,所有的跑、跳动作都是从上面角色来的。我们有两个实时的 TRetargeter 把以前的资产重定向过来,再做了 layer mix、Blend,输出新的动作。
![]()
上图是动画功能节点的 Graph,这些按连接顺序排列,最后连到 output 上,让你可以编辑动画功能的执行逻辑。现在已经发布的动画相关功能的节点化包括 Animation clip、BlendTree、状态机,第二排是各种和 blend 相关的功能,第三排是和骨骼相关的功能,比如镜像、重定向、IK 和一些约束。最下面一排功能,是考虑大家把以前 animator 的项目转成 AnimGraph 项目,这个节点可以把 controller 拖到 AnimGraph 里,它可以作为一个节点封装,然后再连其他的动画功能节点,最大限度让大家复用以前 animator 项目里的东西。Rig Graph Node 是实时绑定系统的节点。后面每三个月的版本都会提供更多的动画节点。
![]()
接下来讲一下 AnimGraph 状态机和原来 animator 的状态机有什么不一样。最左侧的图是各种多状态机混合 layer mask。现在每一个状态机的 state node 其实是一个动画节点 graph 的子 graph。也就是说,原来的状态机里,要么只能放 blend tree,要么只能放 animation clip,现在每一个 state 进去之后还是一个节点编辑器,每个 state 里面还可以重新编辑动画其他节点功能连接,再创建一个子的 state machine。右下角图例就是一个子的 state machine,套在最上面图中的某一个 state 中。
我们看最右边的节点列表,现在每个 state 里面都有一些 binding function, binding 了 script graph 里面那些可视化编辑脚本。这里面每个状态都可以 binding 一个 Function。如果不是状态机里的 state node,假设是正常的 animation node,它都有一个 binding function,第一次初始化要绑哪一个 script,每一帧 update 要绑哪一个 script,都要绑到 Function 里边,每一个函数都是可视化编辑脚本函数。
![]()
EventGraph 和 Function 可辅助 AnimGraph,实现更灵活的动画输出控制。EventGraph 给大家提供了一个可视化的脚本逻辑编辑,可以控制 node graph 中动画的各种参数,可以控制状态机里动画执行顺序逻辑,减少了用 monobehavior 来写 C# 脚本的必要。像一些已经预留的 EntryNode:OnStart、OnUpdate、OnLateUpdate,就是固定的更新事件。OnAnimationGraphMove 节点是当连接执行逻辑时,会每帧触发后续执行图。您可在执行图中处理动画系统生成的位移(deltaPosition)和旋转(deltaRotation),实现自定义 RootMotion。其功能与 OnAnimatorMove 类似。还支持CustomEvent(自定义事件)、AnimationEvent(动画事件)。
![]()
在 EventGraph 中,某些节点是通过反射机制能拿到的节点。如果对这些反射机制提供的节点不满意,可以自己创造一些函数,如果可复用,就可以放在 Function 这一栏。这里面也是通过基本反射可以得到一些对象、运算、类,然后控制这些逻辑去做。每一帧的 update 都可以更新 parameters。
RigGraph
最后简单介绍下实时绑定和控制系统 RigGraph,是一套在团结引擎里面的控制器系统。
![]()
上图是这套基于通用人形骨骼的绑定控制的实时逻辑的核心图,这里面包含两个不同关节的部位,有两种模式,一个是 forward 前向模式,控制器到骨骼,还有逆向模式,骨骼到控制器。相当于把原来绑定控制的能力轻量级地拿到了团结引擎编辑器里。
上图是正常的配置页面,所有的控制器如图所示。整个人形角色的资产就是大概按照左边的样子,由 Rig Graph Manager 出发,script machine 的核心就是处理前向和后向的控制器到骨骼的实时解算过程,整个 Rig Graph 把变量暴露出来,都可以进行实时修改。而 Effector 就相当于控制器,用来控制骨骼。
![]()

上图讲了前向解算和后向解算的时间点。在 process animation 更新的时间点里, On Setup Event 第 0 帧触发一次,用于初始化控制点的 Transform 值。On Forwards Solve(前向解算)在 Setup Event 之后,Backwards Solve 之后执行,每帧均触发,是 Rig Graph 中最主要的解算方向,定义控制点控制骨骼的逻辑。On Backwards Solve(反向解算)在 Setup Event 之后,Forwards Solve 之前执行,每帧均触发,是从当前骨骼姿势中,解算出控制点的 Transform 值,常用于控制点动画烘焙。我们先做 backward 解算,再做 forward,这两个同时存在的情况下才这么解,如果没有的话可以忽略。
任意一个控制器要编辑,有两种模式,一个是全局的,一个是本地的。全局是不管这个动画现在跑在什么 pose 上,都要把关节变成特定姿势,它会覆盖掉原来的动画。 local 模式是将收到的状态 plus 到之前的状态上,而且它支持只改局部的骨骼,比如只改腿,或改全身。


因为在动画系统里面有两套动画运行逻辑,一个是 animator,一个是 animation graph,Rig graph 可以配合这两种。配合 animator 就是刚刚的 Rig graph manager 整个 component 的挂载机制,当组件一样挂到了 animator 上。在 animation graph 里,我们给大家提供节点化的功能,可以配置 rig graph node。团结引擎的 AnimGraph 可通过 Rig Graph Node 节点实现骨骼动画运行时控制功能。
![]()
接下来介绍一个优化功能,整个一套实时绑定控制器到骨骼的解算绑定系统是用可视化节点做出来的,由于那个性能比较差,所以我们做了 Graph code generator 方案,也就是说我们会把它转化成高性能的 C# 代码。左边图中,每个 node 节点 script 进行连接,我们会把所有的对象在内存分配里进行池化减少 GC 操作,然后按照 burst 执行标准产生代码,运行性能会大大提升。右图中,优化以后这个角色是 0.4 毫秒的实时解算,上图优化前是 10-20 毫秒的数量级,性能优化提升还是非常大的。


RigGraph 有控制器编辑动画的能力,可以在 timeline 里面 K 动画,K 的是控制器不是骨骼,因为这套绑定系统已经在骨骼的基础上提供了更易用的控制器,在 timeline 存的是控制器的数据,timeline 运行的时候,控制器通过 RigGraph 把控制器解算成骨骼,驱动骨骼动画。


最后是动画烘焙功能,因为有两种模式——控制器到骨骼,骨骼到控制器,所以我们的动画烘焙也是双向的。我们在 timeline 单独做了动画烘焙模块,假设编辑好了控制器的东西,想把它编辑成正常的 animation clip 里面存的是骨骼数据,那么就把控制点动画 bake 成骨骼动画。反过来,如果外面已经有一个动捕好的骨骼数据,也可以 bake 到控制器上,这是两种模式。
今天就给大家介绍到这里,后面会给大家提供更多的动画节点。
Unite Shanghai 2025演讲回放录像已上线 Unity 中文课堂,点击阅读原文即可访问,购票用户可免费观看。请持续关注,一起学习 Unite 分享的最新技术动向。
Unity 官方微信
第一时间了解Unity引擎动向,学习进阶开发技能
每一个“点赞”、“在看”,都是我们前进的动力

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.