u3d动画系统六【动画根运动】
一.案例演示
demo说明:模型循环执行奔跑动画,模型受动画自带的位移影响,其transform(XZ的position)发生变化
二.根运动相关概念
身体变换:模型质心在场景中的Transform信息。
根变换:根变换是身体变换在 Y 平面上的投影,和动画所在游戏物体的Transform一致。
在动画的预览视图中,可以看到身体变换和根变换位置,如上图所示
可以通过animator类访问身体变换和根变换,如上图所示
根变换数据和gameObject的Transform数据一致
身体变换数据positionY设为0就是根变换数据
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Robot : MonoBehaviour
{
private Animator m_animator;
void Start()
{
m_animator = GetComponent<Animator>();
}
//通过LateUpdate打印的信息和Inspector中一致,Update比Inspector中的慢一帧
private void LateUpdate()
{
Debug.Log(string.Format("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}", Time.frameCount,
m_animator.bodyRotation.x, m_animator.bodyRotation.y, m_animator.bodyRotation.z,//身体变换-rotation
" | ", m_animator.bodyPosition.x, m_animator.bodyPosition.y, m_animator.bodyPosition.z,//身体变换-position
" || ", m_animator.rootPosition.x, m_animator.rootPosition.y, m_animator.rootPosition.z//根变换-position
));
}
}
参考官方手册:根运动 - 工作原理
三.demo设置说明
3.1 Animator的apply root motion
勾选:动画本身的运动会改变gameObject的transform属性
不勾选:动画本身的运动不会改变gameObject的transform属性
3.2 动画根运动相关设置
选中动画文件,选中Animation页签,下方的设置是和根运动有关的,如上图所示
Unity将模型的运动分为3种类型:旋转,Y方向运动和XZ方向运动,如上图所示
在对存在根运动的动画进行设置时,Animator中的Apply Root Motion相当于一个总开关,这里3种运动类型的设置相当于分开关
Bake Into Pose:勾选上会让动画在该变换类型上不会影响根运动(也就不会影响gameObject对应类型的Transform)。根据动画运动的特征进行勾选,Demo中奔跑动画而言,不会旋转,Y方向无位移,XZ上有位移。
Based Upon和Offset用来调整身体变换信息,Based Upon用来控制初始状态,Original表示取模型中对应的原始数据,Offset用来调整偏移量,这两个选项更改后,可以在动画预览视图中观察变换,所见即所得,如下图所示
四. 脚本控制根运动
适用情况:角色一部分动画需要关闭根运动,一部分动画需要启动根运动
4.1 需要有根运动的动画设置标签
4.2 OnAnimatorMove事件方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Robot : MonoBehaviour
{
private Animator m_animator;
void Start()
{
m_animator = GetComponent<Animator>();
}
private void OnAnimatorMove()
{
if (m_animator.GetCurrentAnimatorStateInfo(0).IsTag("run_motion"))
{
transform.position += m_animator.deltaPosition;
}
}
}
OnAnimatorMove内先检测执行的是根运动动画,transform的值加上动画产生的变化量(deltaPosition)即可
Animator 组件将检测到脚本有函数OnAnimatorMove并将 Apply Root Motion 属性显示为 Handled by Script
参考官方手册:为“原地就位”的人形动画编写根运动脚本