动画原本是指由许多连续的图片在人眼前面快速播放,肉眼因视觉残像产生错觉,而误以为画面活动的作品。 但在 Unity3D 中的“ Animation”【动画】 系统应该这样理解——用于为游戏者自动播放人物动作或自动演示物体运动路径、色泽、尺寸变化,以及事件触发的集成组件。
我们可以先看一个实例感受一下:
上一节我们知道怎么建造一个地形,添加系统的playercontroller资源,现在我们先简单的建一个地形出来,导入StandardAsset的the third player controller,如下图:
刚导入的第三人称控制器的时候,有些同学可能会遇到动画丢失的问题,如图找到
将资源文件夹中对应的Animation文件拖进脚本即可,然后运行游戏,可以看到小人会随之运动起来。
Mecanim动画系统是Unity3D推出的全新的动画系统,具有重定向、可融合等诸多新特性,新增了状态机等概念。首先我们要了解Mecanim系统,必须先要对以下的概念有所了解:
在 Unity3D 中的 Animation 文件是用来记录物体运动信息的文件,你可以用鼠标右键点击“Project”【 项目文件栏】 ——>“Create” ——>“Animation” 来创建一个 Animation文件,创建好之后的文件为一个时钟的小图标 。 除此而外,你导入的模型文件如果带有动画信息, Unity3D 也会将这些动画信息自动的分离为 Animation 文件。
最简单的使用Animation的方法就是,将这个Animation拖至你需要动画的Gameobject当中,然后选择该GameObject,按下ctrl + 6,弹出Animation窗口,在时间轴中右键插入关键帧,然后再在关键帧中对GameObject的一些属性变化进行自己的编辑即可。
Avatar,即阿凡达,这是Mecanim动画系统中实现动画绑定的一个接口,该接口可以实现骨骼和肌肉系统的匹配,从而保证角色在执行动画的时候,角色能够按照预先设定的动画来运动。首先我们先导入一个模型资源,笔者在这里用的是Asset Store里面的Robot Kyle的资源包,具体导入方式:登陆Asset Store下载,选择在Unity中打开即可自动导入,下载完的Package一般存放于C:/Users/XXX/AppData/Roaming/Unity/Asset Store/Unity Technologies/目录中。
好了,不说这么多,我们先来看看我们导入的模型吧
箭头1指向的是我们在Project面板中的模型资源,我们选中它,在Inspector面板中可以看到有三个选项卡:Model , Rig, Animations(箭头2所示),点击Rig选项卡,将Animation Type设为Humanoid,即双足类型的动画。这种类型可以支持大多数的类人形的模型。此外,Lagacy类型用来兼容Unity3D低版本中的模型动画,Generic类型是一种介于人形和非人形的模型之间的通用类型。我们选择Humanoid类型后,在下方选择生成Avater的类型诶Create Form This Model,即通过当前的模型来生成一个Avater(箭头3指向)
在生成了Avatar之后,我们可以通过点击Configure进行编辑和查看骨骼绑定是否正确,也可以切换到Muscles选项卡中,这是我们可以通过拖动滑块来检查模型匹配是否正确。在这个案例中,我们导入的模型骨架没有任何的问题,所以直接按下Done完成确认即可。
在了解和绑定好了Avatar之后,我们就进入了Mecanim的核心组件的学习:AnimatorController。
如果说Avater是将模型的身体和骨骼实现匹配的接口,那么AnimatorController就是将动画和模型实现绑定的接口。我们这里创建一个RobotAnimatorController。双击该文件,会打开Animator窗口,如下图
这里会涉及到一个概念:States(动画状态),其实这也就是一个有限状态机,在进入每一个State之前,会有一个判断条件是否进入,当判断条件达到,则满足该状态,进行该状态的动画播放。关于有限状态机的内容,笔者不打算在这细说,大家只需简单的理解以下的情况就好:
Entry(Animator入口)—>DefaultState(默认状态)—>Next State(满足条件的下一个状态)—>Exit(离开状态)
下面我们就来学习一下该怎么使用这个Animator。
我们看到上图,上面标志有三个State(事实上有四个,还有一个Exit没有截出来),其中,Idle是我们自己新建的一个State,设置成DefaultState,代表在正常状态下是执行这个State的动画,在Entry状态上右键,选择make Transition,并连接到Idle状态。然后我们点击Idle状态,在Inspector面板中的motion中进行动画的绑定(下面会说明简单的Animation如何制作,现在我们用的是Asset Store里面的资源,笔者用的是Mixamo,一个免费的动作资源包,里面的动作还是挺好的)选中其中的一个Idle动画进行绑定,在绑定完了动画之后,我们回到Scene面板,选中需要添加动作的Object,在Inspector面板中,点击AddComponent—>Animator,然后把我们的RobotAnimatorController赋值给相应的属性即可,如下图:
现在,我们来运行游戏看看吧!!我们可以看到,Robot君已经在悠闲的晃悠起来了!
好不容易终于把这个懒惰的Robot给动起来了,那么我们就不能让他这么轻松,我们得想办法让这个懒鬼跑起来,甩起来!(Robot君:我…^%&…&*,能不能让我安静的当一个美男子→_→)
我们接下来,跟上面的步骤一样,在Animator的界面,新建两个State并绑定上动画,然后将他们跟Idle连接起来,如下面所示:
接下来,我们给这个Animator添加一个状态字,如上图箭头所示,新增一个Int类型的状态字,并命名为ActionID,默认值为0。然后,我们选中其中一个Transition,就拿Idle->Walk_Front 这个Transition为例吧,我们选中它,然后再在Inspector里面看到,在Condition中,我们往上面添加一个判断条件,参数为ActionID,行为是Equals ,值为1,意思是,当当前Animator的ActionID这个值为1的时候,Animator就会执行Idle->Walk_Front这个状态,停止Idle的播放,改为播放Walk_Front。(这里有个主意的地方,如果你勾选了Has Exit Time ,那么你在转换动画的时候就会有一定的延迟播放,这个就看各人需要了)
Animator的设定我们已经设定好了,那么我们又怎样在游戏当中改变它的动作呢?请看下面的代码(具体的代码这一节不会多说,之后讲到相关api编程的时候再进行提及)
我们新建一个C#Script ,然后将下面代码复制上,赋给 Robot对象,按下相应的按键即可看见效果,代码都比较简单,就是获取按下的键,然后改变Animator里面ActionId的值,相信大家都应该没什么大的理解问题。
using UnityEngine;
using System.Collections;
public class Animation : MonoBehaviour {
private Animator m_Animator = null;
// Use this for initialization
void Start ()
{
m_Animator = GetComponent();//获取当前对象的Animator
}
// Update is called once per frame
void Update ()
{
if (Input.GetKeyDown(KeyCode.W))
m_Animator.SetInteger("ActionID", 1);
if (Input.GetKeyDown(KeyCode.K))
m_Animator.SetInteger("ActionID", 2);
if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.K))
m_Animator.SetInteger("ActionID", 0);
}
}
唔,还不错,虽然看着有点丑(Robot君:→_→怪我咯?)
关于更多Animator的接口,大家可以参看:http://wiki.ceeger.com/script:unityengine:classes:animator:animator
唉,Unity的动画系统还是很强大的,笔者这里提及的都是很基础的,更多的东西还是需要各位去探索和运用,哪位小伙伴用的好的来教教我_(:з」∠)
楼主所用资源包下载渠道:
动作资源包:http://download.csdn.net/detail/nizihabi/9169503
robot 模型:http://download.csdn.net/detail/nizihabi/9169557