目录
动画编辑器
编辑器面板
动画复用
前言
人形重定向动画(Humanoid)
通用动画(Generic)
旧版本动画(Legacy)
动画控制器
系统状态
切换条件
状态机脚本
IK动画(反向动力学)
BlendTree(混合树)
AnimatorOverrideController
Unity动画编辑器原理是通过时间线,来改变物体组件的属性信息。比如修改Transform组件,Render组件。此外,还可以在时间线上添加动画事件,当播放动画时,在动画事件所处时间点执行设定的事件。
上图中1则是当前动画片段的名称,其上面有个小红点为录制功能,可以开启实时编辑模式。右边是播放与快进倒退功能。Samples代表动画的帧率(1秒多少帧),右边的两个标志,第一个表示添加新的一帧,第二个表示添加动画事件。AddProperty表示增加属性,添加的是当前物体的组件信息或者其所有子对象的组件信息 。窗口最下面的Curves为曲线编辑界面。
我们知道,模型动画需要根据模型来制作相应的动画,如果不同模型用相同的动画,再编写一个动画片段工程量会大大增加。而且要知道,同一个动画片段需要共用,首先需要美术人员约定好命名规则,这样Unity才会认定这两个模型是一组模型添加动画,这样就大大降低了制作效率。这种动画叫做类动画,也就是动画模型的子物体名称都一样。而Unity推出的重定向动画模式,大大降低了制作周期与成本。
所谓人形重定向动画,也就是身形不同的两个模型,比如男女模型,也能够共用一个模型动画。人形重定向动画会根据模型自动生成Avatar对象,其中记录了当前模型的人物骨骼和肌肉拉伸信息。其原理就是将不同身形的骨骼信息嵌入相同的动画来计算。
举个例子:A会说中文但不懂英文,B会说英文但不懂中文,而C作为一个翻译家,以一套标准的规则,将中文和英文联系起来,如果A具有一个Avatar,这里面存有A的骨骼信息和肌肉拉伸信息,同样B也是如此,Unity可以识别这两个Avatar,以同样的标准来识别这些信息。
选中OptimizeGameObject复选框时,会把游戏对象的骨骼运动关信息删除。但是有些节点在程序中可能需要做逻辑,比如手上拿着东西,可以将这些特殊的节点在ExtraTransformsToExpose中勾选。
点击Gonfigure可以配置模型的骨骼信息和肌肉拉伸信息。
其中,灰色表示没有此节点,绿色表示有此节点,虚线圆圈表示非必须,实线圆圈表示必须具有,不然会报错。不会所有导入的模型都是正确的,可以根据报错提示信息修改。
通用动画不支持重定向,在模型文件的AvatarDefinition选择CreateFromThisModel时,会创建Avatar对象,动画文件会依赖这个对象。其中Rootnode表示支持带位移的动画。一般不要选择,可能会和自己编写的控制系统出冲突。其余的和人形重定向动画一样。
这是最早的Unity系统,优点就是比较灵魂,可以自行开发,但缺点是Unity已经不对其更新。一般不会使用。
Unity动画控制器的原理是状态机,提供了可视化的编辑工具,而状态机的原理是同一时刻只能播放同一种状态,Unity动画控制器还提供了层来通过多个层同时播放多种状态。
Unity的动画控制器有三个默认的状态,这三个状态不可以被删除,而且只有Exit状态可以被连接。
Entry | 控制器的初始状态 |
AnyState | 任何状态都可以播放动画的特殊状态,此状态结束后可以再回到默认状态 |
Exit | 状态机可以创建子状态,如果子状态需要回到父状态的BaseLayer,可以将子状态再连线到Exit状态 |
动画控制器的状态切换通过连线切换,点击线可以设置切换条件,一共有四种条件:Float,Int,Bool,Trigger
代码设置Animator.SetBool(string,true);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : StateMachineBehaviour
{
//进入当前状态时调用此方法
public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
base.OnStateEnter(animator, stateInfo, layerIndex);
}
//当状态更新时调用此方法,在OnStateEnter和OnStateExit之间,每帧都会调用
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
base.OnStateUpdate(animator, stateInfo, layerIndex);
}
//离开当前状态时调用此方法
public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
base.OnStateExit(animator, stateInfo, layerIndex);
}
//处理动画根节点的位移
public override void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
base.OnStateMove(animator, stateInfo, layerIndex);
}
//处理IK动画
public override void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
base.OnStateIK(animator, stateInfo, layerIndex);
}
}
IK动画全名为Inverse Kinematics,其原理是子骨骼节点带动父骨骼节点运动,比如原神当中角色站在高度不同的地面上时,双脚的站姿高度也是不同的。
混合树用来做动画混合,根据Blend值的大小,来播放相应的动画。
在游戏中,很多模型文件的切换事件的逻辑可能都是一样的,比如一些怪物行为,它们的区别只在于动画文件不同。我们可以创建AnimatorOverrideController绑定需要覆盖的Controller文件,选择对应片段即可。