Version: 6000.3
语言: 中文
根运动的工作原理
Animator 组件

编写根运动脚本

有时,您的动画是“就地”的,这意味着如果您将其放在场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
,它不会移动它所在的角色。换句话说,动画不包含”根运动(root motion) 角色根节点的运动,无论它是由动画本身控制还是外部控制。更多信息
请参阅术语表
”.为此,您可以从脚本中修改根运动。要将所有内容放在一起,请按照以下步骤作(请注意,实现相同结果有很多变化,这只是一个食谱)。

  1. 打开inspector一个 Unity 窗口,显示有关当前所选游戏对象、资产或项目设置的信息,允许您检查和编辑值。更多信息
    请参阅术语表
    ,然后转到 动画(Animation) 选项卡。

  2. 确保肌肉定义使您可以更直观地控制角色的骨架。当头像就位时,动画系统在肌肉空间中工作,这比骨骼空间更直观。更多信息
    请参阅术语表
    设置为头像(Avatar用于将动画从一个绑定重定向到另一个绑定的界面。更多信息
    请参阅术语表
    您打算控制(假设这个头像名为 Dude,并且它已经添加到层次结构视图中)。

  3. 选择动画剪辑可用于动画角色或简单动画的动画数据。它是一个简单的“单位”运动片段,例如(一个特定实例)“空闲”、“步行”或“运行”。更多信息
    请参阅术语表
    从可用的剪辑中。

  4. 确保循环姿势(Loop Pose一种动画剪辑设置,用于混合动画的结束和开始以创建无缝连接。更多信息
    请参阅术语表
    已正确对齐(旁边的灯光为绿色),并且单击了“循环姿势”复选框。

    动画(Animation) 选项卡显示启用了循环姿势(Loop Pose) 属性的选定运行动画剪辑。循环匹配的开始和结束,如“循环匹配”所示为绿色。
    动画(Animation) 选项卡显示启用了循环姿势(Loop Pose) 属性的选定运行动画剪辑。循环匹配的开始和结束,如“循环匹配”所示为绿色。
  5. 在动画查看器中预览动画,以确保动画的开头和结尾平滑对齐,并且角色“就地”移动。

  6. 在动画剪辑上,创建一条曲线来控制角色的速度(您可以从动画导入检查器 Curves-> + 添加曲线)。

  7. 将该曲线命名为有意义的名称,例如“运行速度”。

    Curves 属性展开并显示 Runspeed 属性的动画曲线。
    Curves 属性展开并显示 Runspeed 属性的动画曲线。
  8. 创建一个新的动画师控制器(Animator Controller) 通过动画层控制动画,包括动画状态机和动画混合树,由动画参数控制。具有 Animator 组件的多个模型可以引用同一个 Animator 控制器。更多信息
    请参阅术语表
    ,(我们称之为 RootMotionController)。

  9. 将所需的动画剪辑放入其中,这应该会创建一个带有动画名称的状态(例如 Run)。

  10. 将与曲线同名的参数添加到控制器(在本例中为“运行速度”)。

    Runspeed 参数已添加到 RootMotionController 的 BaseLayer 中。
    Runspeed 参数已添加到 RootMotionController 的 BaseLayer 中。
  11. 层次结构中选择角色 Dude,其检查器应该已经有一个 Animator 组件。

  12. RootMotionController 拖到 Animator 的 Controller 属性上。

  13. 如果您现在按播放键,您应该会看到“Dude”在原地运行。

  14. 最后,要控制运动,您需要创建一个脚本 (RootMotionScript.cs),用于实现 OnAnimatorMove 回调:

    using UnityEngine;
    using System.Collections;
    
    [RequireComponent(typeof(Animator))]
    
    public class RootMotionScript : MonoBehaviour {
    
       void OnAnimatorMove()
       {
          Animator animator = GetComponent<Animator>();
    
          if (animator)
          {
             Vector3 newPosition = transform.position;
             newPosition.z += animator.GetFloat("Runspeed") * Time.deltaTime;
             transform.position = newPosition;
          }
       }
    }
    
  15. 您应该将RootMotionScript.cs附加到“Dude”对象。执行此作时,Animator 组件模型上的一个组件,使用动画系统为该模型设置动画。该组件具有对控制动画的 Animator 控制器资源的引用。更多信息
    请参阅术语表
    将检测脚本是否具有 OnAnimatorMove 函数,并将“应用根运动”属性显示为“由脚本处理”

    将 应用根运动(Apply Root Motion) 属性设置为 由脚本处理(Handled by Script) 的动画器组件。
    将 应用根运动(Apply Root Motion) 属性设置为 由脚本处理(Handled by Script) 的动画器组件。
根运动的工作原理
Animator 组件