Unity3D技术之为“原状”类人动画编写根运动脚本 (Scripting Root Motion)

2015年03月15日 13:53 0 点赞 0 评论 更新于 2017-05-09 16:11

有时,您的动画可能保持为“原状”,这意味着当您将其放入场景中时,动画中的角色不会移动。换句话说,该动画未包含“根运动”。针对这种情况,我们可以使用脚本来修改根运动。以下是将相关步骤整合在一起的详细说明(请注意,实现相同结果的方法有多种,这里介绍的只是其中一种)。

步骤一:动画文件设置

  1. 打开包含原状动画的 FBX 文件的检视器,然后切换至“动画 (Animation)”标签。
  2. 确保“肌肉线条 (Muscle Definition)”已设置为您打算控制的 Avatar(假设该 avatar 的名称是 Dude,且已被添加到层级视图 (Hierarchy View))。
  3. 从可用片段中选择所需的动画片段。
  4. 确保正确对齐循环姿势 (Loop Pose),即其旁边的灯显示为绿色,并勾选循环姿势复选框。
  5. 在动画查看器中预览动画,确认动画的开始和结束处能够流畅对齐,角色呈现“原地”移动的效果。

步骤二:创建速度控制曲线

  1. 在动画片段上创建一条用于控制角色速度的曲线。您可以通过动画导入检视器 (Animation Import inspector) 的“曲线 (Curves)” -> “+” 添加曲线。
  2. 为该曲线取一个有意义的名称,例如 “Runspeed”。

步骤三:创建动画器控制器

  1. 创建一个新的动画器控制器 (Animator Controller),我们将其命名为 RootMotionController。
  2. 将需要的动画片段添加到该控制器中,这样会创建一个以该动画命名的状态,例如“Run”。
  3. 向控制器 (Controller) 中添加一个与曲线同名的参数(在本例中,名称为 “Runspeed”)。

步骤四:关联动画器控制器

  1. 在层级视图 (Hierarchy) 中选择角色 Dude,该角色的检视器中已包含一个动画器 (Animator) 组件。
  2. 将 RootMotionController 拖到动画器 (Animator) 的“控制器 (Controller)”属性上。
  3. 此时按下“播放”按钮,您会看到 “Dude” 在原地跑步。

步骤五:编写根运动脚本

为了控制角色的运动,我们需要创建一个脚本 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;
}
}
}

步骤六:附加脚本并验证结果

  1. RootMotionScript.cs 附加到 “Dude” 角色上。
  2. 此时,动画器组件会检测到一个含有 OnAnimatorMove 的脚本,“应用根运动 (Apply Root Motion)” 属性将显示为“由脚本处理 (Handled by Script)”。
  3. 现在,您会看到角色以指定的速度移动。

通过以上步骤,您就可以为“原状”类人动画编写根运动脚本,实现角色的移动控制。

作者信息

boke

boke

共发布了 1025 篇文章