Unity2D像素游戏开发 您所在的位置:网站首页 unity游戏动画无法播放怎么办啊 Unity2D像素游戏开发

Unity2D像素游戏开发

2024-07-12 09:27| 来源: 网络整理| 查看: 265

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 实验室设备网 版权所有