Unity2D像素游戏开发 | 您所在的位置:网站首页 › unity游戏动画无法播放怎么办啊 › Unity2D像素游戏开发 |
Hello,everybody.这里是听卿言listen的Unity系列教程,我们来继续上一篇的动画制作。(本篇很长,容易出错) 对了,上一次提供的资源发现有left精灵表顺序做反了,不过不影响制作,如需,下载链接如下: share.weiyun.com/LoqhI9g5 我们先来看星露谷人物是怎么移动的 人物移动首先由四个方向的站立动画和行走动画组成,还有底部阴影等细节动画(细节动画下篇再讲) 本篇我将使用第四篇用Aseprite制作的精灵表单(删除了原来的素材),大家也可以使用第三篇的素材(不过使用外来素材很有可能有一些不协调和bug,可以通过Aseprite或PS调整) 把自制精灵表按第二篇的方法切片(这里用按像素大小切片(Grid By Cell Size),像素大小即Aseprite的画布大小,如这里是14*29) 切片切片由于我使用自制素材,我们把之前第三篇的Player对象全删除,再新建一个Player,并添加各子对象,把Sprite拖到子对象下。(如果使用第三篇素材,也请把之前Player下所有子对象删除,并在Player下添加arm、hair、clothes、body、pants、hat六个空对象,并把Sprite拖到这六个子对象下,便于管理)如图: 创建子对象我们发现人物部位位置错误,通过修改Sprite位置调整(注:不要修改子对象的位置),根据实际情况调整,如这里修改hat_0的位置 位置总览尽管人物部位并没有什么奇怪之处,但我们要修改子对象的排列顺序,以防部位位置被覆盖或把其他部位覆盖 我们给各个子对象在检查器添加组件Sorting Group(排序组),调整图层顺序: (body——0,pants——1,clothes——2,hair——1,hat——2,arm——3) 如arm: arm图层顺序为3调整好后,我们就可以来制作动画了,我们先选中一个Sprite(如hat_0)(这一步特别重要),在动画界面点击创建以创建动画控制器 创建动画器重命名为hatdown.anim(后缀.anim)保存到默认目录就行 save我们就会发现多了一个动画文件和一个动画控制器,hat_0的检查器多了Animator(动画器)组件,已经为我们绑定好动画器了 一个动画文件和一个动画控制器动画控制器点击Sprite(hat_0),转到动画界面 动画我们先来制作人物向下站立时,帽子的动画,站立时,帽子向下不动,所以我们只需要一帧就行了 将向下的帽子Sprite(即Aseprite绘制的第一帧帽子)从资源界面拖到动画的第一帧(0:00)上 拖动我们就做好了站立向下时帽子的动画,再新建一个动画(hatdown的下拉键——创建新剪辑)命名为hatup(即站立时帽子向上的动画),保存 (注:本篇动画名为区分,使用了部位+方向+状态(无则为站立)的命名方法,可不用照搬) 创建save同理,拖动资源界面中向上的hat的Sprite到动画的第一帧 拖动创建动画同理,制作站立时,向左向右的hat一帧动画,于是得到四个动画文件 动画文件为了便于管理,新建一个叫hat1的文件夹(在资源界面右键——创建——文件夹),把动画器和动画文件全部拖动到里面 hat1文件夹重复上述做法,为其他5个部位的Sprite制作四个方向的站立一帧动画,并分别将其整理到arm1、clothes1、hair1、body1、pant1(共6个文件夹)(文章结尾会放出全部动画的下载链接) (注意:如果使用上一篇的素材,使用left精灵表第一帧到第四帧应该从右往左看) 工程量庞大,请仔细检查是否有bug armbodyclotheshairpants接下来就要制作行走动画了,行走动画由多帧构成,同样制作四方向的动画 这次以hat和body为例子 先创建一个叫hatdownwalk的动画,保存在hat1文件夹里 hatdownwalk我们按从Aseprite制作的四帧hat动画依次拖到动画界面,每帧间隔0.1s 拖动此时尝试播放一下,发现似乎动画有一些奇怪 GIF动画播放不是规律的上下移动,这个问题出在循环播放时,首尾间隔时间不同导致不连贯 所以我们应该制作五帧动画,把Aseprite的第一帧拖动unity的第五帧,保持每帧间隔0.1s 即:上下上下上问题解决 这样就正常了同理制作hatupwalk、hatleftwalk、hatrightwalk动画,都保持0.1s间隔和五帧帧数 upleftright接下来制作身体动画,同样创建一个bodydownwalk向下行走的动画 播放后我们会发现与帽子的同样问题,所以各部位行走动画都是五帧 bodydownwalk同样也是制作四方向行走动画:bodydownwalk、bodyupwalk、bodyleftwalk、bodyrightwalk body同时也为各其他部位制作四方向五帧行走动画 (记得动画保存时要选择好文件夹) 6个部位,每个部位8个动画,一共48个动画,请注意检查是否有错误 hatarmclotheshairpants制作完毕后,我们接着制作动画控制器的动画逻辑 下面以hat为示例 双击hat的动画控制器文件,进入如下动画器界面 动画控制器entry(进入)exit(退出)any state(任意状态) 一个个灰色的方块就是刚才制作的动画 我们可以直接给这些动画编一个逻辑,但由于动画过多,过于复杂,所以我们采用混合树的方式减少复杂度 我们把控制器内所有动画方块删除 删除并创建混合树(右键——创建状态——从新混合树) 混合树并选择混合树在检查器中重命名混合树为hatidle 重命名双击混合树,进入混合树,右键混合树添加四个运动状态(即四方向站立动画) 添加在检查器中添加绑定动画(由于动画过多,可以使用搜索查找) 添加四方向动画idle动画混合树第一个动画一定要是向下的down动画,因为游戏开始时默认播放第一个动画 (每个部位的idle混合树排列顺序和walk混合树排列顺序方向排列都必须相同,分别为下上左右和左右上下) 后面制作walk的动画混合树要左右动画排列在前(后面解释) 混合类型从1D改为2D Simple Directional 混合类型此时出现Motion界面出现坐标,按照左X-1,右X1,上Y1,下Y-1的坐标修改 修改还记得第三篇时的GetAxis语句吗 GetAxis当时解释道: “X轴代表水平,Y轴代表垂直,当按下A键,Horizontal值为-1,按下D键,值为1,同理,按下W键时,Vertical为1,S键,值为-1 ” 为了有垂直水平两个变量,我们需要在动画控制器中也创建这两个变量 点击参数,删除原来的blend变量,新建两个float变量 删除Float类型命名为Horizontal和Vertical回到混合树,把这两个变量按顺序绑定到Parameters 混合树此时点击hat_0,发现拖动小红点,可以播放接近的那个动画点的相应动画 拖动小红点到左边,下面播放向左的动画拖动动画一行重新排列为下上左右 回到动画器的Base layer,再创建一个名叫hatwalk的混合树,同理添加四方向行走动画 排列为左右上下 hatwalk之前为什么walk的动画说要左右动画排列在前呢? 原因是,但同时按下A键和S键时,人物会向左下斜着走,此时红点落在如图位置(-1,-1) 如果向上动画在前,左下行走时,播放的是向下行走的动画 当红点与两个动画距离相同时,unity默认播放排列在前的动画(图片是错误示范)注意每个idle混合树都必须按下上左右排列,walk混合树必须按左右上下排列 混合树总览我们做好以后,想想当人物怎么样时,人物会从站立到行走 我的答案是当速度大于0时 我们给参数再创建一个叫Speed的float数 speed然后右击混合树——创建过渡——点击另一个混合树 同理给两个混合树创建相互过渡,如图 过渡我们点击一条过渡线,把有退出时间取消勾选,Settings里固定持续时间取消勾选,过渡持续时间改为0 同样的道理,两条过渡线都取消勾选并修改选中idle——>walk的过渡线,Conditions里设置Speed大于(Greater)0 设置选中walk——>idle的过渡线,Conditions里设置Speed小于(less)0.001(因为unity没有等于0,只能取接近0的数,并小于) 设置同理,为其他部位的控制器都这样做,共六个动画控制器(内容过多,注意检查) (注:本篇为演示如何创建混合树,先创建混合树再创建变量,但一般情况下请先创建变量,再创建混合树,防止bug出现,变量为方便,请在每个控制器内都创建命名为Horizontal、Vertical、Speed) bodyclotheshairpantsarmhat对了,创建的动画控制器名称为方便区分,把六个控制器重命名,如body的控制器重命名为body1 重命名前重命名后六个部位的动画控制器设置后,我们就来写C#了,是不是感觉动画比代码还累人 我们双击打开之前的Player脚本 C#我们要先导入六个动画器,语法如下 所以我们在类下写入: C#之前update中的代码我们可以把它移动到另一个函数,使脚本整洁规范 新建另一个函数语法如下 我们新建一个函数叫InputProcess,把之前Update的代码移动到InputProcess里,并在Update引用该函数(效果不变) 我们把InputProcess里的代码全部删除,这次我们创建二维向量来控制人物移动 再新建一个名为Move的函数,新建一个二维向量(Vector2 Direction)名为Direction的变量,并写入下面的代码 同样Update引用该函数 为了避免speed变量和动画器中的Speed变量弄错 我们把speed改为movespeed,并修改Move函数中的speed变量为movespeed 然后新建一个叫Speed的浮点数变量,并在InputProcess函数中添加代码 为了避免bug,防止Speed出现负数,Speed应该取向量大小绝对值,并正规化向量 写入: 然后新建一个叫Animation的函数,设置各个控制器中的变量 (SetFloat用于设置浮点数变量) Update引用该函数 ctrl+s保存脚本,回到unity 游戏界面中的人物太小了,我们应该选中Main Camera,将检查器中摄像机组件里的大小数值修改合适 人物过小修改大小,如这里为0.8合适大小对了,为了方便区分,最好把精灵也重命名一遍 重命名我们把Player脚本拖动到Player对象上添加脚本,并绑定相应的动画控制器 接下来点击运行键,运行游戏测试: 发现按下后人物总是回到站立的向下动画,而不是行走动画的最后一帧,显得卡顿 问题修复这个问题很简单,我们在C#脚本里加入if判断语句 判断向量xy是否都等于0可以用到Vector.zero 当xy都等于0时,才给Horizontal和Vertical分别设置为向量中的x和y 保存,再次运行后发现人物移动就OK了 OK全代码如下: 本篇到此结束,求三连~ By:听卿言listen 一键三连下一篇: |
CopyRight 2018-2019 实验室设备网 版权所有 |