http://www.tairan.com/archives/6939#16浏览器
原文地址:http://www.raywenderlich.com/66523/unity-2d-tutorial-animation-controllers
泰然翻译组:Verky。校对:gloryming, lareina。
欢迎回到咱们的Unity 4.3 2D 教程系列!
在这一系列的第一部分,你已经在经过熟悉Unit4.3的内建2D支持过程当中,实现了一个叫作 Zombile Conga 的游戏。
在这个Untiy 4.3 2D教程中,你将学会如何使用动画控制器来在一组动画状态中进行切换。
在这系列的第二部分,你能够学会经过使用Unity强大的内建动画系统,让僵尸和猫动起来。
在第三部分中,你会有更多建立动画片断的机会。同时,你能够学到如何在这些动画的片断控制他们的播放和过渡。
这个教程将会接着上一部分结束的地方。若是你尚未相关的项目文件,那么能够从这里下载。
就像你在第二部分所作的,解压这个文件,而后经过双击ZombieConga/Assets/Scenes/CongaScene.unity打开你的场景。
如今开始让猫跳起舞来吧!
到目前为止,你只是用了动画剪辑,就像 ZombieWalk
和CatSpawn。你在[第一部分]学习到,Unity使用一个动画组件依附在你的GameObjects,为了播放这些动画片断。可是Animator如何知道应该播放哪一个片断呢?
为了发现这一点,在Hierarchy中选择cat,而后在Inspector中查看Animator组件。Controller字段被命名为cat,就像下图所展现的那样:
这个对象是一个Animation Controller,Unity为你建立了这个对象,当你建立了cat的第一个动画剪辑,这个就是Animator用来肯定哪一个动画该播放。
注意:这个Animator包含一些其余的属性,你能够在Inspector进行编辑,可是在这部分教程中,你不须要处理任何这些其余属性。你能够经过查看Unity的Animator文档来了解更多。
就像你在图片中看到,这个在项目浏览器中的Animators文件夹包含了名为cat的控制器,同时还有名为zombie的控制器,这些都是Unity为了这个zombile GameObject对象所建立的:
注意:尽管Unity自动建立了这些动画控制器,你也能够经过在Unity的菜单中选择Assets\Create\AnimatorController来手动建立他们。
经过选择Window\Animator打开Animator面板,不要被相似的名字愚弄到你:这个面板和Animation面板是不一样的。
在Hierarchy面板中选择cat以便在Animator面板中查看它的Animator Controller,以下图所示:
到目前为止,忽略掉左上角以及左下角的叫作Layers和Parameters的那些区域,好好看一下充满整个视图的那些矩形。
注意:你能够经过拖动这些矩形,让他们分布成你想要的的样子。因此若是你的屏幕上和这些截图有一些不一致,你不须要担忧。
你看到的是状态机的几个状态,这个状态机决定了在某一时刻,哪一个动画片断应该在cat上播放。
若是你历来没有听过状态机,你能够把它看成一个可能状态的集合。在任何给定的时间,这个机器都处在于这些已知状态中的一个,而且它包含了何时,它会如何在状态之间切换。
注意:大部分状态机为有限状态机,这意味着同一时刻,它们只能处于一种状态。理论上说,被Animator Controller定义的状态机不是有限状态机,由于当控制器在不一样状态之间进行切换时,不仅一个状态是激活的。接下来立刻就会接触到更多有关状态过渡的内容。
这些矩形每个都表明了一个动画片断,除了那个蓝绿色的叫作Any State的,这个咱们晚一点再展开。
这个橙色的矩形表明了默认状态,也就是当Animation Controller启动的时候,默认的状态,如图:
Unity会把第一个关联的动画片断做为这个Animation Controller的默认状态。因为你是按次序建立这个猫的动画片断,Unity正确的将这个CatSpawn做为了默认动画。不过,若是你想设定一个不一样的默认状态,只要在Animator是视图中,右键单击这个新状态,而后选择在弹出菜单中选择Set As Default。
下面的这个图片显示了如何手动设置CatSpawn为默认状态:
在Animator视图可见的状态下,播放你的场景。注意到一个蓝色的进度条将会出如今CatSpwan的矩形状态下。这个进度条告诉你在任一帧下,你的猫在状态机下所处的状态。
就像你看到的那样,你的猫将持续的处于CatSpawn动画状态,中间没有跳到任何下一状态。
注意:若是你看不到这个蓝色的进度条,确保你在Hierarchy面板中,cat依然处于选中状态。
你须要提供给Animation Controller有关如何在状态之间进行切换的规则,因此如今开始进入有关动画之间过渡的内容吧!
若是状态机不能改变状态,那将会变得毫无疑义。这里你能够设置你的Animator Controller来平滑的将你的猫从spawn动画过渡到定义为CatWiggle的动画。
在Animator窗口,右键CatSpawn而后选择建立一个过渡。如今你能够在Animator视图移动你的鼠标指针,
它将经过一个中间有箭头的线与CatSpawn保持链接。单击CatWiggle,将这两个状态经过一个过渡链接起来,如这个示意图:
播放你的场景,你会看到这个猫弹出,而后开始摇摆。很是简单是否是?
这固然很简单,你可能已经对结果很满意。可是,你有时候可能还想对这个过渡进行一些调整。例如,你可能发现这个过渡有一些奇怪,有一些意料以外的东西发生,因此如今开始了解如何对过渡进行编辑。
在建立了一个过渡的状况下,最简单的编辑方法就是在Animator视图中直接单击这个过渡的链接,如图所示:
下面显示在Inspector中这个过渡的属性,如图:
注意:你能够在不一样的状态或者一样的两个状态之间定义任意多的过渡。这是由于每个过渡均可以被绑定在不一样的条件状态上,这一点,一会咱们会详细展开。
当你有多个过渡时,在Animator视图下选中它们并不容易。所以,你能够查看一个特定过渡的属性,经过选择与这个特定过渡的开始状态,在Animator视图中,在这里是CatSpawn。在Inspector中,点击合适的行,在Transitions列表中,来查看这个过渡有关的信息,如图所示:
在这个Inspector,Unity提供了一个视觉呈现,它如何在两个动画片断之间进行过渡。下面这幅图片标出了在这个过渡编辑器中最重要的部分:
开始和结束标识:这些图标代表了过渡的开始和结束点。它们看起来和>|和|<很像。
一段高亮的蓝色区域清楚的代表了动画片断中和过渡的相关的部分。
一个指示器,标明了当前位置,当你在预览面板预览过渡效果时,在Inspector的底部(图中没有显示)。
矩形块展现了与过渡相关的动画片断。若是其中一个片断循环了,它可能会出现不少次,若是须要覆盖过渡期间。蓝色高亮的区域示意了片断的那一部分和到哪一种程度,这2个动画在任意时间点会如何影响。
我不肯定这个是什么意思。它看上去好像是是个图形,显示了动画片断是如何影响最终的弯曲值,可是我不肯定。无论如何,我通常忽略它,也没有任何问题。
就像你在上一幅图片所看到的,Unity保证它会开始两个动画片断之间的过渡,一旦CatSpawn开始播放。在CatSpawn的动画片断期间,Unity逐渐调整各动画片断影响最终动画的比率,从100%的CatSpawn和0%的CatWiggle,到100%的CatWiggle和0%的CatSpawn。
不幸的是,看上去Unity实际上在CatSpawn已经完整播放过一次后,才触发了这个过渡,而后开始在第二次播放CatSpawn的时候启动过渡过程。因此你能够经过这个逐帧播放的动画看得更加清楚:
看上去,在第一个动画片断的0%处开始过渡效果致使了这一问题。我不清楚这是一个设定得行为,仍是一个Unity得Bug,可是这是一个开始仔细了解Transition Editor的好机会。
当选中Transition后,看看Inspector中的Conditions,显示以下(你可能须要往下滑一点才能看到):
这个列表包含了触发这个过渡的条件。默认状况下,惟一可见的条件是Exit Time,也就是当特定比例的第一个动画播放完后触发。
注意:你不须要这样作,可是你可使用Conditons底部的+按钮来加入更多的条件。当多个条件出现时,Unity评估每个条件使用布尔And运算。也就是说只有多个条件同时符合时,过渡才会触发。
Exit Time的值当前被设置为0.00,也就是在动画片断开始的时候。你能够经过直接在这个字段编辑来调整这个值,或者你能够在前面提到的开始标记处(>|),固然直接使用这个字段能够可精准。
改变这个Exit Time到0.0.1,以下图所示。Exit Time的值域是0到1,因此0.0.1指在播放1%的CatSpawn后开始进行过渡。
注意:你可使用一个大于1.0的Exit Time,而后Unity同样能够正确的进行处理。有时候你可能想这样作,例如,若是你但愿慢慢的过渡到一个屡次重复的循环动画新的动画片断。
再次播放你的场景,能够看到猫由出现,慢慢过渡到摇摆的动画。
看一下这个过渡的慢速版原本看到更明显。
当猫在附近跳来跳去的时候,这个僵尸必定很容易注意到。固然,在现实生活中,吸引到僵尸的注意一般致使变成僵尸,在这个游戏中,也一样如此。当僵尸碰到他们,这个猫会变成恐怖的僵尸猫。为了表现这种变化,他们会变成绿色。
在Animation视图下切换到CatZombify,而后加入一个曲线来编辑Sprite的渲染颜色。
解决方案提示:不知道如何添加Color曲线?显示。
当你增长一个新曲线, Unity为自动在0帧和60帧处增长关键帧。你能够在其间进行移动,就像你如今所作的那样,或者,你可使用处在Animation视图中,控制条中的Frame字段,经过选择在时间线中选择关键帧,又或者经过拖拉这个定位器到特定的帧。固然,Animation视图中的控制条一样包括了两个按钮来前移或者厚谊关键帧,如图所示:
单击下一帧按钮(>|)来移动到第60帧。将cat:Sprite Renderer.Color 曲线展开,将Color.r与Color.b的值改成0,如图所示:
就像你能够在场景或者游戏视图中看到的,或者在Inspecor的预览面板中(若是你在Hierarchy中将cat选中),你的猫将会变成亮绿色。你能够改变这个色值来让猫变得更像一个僵尸的颜色,固然这对于一个僵尸来讲,已经没有什么大的关系。
经过在Animation窗口按下Play按钮来预览这个动画,啊噢,我猜这个小猫应该是生病了!
如今你须要这个猫从CatWiggle过渡到CatZombify状态。在Hierarchy中选择cat,而后切换到Animator视图。
在CatWiggle上右击,而后选择建立过渡,而后选择CatZombify。
播放你的场景,而后猫出现,摇摆了一会,变成绿色,而后中止移动。不过,当它彻底变绿后,它又忽然变回白色,而后又变成绿色,一直这样子。
你之前应该看到过过相似的问题。尝试本身解决这个问题,不过,若是你卡住了,能够看看下面这个小提示来寻找答案。
解决方案:不肯定如何让猫继续保持绿色?显示
如今当它变绿后,它停在绿色。完美(Purrfect)。懂了吗?由于它很完美(Perfect),可是它是一只猫,猫会打呼噜,因此我这里用了”Purr“而不是“per”。我不想吹嘘,可是我很肯定,我刚才发现了这个新词,哈哈。
你已经把由CatWiggle到CatZombify得过渡设置好了,可是它在猫摇摆后就马上开始了。在实际的游戏中,你应该是但愿这个猫在僵尸碰到它以前持续摇摆,而后你才会让它变绿。为了实现这一点,你须要将CatWiggle保持循环直到某个特定的条件触发了这一过渡。
Unity容许你在Animator控制器上添加多种用户自定义的变量,被叫作参数。而后你能够在那些触发过渡发生的条件里引用这些参数。
在Hierarchy中继续保持Cat处于被选状态,打开Animator视图,在窗口的左边点击+按钮,旁边显示Parameters,而后在弹出窗口选择Bool,如图所示:
这个参数或做为一个标志,是否这只猫已经变为僵尸,因此命名为InConga。
你的Animator视图的参数应该以下所示:
在Animator视图,选择你早前建立的在CatWiggle与CatZombify之间的过渡。
在Inspector中,点击Conditions下面的下拉列表,而后你会看到有两个选项,Exit Time和InConga。选择InConga,以下所示:
确保InConga条件右边的下拉列表处于true状态,以下所示:
如今播放你的场景,而后你注意到这个猫出现,而后后开始摇摆,可是并无变成绿色。在Animator视图中,你能够看到这只猫持续处于CatWiggle状态:
当场景继续播放,而且Animator和Game视图依然可见的状况下,单击在Animator视图左下角中InConga旁边的单选框。一旦你完成这一点,你会发现动画状态会过渡到CatZombify,而后游戏视图中得猫会变绿,而后摇摆逐渐中止。
中止播放。在接下来的教程中,你会经过脚本实现,当僵尸碰到猫后,将InConga标记变为True,但就目前为止,你会继续完成猫的动画设置。
注意:在这个教程中,你使用bool值来触发一个状态改变,可是你一样能够增长其余类型的参数,如float,int以及trigger类型。例如,你可能有一个float类型,名为Speed的参数,而后设置Animator控制器,在Speed超过某个特定值后,切换动画从走路切换到跑动动画。
Trigger参数和Bool类型很像,除了当你设置一个Trigger时,当它触发一个过渡后,这个Trigger会在过渡结束后自动重设它的值。
当前猫会出现、摇摆,而后变成一个僵尸猫。这些都是猫能够作的东西,可是你依然须要它在像之前同样摇摆而后离开。
让猫移动起来的逻辑须要等到下一段的内容,聚焦在让这个游戏变为一个可玩的游戏。就目前为止,你只是须要建立动画剪辑,而后配置这些过渡。
首先,添加CatConga动画片断一个曲线用来调整这只猫的Scale。这个缩放动画会在开始和结束,都使用Scale值1,而后在在中点会是1.1.这个动画持续0.5秒,而且重复。
如今开始,动画。
解决方案:是否配置自动动画让你很紧张?显示。
经过在Animation视图中点击Play预览你的动画。当你正确的播放这个缩放动画,你会看到一个跳动的猫,如图所示:
你必须经过你的想象来描绘它边走边如图同样变大变小。看上去就像它在处处乱晃,不是吗?若是没有,再想象一下。
如今建立一个CatZombify到CatConga的过渡动画,尝试本身作,可是若是你须要帮助的话,能够看看下面的提示。
解决方案:忘了如何建立一个过渡?显示。
如今播放场景。同时,单击在Animator视图中的InConga的状态。当心,变成僵尸的猫,几乎,当猫变绿后,这只猫立刻回变白,就像某种不死人世界的恶魔猫!
这只猫再次变白,由于CatConga动画并无经过Sprite Renderer设置一个颜色,因此Unity会将颜色重设为默认颜色。我不肯定这是一个Bug仍是一个正常现象,可是无论怎样,这很容易修正。
在CatConga中添加一个Sprite Renderer的颜色曲线。你确定知道如何去作?
解决方案:真的不知道怎么作?显示
在Animation视图中,在CatConga中,将帧定位器移动到第0帧,而后将Color.r和Color.b设置为值0.而后点击下一关键帧按钮2次,移动到第30帧。记住,是那个在Animator视图中控制条中像>|的按钮。
你须要删除这个关键帧。你能够经过点击cat旁边的菱形按钮:Sprite Rendere.Color在曲线列表中,而后选择Delete Key,如图所示:
注意:你刚点的这个按钮会删除全部四个颜色属性变化的关键帧。若是你只是须要删除某个特定变化的关键帧,例如Color.r,那么你能够经过点击Color.r旁边的菱形。
此外,你能够直接在这个变化列表中单独的变化项上直接右击,或者,直接在时间线上某个关键帧上菱形的标记。
如今你应该在第一帧上只有一个关键帧。这会让猫的颜色一开始就变成绿色。你的Animation视图会变成以下:
再次播放你的场景,单击Animator中的InConga单选项,而后看这只猫变得不死,而后保持不死,就像什么都没有发生同样。
这个僵尸游戏的目标就是将必定数量的猫变成僵尸。当僵尸撞到一个老妇人(僵尸杀手),你会消除一些猫,而后将他们旋转,而后逐渐变小消失,如图所示:
这里将是你为这个游戏配置的最后一个动画,因此如今开始吧!
首先尝试以下配置这个CatDisappear动画片断:
持续2秒
旋转4次,也就是1440度!
X和Y缩放值会从1变为0。
猫应该继续保持绿色。
不循环。
建立一个从CatConga到CatDisappear的过渡,而且在InConga值为false时触发。
若是你在任何地方卡住了,能够参考以下。
解决方案:须要任何帮助?显示。
如今,测试这个猫的全部动画。播放场景,而后看着猫出现,而后开始摇摆,而后点击位于Animator视图中的InConga单选项,让猫变绿,而后开始跳动。最终,再次点击InConga单选项去除勾选,让猫开始旋转,缩小而后消失。以下,小猫的悲壮而美丽的一辈子:
等等,不是说没有了吗?在游戏视图中虽然,猫消失了,可是在Hierarchy中,你依然看到cat的身影。
你应该不但愿僵尸猫在依然在场景中,即便他们已经消失。那会让他们变成僵尸僵尸猫。固然,你也不但愿移除一个尚未完成彻底播放完的猫。因此Unity支持Animation事件的好处要体现了。
将游戏逻辑和动画串起来可能很麻烦。幸运的是,Unity提供了咱们一些内建的事件系统,绑定在动画片断上。
动画片断能够经过调用于动画相关联的GameObject上的脚原本触发一些事件。例如,你能够经过添加一个脚本在cat上,而后在动画片断中调用相应的方法。
在Hierarchy中选择cat,而后增长一个C#脚本,命名为CatController。这个应该和第一部分的内容很像,你能够参考如下提示来回顾如下。
解决方案:不记得如何添加脚本,显示.
打开CatController.cs在MonoDevelop。若是你不肯定如何作,只要双击CatController在Project浏览器中。
在MonoDevelop,中移除两个空方法,在CatControler.cs,Start和Update。
而后增长如下代码到CatController.cs:
void GrantCatTheSweetReleaseOfDeath(){DestroyObject( gameObject );}
你即将配置CatDisappear来调用这个方法,当动画片断结束的时候。如同它的名字所暗示的,这个方法会销毁这个脚本的GameObject来释放这个僵尸猫,当僵尸猫消失而且死去的时候。Florida?
注意:当心,Florida。
保存这个文件(File\Save),而后回到Unity。
在Hierarchy中选择Cat,而后在Animation视图中,从下拉列表中的动画片断选择CatDisappear,
移动定位器到第120帧,而后在动画视图的控制面板中,单击Add Event按钮,如图所示:
这个会弹出一个对话框,而后让你从下拉列表中选择一个函数。如你所看到的,默认值是没有函数被选择,若是你就这样退出,那么这个事件将不会产生任何效果。
这个列表会列出你在GameObject中附加的任何脚本中全部的方法。也就是说,他不会列出继承自MonoBehaviour,例如Start和Update。
在这种状况下,你刚增长了GrantCatTheSweetReleaseofDeath(),因此在下拉列表中选择它,而后关闭这个对话框。
这个时间线将会包含一个你所建立的事件的标记,如图所示:
浮动光标到这个事件上,将会显示一个提示显示相关的调用方法,如图所示:
右击这个事件,会弹出一个对话框,然你编辑或者删除这个事件,就像增长一个新事件同样。
注意:你能够为动画事件定义方法,接受0个或者1个参数。若是这个方法有一个参数,那么这个对话框会显示一个字段让你指定特定的值到这个函数。
例如,下面这张图片显示了一个能够接受**型参数的函数:
你的事件能够有如下几种类型:float,String,int或者一个对象引用或者一个AnimationEvent对象。
一个AnimationEvent能够用来包含其余类型的内容。下面这个图片显示了当编辑一个包含方法有参数为AnmationEvent事件的对话框:
播放你的场景,而后,单击InConga勾选框,在Animator视图中来让猫变成僵尸,而后再次单击InConga单选框去除勾选,而后僵尸消失。
更重要的是,注意到cat在Hierarchy中也消失了,如图所示:
在一个真实的游戏中,你会但愿回收你的猫对象而不是持续的建立和销毁。可是对于咱们的僵尸游戏以机构足够了。除此以外,是否你真的但愿生活在一个回收猫的世界。
这个教程并不会涉及到任何在Unity有关动画的内容。Unity的都规划系统,叫作Mecanim,是很是精细,是用来做为复杂的3的动画。此外,就像你看到的,它也能够用来做为2D动画的实现。
这个部分,包含了一些小的笔记,不会在其余地方提到,可是也许会对于你建立本身的动画有些帮助。
除了你在Animator视图中用到的状态,你可能注意到有一个叫作Any State的矩形,如图所示:
这个其实并不是一个状态,他是一个特殊用来建立个能够随时随地发生的过渡。
例如,假定你在写一个游戏,在这个游戏中,玩家老是能够有一个能力,可使用一个武器,无论当前玩家处于什么动画状态,均可以尝试开火,而后调用他的开火动画FireWeapon。
不用建立一个从全部状态过渡到FireWeapon的状态,你能够只须要建立一个从Any State到FireWeapon的过渡。
而后,当这个过渡的条件知足后-在这种假设的状况下。可能当FirePressed Bool类型参数为True-而后当这个过渡被触发,无论当前Animator控制器在所在何种状态,这个过渡都会被执行。
除了动画片断以外,Animator控制器中的状态能够是一个子状态机。子状态机可让复杂的状态机更加结构简化。也就是经过将某一分支的状态包含在一个单一的状态节点内。
例如,想像一组动画片断,组成一次***,例如瞄准和开火。不用将他们所有呈如今Animator控制器中,你能够将他们包含在一个子状态机中。接下来的图片显示了一个假定的僵尸的Animator控制器,,它能够从走动变为***状态:
而后接下来这幅图片显示了一个能够定义为一个***的状态机:
你像使用普通状态那样链接或者链接到子状态机,除了每次会弹出一个须要你指定特定状态的对话框。
须要了解更多有关子状态机的内容,能够阅读这篇Unity的官方文档。
Blend Trees是一种特殊的状态,你能够添加到Animator控制器。他们一般将多个动画融合在一块来创造一种新的动画。例如,你可能须要一个走路和跑动的动画,你能够经过使用Blend Tree来建立一个新的动画,基于速度。
Blend Trees是很是复杂,须要专门的教程来学习。为了让你有一个理解,Unity的2D Character 控制器课程包含了不少使用Blend Tree来选择合适的Sprite用来做为2D任务,基于这我的物特性的速度。
你能够了解有关Blend Tree的更多内容在这里。
在Animator视图的左上角,有一个部分命名为Layers,如图所示:
你可使用Layers来实现3D人物中的复杂动画。例如,你能够有一个层用来控制一个3D人物的脚来实现走动动画,经过另一个层来实现这我的物的设计动画,而后经过某种规则来混合这种动画。
我不知道,你是否能够经过使用Layers来实现2D角色,可是你可能但愿了解更多,能够查看更多相关的文档。若是你知道如何将他们用在2D游戏中,能够留言,谢谢!
接下来是涉及到脚本最多的内容,你会学到的如何经过脚本获取到你在Animator视图中设置的参数。
而后,我不肯定有些读者是否愿意等待数星期来等待这个教程出现。我不会在这里解释更多,可是若是你不能等,这里是一些相关的脚本,让你能够访问InConga属性,经过脚本:
// Get the Animator component from your gameObjectAnimator anim = GetComponent<Animator>();// Sets the valueanim.SetBool("InConga", true);// Gets the valuebool isInConga = anim.GetBool("InConga");
最好的方式是缓存Animator的组件在一个类成员变量中,而不是每次都去读取它。此外,若是速度很关键,可使用Animator.StringToHash来生成一个int,从string类型的”InConga“,而后使用这个方法系列中接受int的版本。
这个教程覆盖了大部分你如何建立2D动画在Unity中的内容,你能够在这里找到完整的项目文件。
你会在下一部分的教程总涉及到更多的与Script有关的内容,还有两期内容,Unity 4.3 2D教程:Physics和Screen Sizes。就像他的名字所示,他会介绍Unity的新2D引擎和与屏幕尺寸无关的定位技巧。
了解更多有关如何建立动画的内容,能够看一下下面的内容:
检查Unity的Animation Tutorial视频。
Unity的2D角色控制器学习课程,除了Blend Tree范例,以前提到的,这个课程还会复习animation Sprites当它示范如何建立一个2D角色控制器。
Unity有关Animation部分文档
Unity多种动画组件的参考内容。
若是你以为这份教程不错,请让咱们知道,欢迎留言或者在评论区提问。
泰然网指定官方QQ群:222952691 (加群前请关注微信公众号,不然不予经过) 《Unity 4.3 2D 教程:动画控制器》若为泰然网原创(翻译),禁止用于一切商业行为,转载请注明出处并通知泰然网!