【博客节选】再谈Unity 的 root motion

发布于:2025-03-27 ⋅ 阅读:(58) ⋅ 点赞:(0)

节选自 【Unity实战笔记】第二十三· root motion变更方向攻击 (OnStateMove + rootmotion + rigidbody 使用的一些问题)

小伙伴们应该对root motion非常困惑,包括那个bake into pose。

在这里插入图片描述
当xz bake into pose后,角色攻击动画与父节点产生偏移,动画结束后,模型还会瞬移归位。

如何理解?先看一下这位看过Mecanim源码的人的介绍

根节点运动(Root Motion)

  • 这里的根节点运动并不是一般意义上的“动画中的根节点的运动”,而是Mecanim动画系统处理根节点运动的一些列相关功能,以下都直接称之为RootMotion,而Mecanim一般称原本动画中对根节点的运动为< Root Transform >;
  • Mecanim有很具有特色的RootMotion处理功能,这里首先要提出两个概念:
    - Scene Root,模型文件中骨骼中真正的根节点,一般名称就是Scene Root,
    - Model Root,是Mecanim系统中模型语义上的中心节点;
  • 在非人形动画(Generic)中,默认没有Model Root,开发者可以指定任何节点为Model Root,而人形动画(Humanoid)中,Model Root不是任何一根具体的骨骼,而固定是人形骨骼的重心,在Unity给出的API中,根据导入配置选项差别,也称为Body或者Center of Mass;
  • 一旦骨骼对象拥有Model Root,其上的动画就会有RootMotion的语义,其详细意义是将Model Root在模型空间内的变换映射至Scene Root上,换句话说,RootMotion可以在原动画中不包含RootTransform时在Runtime时根据设置计算得到RootTransform;
  • RootMotion为开发者提供了两种处理计算得到的RootTransform的方法,一种是保留根变换,一种将根变换烘焙进Model Root中,也就是Unity官网解释的RootTransformBodyTransform方法;具体使用方法取决于Animator和AnimationClip的设置;
  • 应用RootTransform,也就是在Animator处开启Apply Root Motion,计算得到的RootTransform就会实际变换Scene Root,而应用BodyTransform,也就是选择对应Bake Into Pose,计算得到的RootTransform就会只变换Model Root,Scene Root会保持不变

    根节点运动(Root Motion)逻辑控制方案
  • Unity提供了一套代码支持逻辑管理RootMotion而不是让Animator直接管理的需求,在Animator组件的同级任意组件中实现OnAnimatorMove()回调接口即可;
  • 实现接口后Animator原本的RootMotion就不会生效,但是RootMotion计算得到结果会分别保存在Animator.rootPosition,Animator.rootRotation,Animator. deltaPosition, Animator. deltaRotation中,代码中根据需求使用;

在这里插入图片描述

  • ① Scene Root,对应 RootTransform
  • ② Model Root,对应 BodyTransform

如果不应用root motion,不bake into pose,就是一个原地动画,①不动和②也不动。
如果不应用root motion,bake into pose,①不动,②动。
如果应用root motion,bake into pose,①不动,②动。
如果应用root motion,不bake into pose,那就是②跟随①运动。

如下(出自我 第十一篇文章《动画基础》7.6.2 节):
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到