Unity动画系统详解

目录

动画编辑器

编辑器面板

动画复用

前言

人形重定向动画(Humanoid)

通用动画(Generic)

 旧版本动画(Legacy)

动画控制器

系统状态

切换条件

状态机脚本 

 IK动画(反向动力学)

BlendTree(混合树) 

 AnimatorOverrideController


动画编辑器

Unity动画编辑器原理是通过时间线,来改变物体组件的属性信息。比如修改Transform组件,Render组件。此外,还可以在时间线上添加动画事件,当播放动画时,在动画事件所处时间点执行设定的事件。

编辑器面板

上图中1则是当前动画片段的名称,其上面有个小红点录制功能,可以开启实时编辑模式。右边播放与快进倒退功能Samples代表动画的帧率(1秒多少帧),右边的两个标志,第一个表示添加新的一帧,第二个表示添加动画事件AddProperty表示增加属性,添加的是当前物体的组件信息或者其所有子对象的组件信息 。窗口最下面的Curves曲线编辑界面

动画复用

前言

我们知道,模型动画需要根据模型来制作相应的动画,如果不同模型用相同的动画,再编写一个动画片段工程量会大大增加。而且要知道,同一个动画片段需要共用,首先需要美术人员约定好命名规则,这样Unity才会认定这两个模型是一组模型添加动画,这样就大大降低了制作效率。这种动画叫做类动画,也就是动画模型的子物体名称都一样。而Unity推出的重定向动画模式,大大降低了制作周期与成本。

人形重定向动画(Humanoid)

所谓人形重定向动画,也就是身形不同的两个模型,比如男女模型,也能够共用一个模型动画。人形重定向动画会根据模型自动生成Avatar对象,其中记录了当前模型的人物骨骼和肌肉拉伸信息。其原理就是将不同身形的骨骼信息嵌入相同的动画来计算。

举个例子:A会说中文但不懂英文,B会说英文但不懂中文,而C作为一个翻译家,以一套标准的规则,将中文和英文联系起来,如果A具有一个Avatar,这里面存有A的骨骼信息和肌肉拉伸信息,同样B也是如此,Unity可以识别这两个Avatar,以同样的标准来识别这些信息。

 选中OptimizeGameObject复选框时,会把游戏对象的骨骼运动关信息删除。但是有些节点在程序中可能需要做逻辑,比如手上拿着东西,可以将这些特殊的节点在ExtraTransformsToExpose中勾选。

点击Gonfigure可以配置模型的骨骼信息和肌肉拉伸信息。

 其中,灰色表示没有此节点,绿色表示有此节点,虚线圆圈表示非必须,实线圆圈表示必须具有,不然会报错。不会所有导入的模型都是正确的,可以根据报错提示信息修改。

通用动画(Generic)

 通用动画不支持重定向,在模型文件的AvatarDefinition选择CreateFromThisModel时,会创建Avatar对象,动画文件会依赖这个对象。其中Rootnode表示支持带位移的动画。一般不要选择,可能会和自己编写的控制系统出冲突。其余的和人形重定向动画一样。

 旧版本动画(Legacy)

这是最早的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动画(反向动力学)

IK动画全名为Inverse Kinematics,其原理是子骨骼节点带动父骨骼节点运动,比如原神当中角色站在高度不同的地面上时,双脚的站姿高度也是不同的。

BlendTree(混合树) 

混合树用来做动画混合,根据Blend值的大小,来播放相应的动画。

 AnimatorOverrideController

在游戏中,很多模型文件的切换事件的逻辑可能都是一样的,比如一些怪物行为,它们的区别只在于动画文件不同。我们可以创建AnimatorOverrideController绑定需要覆盖的Controller文件,选择对应片段即可。

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

米芝鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值