最近一款名叫“合成大西瓜”的游戏风靡空间,大家在真香之后都笑称自己为“西瓜人”,随后各种恶搞大西瓜的趣图、大西瓜bot更是接踵而至,甚至诞生了“合成大西瓜护肝版”、“合成小葡萄”、“合成大国家”等一系列衍生体…本文将主要探讨如何用Unity做一个“合成大西瓜”。

素材搜集

素材,或者说贴图展现了水果们的样貌。在这里如果把贴图替换成其他元素,比如说香蕉啦、波兰球啦一类的我们就能得到合成大国家等等的恶搞游戏。

这里为了简单(其实是我不会画)表现一下水果,笔者画了几个球,如图:

从左到右分别表示的是葡萄、小番茄、橘子、柠檬、猕猴桃、西红柿、半个西瓜和西瓜。游戏规则是两个等级相同的水果可以合成更高一级的水果,合成出西瓜就算获得游戏胜利。

这里在合成路线上省略了椰子、土豆等中间部分的水果,因为道理是一样的嘛就不画了(说到底还是因为懒惰

UI

笔者简单设计了一个UI,如图:

可以看到这个UI主要由三个部分组成。第一个部分是顶端的白色图片,这张图片将用于显示下一个出现的水果的图案;第二部分是左上角的分数,用来统计玩家通过合成获得的分数;第三部分则是左部、右部和底端的边界,都加上了碰撞器,防止水果掉出界面。

这两部分准备好以后就可以开始构思程序了

编程与实现

基本思路:给每个水果加上2D刚体和2D球状碰撞器,在鼠标点击的位置的x方向上实例化出对应的“下一个水果”。在水果的碰撞事件中两个水果被摧毁的同时生成高等级的水果,得分增加。

所以第一步是让对应的下一个水果实例化在鼠标位置的x方向上。因为涉及到水果的摧毁,所以不能直接实例化水果本体,否则会导致元物体被摧毁而无法继续实例化。所以思路是创建一个元物体的备份,在备份上进行实例化和摧毁的操作。


可以从上面两张图片看到,带public访问修饰符的物体就是水果的本体,而下方隐式的物体则是相应水果的备份体。在鼠标点击后,从已经生成的随机数中选择出对应的水果并实例化在鼠标的世界坐标的x方向上。这里的5.0f是一个固定的y坐标,能够获得水果从屏幕顶端落下的效果。

第二步,实现相同水果撞击后摧毁并“合成”出更高一级的水果并加分,以葡萄为例(下图):

这里一共有四个操作:记录碰撞的布尔值变成true、积分增加10分、记录碰撞的位置和摧毁两个碰撞体。

你会注意到我没有直接在碰撞事件里生成下一等级的物体,而是将一个记录碰撞的布尔值改成了true。这是因为两个相互碰撞的水果都带有碰撞器,所以实际上这个方法是被执行了两次,执行的主体分别是碰撞的双方。如果在这个方法里直接实例化下一等级的水果的话,我们将直接得到两个紧贴在一块的水果,并直接到达合成路线的终点——大西瓜。

所以在这里采用了设布尔值的方式,在另一个类的LateUpdate方法里对布尔值进行检测并实例化下一等级的水果就能避免生成两个,如下图。

最后一步的随机生成的“下一个水果”,这个比较简单,就是用一个随机数进行选择就可以了:

以上就是一些基本的思路。这个大概200行代码的重制版的“合成大西瓜”已经能实现原版的大部分功能,但是还缺少了失败判定功能(可以用触发器+FixedUpdate计时)和一些激动人心(大雾)的音效,但是效果还是不如原版的好嘞~