目录
1.如何绘制逐帧动画
简单讲讲我是如何绘画游戏用的角色逐帧动画的。为了让游戏开发的经历显得更完整,细枝末节的记录是必要的。
首先,我在开始绘画前已经确定好了基本移动动画需要行走[过渡]与行走[循环]两类动画,总共分别是5帧与13帧。
行走[过渡]的5帧(01234)事实上意味着中间存在4个时间间隔(0-1,1-2,2-3,3-4),也就是1/3个一拍二,使用时更契合常用播放速度。但并不是出于便于调整,而是因为共画5帧是可以达成最简单的动画效果的。即先画起始帧和结束帧,然后是第一中间帧,最后是两个第二中间帧。
行走[循环]同理,存在12个时间间隔,即一拍二。
当然,你看到了,最终我并没有将图片们导出为GIF然后扔进Unity里,我使用的是一种全新的移动控制方式。
2.建议使用VSCode写Unity代码吗?
不建议用VSCode写Unity代码而建议使用Visual Studio。
VSCode不是IDE,没有自编译功能,每次使用VSCode改好代码必须先回到Unity才会编译,约算下来大概每次都会比Visual Studio多加载1-3秒。即使每次第一次打开Unity再打开代码编写软件时VSCode总是会比Visual Studio快5-10秒。
所以,请务必不要贪小失大。
3.优化移动停止缓冲帧
花了几天时间优化了一下位移动画,并绘制了新的移动缓冲动画,以及方向转换动画。也许我在急于完成角色动画,以尽快投入到剧情的编写中。
MoveStatus从00-15共有16张,我将其分为C00,C06,C03&C09三组。
在T00/T01/T02/T03/C00/C01/C15缓冲帧使用C00组,共7张,使用4帧;
C05/C06/C07缓冲帧使用C06组,共3张,使用3帧;
C02/C03/C04/C08/C09/C10缓冲帧使用C03&C09组,共6张,使用4帧。
以上C05与C06即MS09与MS10。
4.缓冲帧效果展示
缓冲帧输出速度是否过快,未来可能会调整吗。
5.添加方向转换动画
首先,我们做好准备,Sprite[] Overturn用于存储动画图片集;
coldTimeOverturn老样子,用来计时跳转至下一张图片的;
MoveInLimitationFlag的设立是为了在播放方向转换动画时禁止移动;
FaceToLeft和FaceToRight不用解释吧,它们会在PlayerMoveLeft()与PlayerMoveRight()里被设置参数。
初步构想的结构大概是这个样子,但是我发现在第一次按D时就卡死了无法移动,出于PlayerFaceRightToLeft()与PlayerFaceLeftToRight()都是在Input.GetKey(KeyCode.X)即按键持续按下的前提下进行调用的,而第一次调用会立即赋值MoveInLimitationFlag = false,让Input.GetKey(KeyCode.X)失去大前提。
所以我的想法是,在Update()里添加一个方向转换专用函数,通过检测两个信号来达成PlayerFaceRightToLeft()或PlayerFaceLeftToRight()两种效果,并在函数的末尾赋值MoveInLimitationFlag = true;
但还是出现了一个小问题,那就是在播放旋转第一帧即Overturn[00]的时候会出现一帧反方向的静止帧。
原来是因为在coldTimeOverturn大于0小于0.1的时候没有属于自己的插入动画,但此时MoveAnimation.flipX已经改变了,所以在0-0.1这个时间空隙内,此时的状态已经从正面静止帧切换至背面了。所以最好的解决方法是,我需要那张未使用的第一帧静止帧初始站立图片,在顺移其它的Overturn[xx]一位后将它拖至Overturn[00]。
再次出现问题,转换帧无差误,但是长按A或D直到翻转完毕后的第一帧位移却会出现一帧反方向静止帧。但是在按一次A或D等待翻转完毕后则不会出现反方向静止帧,当然,再按一次A或D就会出现反方向静止帧。
原因是出于在PlayerFaceLeftToRight()或PlayerFaceRightToLeft()中在方向翻转时已经为MoveAnimation.flipX设置了一个相反的参数,以至于在普通位移帧MoveStatus == 0时的coldTime在计时0-0.1区间内会出现一个相反的静止帧。解决方法是,为PlayerMoveXX()函数的MoveStatus == 0判断内coldTime的0-0.1区间内添加一个静止帧,以免位移动画出现帧空缺并受到其它动画的干扰。