unity有两种动画系统 一种是用Animator的(unity5以后)的新动画系统

另一种是用Animation的老动画系统

Animator适合创建更加复杂的动画,而Animation创建相对简单的动画

 

对比两种动画界面参数

unity3d animator 控制多段动画同时播放 unity多个动画_有限状态机

unity3d animator 控制多段动画同时播放 unity多个动画_权重_02

Animation创建的动画默认是不循环的,而Animator是默认循环的

当我们添加一个clip时,Animation会将该clip添加至Animations列表中,而Animator会将其添加至Controller

一个小坑:当使用Animation时需要在Animation面板中创建动画而不能在外面创建,在外面创建的动画默认是給Animator用的动画

 

一、老版Animation动画

老动画需要用代码来控制,一些基本的api如下

//1、播放动画
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            anim.Play("1");
        }

        //* 通常用这种
        //2、淡入播放,自动产生过渡效果
        //当你播放的动画开始状态和当前状态不一样时,就会产生过渡效果
        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            anim.CrossFade("2");
        }

        //3、前一个播放完再播放下一个
        if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            anim.PlayQueued("3");
        }

        //4、前一个播放完自动产生过渡效果到下一个动画
        if (Input.GetKeyDown(KeyCode.Alpha4))
        {
            anim.CrossFadeQueued("4");
        }

        //5、停止播放所有动画
        anim.Stop();

        //6、是否在播放某个动画
        if (anim.IsPlaying("1"))
        {

        }

        //7、播放模式设置
        anim.wrapMode = WrapMode.Loop;

        //8、==其他 层级和权重以及混合等等
        //设置层级
        anim["1"].layer = 1;
        //设置权重
        anim["1"].weight = 1;
        //混合模式 叠加还是混合
        anim["1"].blendMode = AnimationBlendMode.Additive;
        //设置混合组相关的骨骼信息
        //anim[""].AddMixingTransform();

动画事件

unity3d animator 控制多段动画同时播放 unity多个动画_权重_03

 

在animation面板点击事件标签进行设置

unity3d animator 控制多段动画同时播放 unity多个动画_过渡效果_04

需要在脚本中public触发的方法,可以添加最多一个参数

//动画事件
    public void AnimationEvent()
    {
        Debug.Log("动画事件触发");
    }

    public void AnimationEvent2(GameObject obj)
    {

    }

 

二、Animator有限状态机动画

Animator指的是有限状态机动画,

有限状态机是表示有限个状态在这些状态之间的转移和动作等行为的数学模型

它是通过条件来进行状态的切换的

 

比如有限状态机可以做的系统:

动作系统:当满足某个条件切换一个动作,且动作是有限的

AI系统:当满足某个条件切换一个状态

 

Animator面板窗口

unity3d animator 控制多段动画同时播放 unity多个动画_过渡效果_05

 

通过导线进行状态切换时有四种可以设置的变量

float:

int:

bool:bool和trigger看似类似,但bool需要人为切换true or false,trigger打开后会自动关上

trigger:trigger通常用于切换过去时需要判断,回来时不需要判断的情况。bool适用于去和回都要进行判断的情况

 

unity3d animator 控制多段动画同时播放 unity多个动画_权重_06

此外:这个条件是需要同时满足才能切换状态

 

使用注意事项:

1、在使用anyState切换动画时 记得将该动画的can translation to self给取消勾选。(默认勾选 就很坑)然后别忘了添加Exit退出状态

unity3d animator 控制多段动画同时播放 unity多个动画_有限状态机_07

2、像这样多个箭头 代表我们有多个转换条件,我们可以通过右键->make translation的方式添加 然后在下面这个面板进行查看和删除。每个转换条件相当于是或的关系。

要注意的是每个转换条件都需要我们单独设置参数 如has exit time这些参数

unity3d animator 控制多段动画同时播放 unity多个动画_有限状态机_08

 

unity3d animator 控制多段动画同时播放 unity多个动画_有限状态机_09

 

三、2D动画系统

2D动画有两种常规的创建思路,一种是逐帧动画,另一种是骨骼动画。

通常骨骼动画系统也有两种工作流,一种是使用unity自带的2D Animation,另一种是使用spine

略...下次再补充

 

四、模型导出至unity要点

1、使用FBX格式模型

2、注意FBX格式导出规范

参考官方文档 在 Unity 外部创建资源 - Unity 手册

 

导入模型的基本流程

1、美术将制作好的模型导出FBX格式模型资源

2、程序将这些模型资源导入到unity资源文件中

3、在unity内部对这些模型进行设置——模型、骨骼、动作、材质

unity3d animator 控制多段动画同时播放 unity多个动画_过渡效果_10

即在以上面板进行设置

参数解释:

Scale Factor:用于缩放模型的大小。通常我们缩放模型会在此进行设置,而不是在场景中的scale进行设置(这样会导致模型降低分辨率)

Read/Write Enbled:通常如果模型需要变形 那就会将其勾上

Generate Colliders:导入模型时自动添加Mesh Collider而不用手动一个个添加了

 

动画复用——Avatar化身系统

我们在使用人形骨骼的时候,会使用Avatar化身系统,什么是Avatar化身系统?

即我们可以把一个标准人形动作通过化身系统复用到另一个模型上,只需要我们保证他们的关节对应关系是一致的

只要两个模型都是人形骨骼,那么他们的动画就可以进行共有了

unity3d animator 控制多段动画同时播放 unity多个动画_有限状态机_11

我们可以自动或者手动将model和标准model进行匹配

 

动画相关:

将动画导出时建议将模型和动画文件分别导出
1.导出包含网格信息不包含动作信息模型
2.导出不包含网格信息包含动作信息的动作(模型)文件
具体的导出规则可以参考
1.如何导入外部创建的模型资源
在 Unity 外部创建资源 - Unity 手册 (unity3d.com)2.使用多个模型文件来导入动画
提取动画剪辑 - Unity 手册

 

我们在使用其他人的美术模型资源时,将动画导入进来可能会遇到以下几种情况

1、动画和模型保存在一起。如果是多个动画存放在一个动画模型中,那么我们还需要对其进行切割。

2、带动画的模型和骨骼模型分开保存,这样我们看来好像导入了好多角色模型,但实际上动画模型会不包含模型骨骼信息。

3、动画单独保存为clip且和模型分开保存

(如果是切割完的动画 它的命名格式通常是这样的“模型名+@+动画名”)

 

Animator状态机连线

unity3d animator 控制多段动画同时播放 unity多个动画_权重_12

参数:

Has Exit Time:如果两个动画转换不需要过渡,那么我们就直接取消勾选就行。但是需要自动转换状态的动画 我们一定要将它勾选上

unity3d animator 控制多段动画同时播放 unity多个动画_权重_13

 

使用分层和遮罩

利用动画分层我们可以做到
1.上下半身播放两个动画进行组合,比如上半身扔炸弹,下半身待机移动蹲下
2.快速制作正常状态和受伤状态的动作切换

在animator面板中制作两个layer层——>次层级使用同步其它层的设置同步主层——>根据需求设置动画遮罩——>通过调节权重来更改动画

animator.SetLayerWeight(animator.GetLayerIndex("MyLayer2"), 1);

 

其他一些动画相关API

将Animator中的动画String名称转为int类型 的id,通常我们将这个写在Start生命周期中,便于我们修改

Animator.StringToHash

 

返回 AnimatorStateInfo,其中包含有关当前或下一个状态的信息。通常可以帮助我们获取或者判断当前动画状态信息

Animator.GetCurrentAnimatorStateInfo

Animator.GetNextAnimatorStateInfo

 

动画事件

我们有两个地方可以添加动画事件

一个是Animation面板

unity3d animator 控制多段动画同时播放 unity多个动画_有限状态机_14

直接在上面添加事件后选中事件和我们选中携带Animator物体后后再点击事件他们的面板是不一样的(我们给具体的某个角色动画添加事件时 需要在角色的Animation面板中找到该动画)

unity3d animator 控制多段动画同时播放 unity多个动画_过渡效果_15

选中角色的该动画 可以直接设置为角色身上的脚本的某个public的函数

unity3d animator 控制多段动画同时播放 unity多个动画_有限状态机_16

不选中角色后的该动画 相当于每个用这个事件的角色都附带了这个事件效果

Event参数中Function就是我们角色脚本中的一个函数(要记得设置脚本)

float、int、string、Object这些就是我们要传递的数据

 

另一个设置动画事件的地方在我们的动画模型中

unity3d animator 控制多段动画同时播放 unity多个动画_权重_17

unity3d animator 控制多段动画同时播放 unity多个动画_权重_18

 

等有其他新内容再添加...