第一阶段完成任务其实很简单,但是因为是第一次使用Unity,美术方面也可以说是零基础,我还是花费了好几天的时间在第一阶段的开发上面。
首先我确定是做一个2D的人物移动自由世界的游戏,所以我这边采用Unity作为游戏开发引擎,aseprite作为美术开发工具。
人物动画我刚开始尝试自己制作,也找了一些教程但最后由于门槛太高还是放弃了,我这边采用的素材是从itch.io网站上下载的,这个网站里大多数素材都是可以免费商用的,质量也很高(比我自己画强太多了)。但是如果有些地方我认为可以做一些休整来适合我的游戏,我会选择用aseprite软件来做一点修改,这是一款非常好用的像素绘画工具,甚至不需要数位板,每个像素都可以用鼠标一个个点出来,该软件在steam上售价10$,也就是70¥,有条件的小伙伴可以支持一下正版,没有条件又想尝试一下的可以去B站搜索破解版[Aseprite白嫖+汉化教程]安装包在评论区(官网已开源)_哔哩哔哩_bilibili,这是我在22年看的教程,类似还有很多大家自行搜索。
有了素材之后还要让人物动起来,Unity的脚本运行是用的CSharp(C#)代码,我个人感觉其实和C差不多,暂时还没有遇到什么语法方面的问题,可以勉强写一点人物移动的代码,但是难点在于人物移动时动画的切换。这边要提到一个组件叫做Animator,它里边采用的状态机机制,使得各个动画之间能够随意切换,切换条件也可以由制作者自行设定和更改,见下图。
以上面这张图片为例,我们人物初始状态为idle,也就是Entry指向的第一个状态,英文翻译是闲置,没错闲置我们也有专属的动画,然后就是中间蓝色的这个Any State,它可以让我们从当前的idle状态随意切换到其他任意一个状态上去,向前跑向后跑,向左向右都可以。看似非常简单(我一开始也是这么认为的),但是我们需要用C#代码来控制它的底层逻辑,因为我在制作过程中遇到了许多困难,比如跑动时动画会与我实际操作时有出入,假设当我按下D键时,人物会向右跑动,同时播放向右跑动的动画,然而当我同时按下D和S键时,跑动动画就出问题了。当我松开S键时,人物会转换成闲置状态,并且继续移动,这是为什么呢?因为我最初的代码逻辑是,当WASD任意一键弹起时,动画变会转换成闲置状态,那么我当我们在同时按下D和S时,人物会播放跑动动画,但是如果继续保持D键按下,S键松开时,人物会保持向右移动,但是动画状态就回到闲置状态而非保持原来的跑动状态,这是我遇到的第一个问题。那么该怎么解决呢?我最初的修改方式是设置一个isNotRunning的参数,来判断人物是否在跑动,如果正在跑动那么就不要改变目前的状态,而当键盘上所有按键弹起时再回到idle状态。然而这还没结束,又出现了一个新的问题,我们现在松开S键,保持D键按下,人物会保持向下跑动的状态向右移动,这个问题其实也很简单就能解决,但是奈何我不了解Animator中的一些对象拥有的功能,GetKeyDown方法是当前帧按下某一按键时返回真值,而还有GetKey方法,它返回真值的条件是当前某一按键被按下,那么我们只需要遍历所有的按键来判断是否所有按键都弹起,封装到一个AllKeyReleased方法中去,这样当没有任何按键按下时我们再去切换动画才会回到闲置状态。至此基本问题都已经解决了,但是操作起来的手感还是有点问题,因为对Animator组件的不熟悉,我在网上碰了很多壁终于让我发现一个参数,混合动画时间,这是Animator自带的一个参数,可以让动画从一个状态到另一个状态改变时有一个缓冲时间,以至于动画不会随着我们按键的按下立即切换,只需把参数调整为0即可解决。
我还想再写一点东西,但是我要去吃饭了,太饿了想不起来写什么了,等我记起来我在第二阶段再行补充(*'▽'*)♪