FBX的使用与Animation设置是一个很有必要的技能,对于美工MM送过来的3D模型你应该懂得如何将其设置到游戏场景之中使用,不然真的羞死人的,这都不会。毕竟游戏里面许许多多的主角的动作都是一系列已经做好的3D动画,包括行走、攻击动作等,很少人在update()中来写一大堆来实现的。下面列举两个例子,说明FBX的使用与Animation设置,说白了,就是3D模型如何在Unity3D中使用。
文中所用到的两个3D模型:
Ezreal:http://download.csdn.net/detail/yongh701/9866792
Alice:http://download.csdn.net/detail/yongh701/9866791
一、材质贴图已打包为DDS、动画需要切割的FBX
1、导入
Ezreal是一个材质贴图已打包为DDS的FBX,其文件结构如下图所示:
那么在Unity3D中直接导入这个FBX文件即可。
导入之后如下图所示,可以看到Unity3D能够自动识别此类3D模型,同时,还能识别到3D模型中带有的动画,并且整个FBX模型所带的动画我们还能做个大致的预览,一般情况下,Take 001就是模型最初的动作。
这个模型被导入到Unity3D就是一个预设Prefab存在,你可以随意拖放,关于什么是预设Prefab,在《【Unity3D】利用预设、实例化Instantiate和协程完成生成器》(点击打开链接)我已经提到过了,这里不再赘述了。我们可以直接将这个Ezreal拖入场景当中,并且在(0,5,-10)拖一个Directional light,给模型提供合理的光照,大家可以看到3D模型已经基本能够使用了。
2、动画切割
但这样还不行,我们刚才明明看到这个FBX模型是带有动画Take 001,而且Take 001里面带有3个动作的,一个是模型在静止时发呆的动作、一个是行走动作、一个是攻击的动作。我们需要将这样动作应用到模型上面来。
首先,我们要在FBX模型的控制面板,设置Rig中的Animation Type为Legacy,Generation按默认就行,然后点击Apply将动画应用到这个模型上。在Unity3D一般使用Legacy动画。
之后,我们需要对动画进行切割。打开Animation面板,添加三个片段,分别是idle发呆、run跑步、attack攻击,然后分别修改好名字。同时设置好其在Take 001的开始帧与结束帧,设置开始、结束帧的时候,可以边播放动画,边调试。一般美工MM也会告诉你,她设置的各段具体的开始结束帧,这里Ezreal的三段分别为0-39、40-65、66-96。同时对于idle与run的循环模式都从Once改成Loop,因为这是一个长期存在的行为。之后点击Apply,则可以看到Take 001被切割成我们要求的三段。
3、动画处理
之后我们则可以对这个模型附着如下的脚本AnimationScript.cs:
using UnityEngine;
using System.Collections;
public class AnimationScript : MonoBehaviour
{
void Start()
{
Animation animation = this.animation;//动画控制器
animation.Play("idle");//上来直接播放idle动画
}
void OnGUI()
{
if (GUI.Button(new Rect(0, 0, 100, 30), "行走"))
{
animation.Play("run");
}
if (GUI.Button(new Rect(100, 0, 100, 30), "停止"))
{
animation.Play("idle");
}
if (GUI.Button(new Rect(200, 0, 100, 30), "攻击"))
{
animation.Play("attack");
animation.PlayQueued("idle");//播放完attack之后再播放idle
}
}
}
可以看到脚本很短,甚至大家看代码都能直接知道意思,运行结果如下:
可以看到基本能够达到一个比较不错的水平了,如果你能有个做fbx模型做得很好的MM,和她配合下,其实基本实现很多东西了……当然现实中哪有这么浪漫?基本上要么自己一手包,要么就到外面的三维公司里面买,或者小成本点的,就自己收集些免费的fbx素材……
上面的动画可以看到行走run这个动画,循环之间的分P还有点小跳跃,这个要么就是没切割好,要么就是动画本身问题,在整个动画,三个动作之间,留得空隙过短,导致不好分割,很遗憾,我这里是后者……毕竟这个素材我也是在网上收集的……
这里说完一大类的FBX,下面说另一大类的FBX
二、材质贴图没打包、动画不需要切割的FBX
1、导入
alice是一个材质贴图没打包好的fbx模型,文件模型如下图所示:
那么我们需要在Unity3D的Assets根目录新建一个Textures文件夹,不可改名,就叫这个名字,不为什么。通过Import New Asset…一个一个将材质贴图导入,Import New Asset..貌似不支持多选的,所以只能一个一个导入。所以为了减少鼠标点击次数,请让你的美工MM,打包材质吧!那些做工精致的模型,估计材质贴图要上万。
之后,我们才在Assets根目录导入这个FBX模型,一定要遵守这个顺序,不然导入的模型会丢失材质的。
同样可以将个模型拖拽出来,沿Y轴旋转180度,也就是Rotation设置Y为180,并且与上面模型一样,在(0,5,-10)拖一个Directional light,给模型提供合理的光照。在Rig的动画同样设置为Legacy并且应用到模型。
2、由于这个模型只有一个无须切割的动画,因此可以直接附着如下脚本AnimationScript2.cs:
using UnityEngine;
using System.Collections;
public class AnimationScript2 : MonoBehaviour
{
void Start()
{
Animation animation = this.animation;
animation.Stop();//由于只有一条动画,无须切割,Unity3D默认将会直接播放这个动画的
}
void OnGUI()
{
if (GUI.Button(new Rect(0, 0, 100, 30), "行走"))
{
animation.Play();
}
if (GUI.Button(new Rect(100, 0, 100, 30), "重新行走"))
{
animation.Rewind();
}
if (GUI.Button(new Rect(200, 0, 100, 30), "停止"))
{
animation["Take 001"].normalizedTime = 0;//定位到此动画的第0帧
animation.Sample();//跳转
animation.Stop();//再停止
}
}
}
这里基本已经完全展示如何使用Animation类的基本方法来控制动画了,其中这里唯一需要注意的一点,animation.Stop();单单是暂停动画,如果你想将动画调回第一帧再播放,需要如上的来使用Animation类的基本方法。
运行效果如下所示:
估计这两大例子基本已经能让大家明白Unity3D中3D模型的使用。