unity3d游戏开发之角色的动画脚本的编写(一)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这两天研究unity3d,对动画处理特别迷糊,不知FBX导入以后,接下来应该怎么操作,看到这篇文章,感觉非常好,讲该文章出自【狗刨学习网】

已有好些天没写什么了,今天想起来该写点东西了。这次我所介绍的内容主要是为了配合我前面所写的角色运动章,那就是动画。这是一个很复杂的概念,今天,我就把我所理解的有关动画方面的观点跟大家说说,不对的地方请大家指感谢。

老实说,我学Unity时,角色控制真的是一个难点,尤其是动画方面。想要在Unity中控制好一个角色且让这个角不是一个简单的问题,需要我们深入理解其原理。只有这样,我们才有能力写一套精湛的角色控制脚本。Unity里面的动画(也许是我的程度不够吧),我们不要期望自己不用将Unity动画系统的一些原理搞清楚就能够写出一套很棒的角色控制脚蠢的。仅仅只是角色移动就播放跑步的动画,角色停下来就播放站立的动画,具有这种想法的程序员应该注意一下了。

那么怎么开始呢?我认为我们必须了解一些基本的概念。首先我们来了解一些基本的知识。首先是动画的导入。相信读本帖之前就已经对动画的导入有一定的了解了,这里我可能会从头开始讲解,因为个人程度不同嘛。一般角色动画是在三好了之后,再导入到unity3d中去的,且文件格式一般是*.FBX。Unity3D中导入角色动画的方式主要有两种,这两种方

1.分割动画。美术在三维软件中对角色的动作设计完成之后将所有动画集中在一个FBX文件上。我们只需知道其制的个数与其对应的帧数就可以对存储在这个FBX文件上的动画进行准确的分割。详细过程官方文档上写的很清楚,我们只的执行就行。但是要注意一点,我们可以在分割动画的时候会遇到这样一个选项:WrapMode,图如下:

这个WrapMode(循环模式)很重要,默认状态下系统选择的是Default,你可以调节其为其他选项,比如Loop 利用脚本来动态的操作它。关于其用法,我们会在后面的代码中得以体现。

2.多重动画文件。这是一个很方便的动画导入方法。在项目中,美术有可能将动画数据与模型分开制成FBX文件,只需找到动画的FBX模型,对它们以一个通用的方式命名即可。即"模型名@动画名",例如一个模型的名字叫做gam,并且个名为“idle”的动画的FBX文件,那么我们可以将这个FBX模型的名字命名为:

"gam@idle"。需要注意的是这个根模型中的各个动画的循环模式是Default,而且在Inspector面板中无法修改中修改,有点坑吧。而且方式二中的文件占用大小对于方式一来说确实增大不少,这对于移动设备类游戏来说确实是一件必望读者务必注意一下。

了解完这些之后,我们该重点的谈一谈Unity里面的与动画相关的API了,重点有以下三个:

Animation,AnimationClip,AnimationState。这次我们先看一下Animation这个类,我估计这次还讲不完,如果是这样

讲得多一点吧。

Animation,官方是这样介绍的:The animaiton component is used play back animations.翻译过来就是:被用来播放动画集合的。说到这里,谈到了组件,对没错,这个类对应的就是我们的Animation组件。我们将Project面个FBX模型拖拽到Hierarchy面板中,你会在其对应的Inspector面板中发现其被自动添加了一个Animation组件,只段的数量默认为0。你可以调节这个动画的Size,然后从Project面板中找到相应的动画片段,此动画片段截图如下:

动画片段,即AnimationClip,实际就是上图中的那个白色右下角有个圆形的idle文件。你可以将这个动画片Animation组件中的Animations下面,前提是其Size不为0,如下图:

下面我们来深入了解一下这个组件在脚本中的运用,首先我们看一下这个类的变量:

第一个变量是指的这个Animation组件的默认播放的动画片段。第二个指的是该动画组件中默认的动画片段是时自动播放。第三个变量很重要,我们可以用脚本来控制所有动画片段的循环状态,比如我们可以这样写: animation.wrapMode = WrapMode.Loop; 注意,小写的animation指的是该脚本附着的GameObject上组件。这句代码的功能是将该GameObject身上所有的动画片段的播放方式设置为循环播放。且可以再后续的脚本中进行那么我们有必要了解一下这个变量的类型:WrapMode。我截了一个图,如下:

WrapMode主要是用来对动画片段的播放模式来进行修改的,这五个变量代表了5中播放模式。第一个Once,这样的:当这个动画片段播放到了结尾,如果程序没有修改它的wrapMode,那么这个动画片段将会自动停止播放,而且帧数被重置为第一帧,也就是该动画片段的开头。此播放方式可以应用在射击类动画片段的wrapMode中。第二个是Loo 比较熟悉了吧。如果程序没有修改它的wrapMode,该动画片段播放完最后一帧之后并不会停止,而会回到第一帧并重复前的动画状态的改变。第三个变量是PingPong,意思是当当前动画片段播放完最后一帧之后,如果程序没有修改它的wra 机的在第一帧与最后一帧之间来回播放。第四个变量我们之前遇到过,在上面的动画导入方式中,如果是以分割动画的导入认每个动画片段的wrapMode为WrapMode.Default,即读取默认的设置,不过可以在Inspetor面板中修改。但是如果件的导入方式,那Unity连给你在Inspector中修改的机会都不给你,此时你只能在脚本中进行动态修改其wrapMode。

ClampForever。如果当前播放的动画的wrapMode的值为WrapMode.ClampForever,那么当这个动画片段播放完最后程序没有修改它的wrapMode,那么它将会一直播放这个动画状态的最后一帧。除此之外,我们还可以在官方的Charact 工程中发现这样一个变量:WrapMode.Clamp,后来经我验证,发现这个变量就是WrapMode.Once。如果读者不信的话个角色。加入这个角色具有名为“idle”(其他也行)的动画片段,那么我们可以写这样一个脚本来验证一下我们的猜想:

using UnityEngine;

using System.Collections;

public class TestWrapMode : MonoBehaviour {

// Use this for initialization

void Start () {

animation.Stop();//禁用Animaton组件中的Play Automatically。

animation["idle"].wrapMode = WrapMode.Clamp;//设置名为idle的动画片段的wrapMode属性为WrapM }

// Update is called once per frame

void Update () {

if(animation.IsPlaying("idle")){//如果当前有播放idle动画那么就执行下面

Debug.Log(animation["idle"].wrapMode);

}

if(Input.GetKeyDown(KeyCode.A)){

animation.CrossFade("idle");//淡入淡出名为idle的动画。

}

}

}

整个脚本非常简单。我们将这个脚本绑定在我们准备好的角色身上,当我们按下“A”键时,会在Console上打wrapMode属性,那么该属性会是什么呢?

相关文档
最新文档