Unity游戏开发之游戏动画(Root Motion以及动画文件)

RootMotion是一种在Unity中避免角色动画和实际位移不同步的技术,通过勾选Animator的ApplyRootMotion并设置循环动画,Unity会根据动画的绝对坐标和方向计算游戏对象的位移和转角。在脚本中,可以通过OnAnimatorMove()方法控制相对位移和转角。对于Generic模型,RootMotion基于根骨骼操作,而对于Humanoid模型,Unity会计算重心作为RootTransform。文章还提到了相关的FBX设置、BakeIntoPose属性以及对重心和身体方向的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Root Motion

即自带根位移的动画,有效避免了角色动画和实际位移不同步的现象。

实现Root Motion功能

  1. 在Animator组件中勾选Apply Root Motion
  2. 找到角色使用的动画,勾选循环功能(Loop Time),并Apply。【对动画的修改可以在FBX文件下完成,也可以找到FBX文件下的动画片段文件,Ctrl+D复制出来,再进行修改】

Root Motion的内部机制

应用了Root Motion之后,Unity会通过动画文件里记录的绝对坐标和方向,以及当前游戏对象的缩放比例计算出游戏对象在上一帧的相对位移相对转角

脚本控制Root Motion

在脚本中控制Root Motion动画

private void OnAnimatorMove()
{
//使用Root Motion实际是使用如下
	transform.position += animator.deltaPosition;//实现相对位移控制
	transform.rotation += animator.deltaRotation;//实现相对转角控制
}

动画文件会直接修改每一帧里游戏对象的坐标值和角度值。
Root Motion会通过相对位移和转角来移动对象。

Generic模型Root Motion动画的原理

Generic一般控制非人形骨骼的动画。
在FBX文件中,点击Rig,新建一个替身(create from this model).

注意:Generic动画的替身系统只需要管理一只骨骼(人形动画需要管理15根骨骼)。
创建新替身后,会出现一个Root node选项。在这里要制定一根骨骼,Unity会对这根骨骼的操作当作对游戏对象的操作。

添加成功后,在动画文件中会自动添加一个Animator:Root QAnimator:Root T

定义:Root Motion在generic动画中指的就是将根骨骼的运动用到游戏对象上

在实际制作中,3D美术会单独给模型制作一根骨骼,这个骨骼会被设置为整个结构的根骨骼

与Root Motion有关的设置

点击FBX文件,或直接点击动画文件,都可以找到与Root Motion有关的设置。

  • Loop Time
  • Root Transform Rotation:绕Y轴的旋转
  • Root Transform Position(Y):沿Y轴的位移
  • Root Transform Position(XZ):沿XZ轴的位移

属性

  • Bake Into Pose:勾选则表示不要将骨骼根节点的位移旋转当作Root Motion的一部分来处理,而是当作普通动画来处理。【右边的红绿色代表Root Motion对角色的变化较小,可以勾选】
    当勾选了Apply Root Motion后,如果没有勾选Bake Into Pose,则对于Hips(物体根节点)的旋转位移就会失效,取而代之会使用Root.Q和Root.T来操作对象;反之相反;
  • Based Upon:游戏对象在动画开始时对准的方向
    • Original:动画本来的朝向/位置(3D美术在制作动画时设置好的)
    • Root Node Rotation/…:对准根骨骼结点的指向方向/位置(算出来的,不准)
  • offset 修改游戏对象在动画开始时对准的方向的偏移量

Humanoid模型Root Motion动画的原理

  • unity通过分析骨骼结构,计算出模型的重心center of mass(也称为Body Transform)
    可以在脚本中使用animator.bodyPosition和bodyRotation来访问。
  • unity会根据具体动画,计算重心在水平平面的投影。将这个投影当作root Motion的根骨骼结点来对待,这个点被称作Root Transform。
    可以在脚本中使用animator.rootPosition和rootRotation来访问。可以简单的将Root Transform当作Root Motion的根骨骼结点。

在 Humanoid动画中,Based Into Pose

  • Root Node Rotation变为了Body Orientation(为计算出来的重心)
  • Root Node Position变为了Center Of Mass(重心)、Feet(模型的脚)
### Unity2D 中动画导致刚体失去重力的分析 在 Unity2D 的开发过程中,当为带有 `Rigidbody` 组件的游戏对象添加动画时,可能会遇到物体无法正常进行自由落体现象的情况。这是因为动画系统可能覆盖了刚体的行为逻辑。 #### 原因解析 当一个游戏对象被赋予动画控制器并设置动画剪辑时,动画中的某些属性(例如位置、旋转或缩放)会被插值计算并应用到该对象上[^1]。这可能导致刚体组件原本受物理引擎控制的位置更新机制失效。具体来说: - 如果动画中定义了 Y 轴上的位移变化,则这些变化会直接作用于对象的世界坐标,而忽略刚体所受到的重力加速度。 - 这种行为使得刚体看起来像是失去了重力的影响,实际上是因为动画系统的优先级较高,在每一帧都强制调整了目标对象的空间状态。 #### 解决方案 为了使刚体能够继续遵循物理规律的同时保持动画的表现效果,可以采取以下几种方式之一来修正此问题。 ##### 方法一:分离动画与实际运动 通过脚本手动管理角色的状态转换以及相应的动画播放条件,而不是让动画完全接管整个变换过程。例如,可以通过检测刚体的速度判断当前是否处于下落阶段,并据此触发合适的动画片段。 ```csharp if (rb.velocity.y < 0 && !isGrounded) { animator.SetBool("Falling", true); } else { animator.SetBool("Falling", false); } ``` 上述代码片段展示了如何基于刚体垂直方向的速度决定是否进入“坠落”状态下的特定动画展示模式[^2]。 ##### 方法二:禁用根骨骼移动(Root Motion) 如果不需要依赖动画本身驱动游戏角色的实际空间位移,可以在 Animator Controller 设置界面关闭 Root Motion 功能。这样即使存在复杂的动作序列也不会干扰实体的真实轨迹。 ![DisableRootMotion](https://example.com/disable_root_motion.png) > 注:此处链接仅为示意说明,请替换为实际资源路径或者删除图片占位符部分。 执行这一操作之后,所有的位移都将交还给程序逻辑处理而非单纯依靠预设好的动画文件内部数据[^3]。 ##### 方法三:混合层(Motion Matching & Layers Blending) 对于更复杂的需求场景比如精确同步多个不同类型的动态表现形式之间平滑过渡等情况,考虑引入额外层次结构概念配合权重参数调节实现无缝衔接的效果。这种方法相对前两者更为高级但也更加灵活可控。 --- ### 总结 综上所述,针对Unity2D项目里由于设置了动画而导致刚体丧失自然掉落特性的状况提供了三种可行解决方案供开发者选择适用情况采用最恰当的一种完成修复工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elsa的迷弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值