Unity -- Animation(旧版动画组件)和Animator(新版动画器组件)

Posted Metallic Cat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity -- Animation(旧版动画组件)和Animator(新版动画器组件)相关的知识,希望对你有一定的参考价值。

旧版animation动画器组件

如果想让一个游戏物体具有动画表现的话,我们需要给这个游戏物体挂载动画组件

和音频组件视频组件一样,如果想在游戏对象上播放动画效果的话我们需要挂载一个动画组件,然后再给这个动画组件传一个用来播放的动画片段(我们传的所有动画文件都是一个动画片段)

然后我们也可以给动画组件传多个动画片段来播放,使得我们的游戏对象可以具有多种动画表现

传多个动画片段的时候要传到Animations这个列表中,然后每个动画片段都会有一个索引(索引从0开始排列)

Culling Type:剔除方式

如果我们选择总是动画化的话,则动画播放后会一直执行下去

如果我们选择 base on renders 的话则动画会基于渲染来播放动画的话,也就是说只有被渲染的游戏物体会被播放动画,如果游戏物体没有被渲染的话,则动画不被播放

(那么如何判断有没有被渲染呢? --- 很简单被摄像机拍摄到的游戏物体会被渲染,没被摄像机拍摄到的物体就不会被渲染)


除了从外界导入已经制作完成的动画片段之外,我们还可以在Unity中自己制作动画:

1.点击窗口,选择Animation,然后再选择新列表中的Animation,然后我们就可以得到下面这个动画制作面板了:

 我们可以把这个制作面板拖到游戏画面处形成另一个窗口

这个的意思是让我们创建一个动画片段文件来存储我们在动画制作窗口中创建的动画 ,创建好动画文件之后,我们在动画制作器的框中选择添加属性(我们要制作的动画就是通过修改属性参数值然后让游戏物体运动,以此获得动画片段)

 

这个面板处则是动画的播放帧数,在这里默认为1s60帧,我们可以通过拖动右边的结尾帧来调整帧数(左边的是起始帧,是固定的) 

此处我们可以制作一个简单的移动动画:

首先起始帧时游戏物体的坐标是(0,0,0),结尾帧时游戏物体的坐标是(10,0,0)--这就是一个位置变化了,然后动画制作器会自动帮我们生成从(0,0,0)到(10,0,0)的动作变化了 --- 注意这里只模拟起点和终点连线上的简单动画

 然后我们也可以在起始帧和结尾帧之间添加关键帧 -- 拖动线条到我们要添加关键帧的位置然后选择下面三个的中间那个,就可以添加关键帧了(关键帧是过渡帧,这方面的知识等以后再说吧,现在可以简单理解为我们在这里设置了一个过渡减缓帧)

 

 重点:如何通过代码的方式来播放动画呢?

1.创建一个脚本,挂载到有动画播放器组件的游戏物体上

2.创建一个动画播放器变量来承接动画播放器组件

3.通过动画播放器变量调用play()方法,此时就会播放动画了

当然,也可以直接通过获取的组件去调用play方法

 如果不给play方法传参数的话,则动画播放器会播放默认动画片段,如果传参数的话,则要传我们要播放的动画片段文件的文件名(字符串形式,且该片段已经添加到组件中)


新版Animator动画器组件

 从上到下分别是:控制器,化身,应用根运动,更新模式(Normal是法线),剔除模式(括号里是总是动画化)

1.使用上面这个的时候首先需要我们创建一个动画器控制器(animator controller)文件(我们所有的动画和动画的播放都是在动画控制器中进行调整和控制的)

2.创建好后我们就可以把这个动画器控制器文件拖拽到animator组件中的controller处了

3.Unity会自动将所有的动画片段都放在动画器控制器中

 在动画器控制器中表示动画片段的就是这些方框(除去Entry,any state和end三个默认方框外的所有方框),这些方框又被称为动画状态

每个动画状态都包含了一个动画文件和动画相关的一些设置

当我们在一个动画状态处右键的时候,会出现这些选项

state:过渡,blendTree混合数,state machine状态机,sub - state machine子状态机

 

当我们的动画开始运行的时候,首先会从entry动画状态进入,然后执行与entry连接的第一个动画状态

 

这个连接是可以改变的,我们选中要播放的动画,然后点击鼠标右键,然后选择设置为图层默认状态后,线就会连接我们选择的动画状态上

然后!这个动画器控制器管理的动画播放也是可以通过脚本来控制的

前面的步骤上面那个animation组件一样,就不再赘述了

 但是使用代码控制切换的话是直接切换,是跳过动画器管理器的切换方式

但其实动画器管理器有自己的一套切换方式,这套切换方式称为过渡,后面再讲

Unity3d 动画系统

Unity3d学习笔记 本篇简单介绍Unity3d中的动画系统及其使用。

模型导入

以带动画的FBX文件为例,unity版本为5.0以上版本。

新版动画系统

当你导入FBX文件后,会发现模型具有一个Animator(状态机)组件。

技术分享图片

我们一般将它成为(新)动画系统,新动画系统和旧版的动画系统(unity3d 4.3之前版本)的区别就在于使用了Animator组件代替了原来的Animation

旧版动画系统

同理当你使用的是旧版的动画系统就会发现是Animation组件。

技术分享图片

在高版本的unity3d你可以通过设置模型的Rig选项设置动画的类型。

参数 Animation type

  • Legacy: 旧版本的动画
  • Generic: 通用的动画
  • Humanoid: 类人动画

技术分享图片

动画导入

  • 动画分割 Animation Clips

你可以将动画分割成若干个独立的动画。

参数 Loop Time :是否循环播放。

技术分享图片

  • 多个模型文件

你也可以使用多个模型文件导入动画,命名约定——"模型名称"@"动画名称".fbx

如: test.fbx ,[email protected] ,tes[email protected]

动画的播放和使用

Animator

你需要在项目中新建一个Animator Controller来控制动画的播放。
然后双击切换到Animator视图

你会发现有三个默认状态

  • Entry: Animator的入口

  • Any State:任意的状态

  • Exit: 退出状态

我们添加两个状态用来表示两个分别不同的动画,分别名为idlemove

idleEntry状态连接表示Animator进来执行该动画,点击状态在motion选择要执行的动画。
一般入口状态为idle 动画,用来表示模型闲置的状态。

再将idle状态和move状态连接,箭头指向move,表示从闲置状态开始运动。
将move状态和idle状态连接,箭头指向idle,表示从运动状态转为闲置状态。

技术分享图片

动画的Animator(状态机)配置好了,我们需要添加一些参数来作为Animator在各个状态之间切换的条件。

在左上角的Prameters中添加两个bool变量,分别表示模型闲置和移动两种状态。

Prameters参数类型:

  • Float:float类型的参数,多用于控制状态机内部的浮点型参数。

  • Int:int类型的参数,多用于控制状态机内部的整型参数。

  • Bool:bool类型参数,多用于状态切换。

  • Trigger:本质上也是一个bool类型的参数,但是其值默认为false,且设置为true后系统会自动将其还原为false。

设置 Idling :true Moving : false

点击箭头,为状态的转换切换条件

参数 Has Exit Time:表示在动画播放完才会切换到下一动画。

技术分享图片

最后使用代码控制动画:


using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {

    private Animator _animator;
    
    void Start()
    {
        _animator = this.GetComponent<Animator>();
    }
    
    void Update()
    {
        if( Input.GetKeyDown("q") )
        {
            _animator.SetBool ("Idling",false);
            _animator.SetBool ("Moving",true);
        }
        if( Input.GetKeyDown("w") )
        {
            _animator.SetBool ("Idling",true);
            _animator.SetBool ("Moving",false);
        }
    }
}


Animation

你可以通过 play Automatically选择是否自动播放或是

代码控制:


using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {

        
    Animation _animation;
        
        void Start() {
            
        _animation = GetComponent<Animation>();


        }

    void Update(){
        
        if( Input.GetKeyDown("q") )
        {
            _animation.Play("Take 001");
        }
        if( Input.GetKeyDown("w") )
        {
            _animation.Play("Take 0010");
        }
    }

        
}





以上是关于Unity -- Animation(旧版动画组件)和Animator(新版动画器组件)的主要内容,如果未能解决你的问题,请参考以下文章

Unity3d 动画系统

Unity3D 动画系统(Animation)

Unity中的Animation组件(一)

Unity用Animation组件制作简单的动画

unity 动画系统不会用

unity 动画无法正常播放Animation的动画问题