箭头游戏那么火,搞个3D的可以吗?我:这不是3年前的游戏了吗?

1 阅读10分钟

在这里插入图片描述

引言

哈喽大家好,我是亿元程序员。有小伙伴私信笔者:

大佬,现在箭头游戏这么火,我们搞个3D的可以吗?

3D箭头游戏?这不是3年的游戏了吗?

带着逝去的记忆,搜索了一下,虽然3年前已经火过了,但是也找到了一些最近才上而且做得比较好的:

游戏截图

我去体验了一下,非常精美的游戏,感觉现在箭头素材还是很有搞头的。

言归正传,本期带大家一起来实战看看,在Cocos游戏开发中,实现一个3D的箭头游戏,有哪些知识点。

本文实战完整源码可在文末获取,小伙伴们自行前往,有体验链接。

关卡编辑器

刚看到这游戏宣传图时,这么多有趣的3D像素模型关卡,那得多费美术妹子啊~

3D像素模型能不能和2D那样,通过读取图片的像素去生成关卡数据?

眯着眼看,还是那位故人

几经周折,有倒是有,但是前提还是得建模,太麻烦了。

不过,在找的过程中,发现了一个免费开源的体素建模工具MagicaVoxel:

像素模型编辑器

看了下这个工具能够快速编辑像素级别的模型,还能导出文本数据,简直就是为3D箭头游戏量身定做的啊。

说那么多,还不是要费美术妹子?

西瓜长出来了?

是的,请她吃了好几碗大米饭,才帮忙拼了好几关,不过不用自己写编辑器,那真是太巴适了,建议大家多学。

数形结合

测试的话,先简单将8个正方体拼成一个大的:

模型拼完之后,我们就可以导出文本数据了,简单看一下结构,数据比较简单,就是每个方块的x、y、z、r、g、b

8个立方体的数据

可以写个简单的方法进行逐行解析拿到每个方块的xyzrgb

逐行解析

最后写个测试方法生成,用引擎自带的Cube进行测试数据有没有问题:

我要验牌

运行测试一下,生成成功:

牌没有问题

那箭头和颜色怎么弄?

颜色Shader

起初,美术妹子帮我预制了7种颜色的方块模型:

预制菜

然后通过像素颜色rgb硬编码去映射对应的模型:

很硬的预制菜

就得到了带箭头的方块,美术妹子还挺好看的

美术妹子做的模型

后来才发现,从前并不是最好的选择,每当要新增颜色时,我们都需要重新画颜色贴图和硬编码,不能够可持续发展。

于是我想到了一个办法,只保留一个白色的模型,然后通过Shader去控制方块颜色:

幸存者

Shader的实现也比较简单,将贴图当做mask,动态更换箭头和方块的颜色,arrowColor是传入的箭头颜色(黑、白),baseColor是传入的方块颜色:

极简

简单解析一下:

  • 1.将贴图的rgb相加除以3,得出亮度。
  • 2.亮度小于0.45变成0,亮度大于0.55变成1,即纯白和纯黑。
  • 3.最后通过mix混合得出颜色,当mask0用箭头色,mask1时用方块色。

通过上面的Shader,我们就可以给模型自定义上色了:

浅色用黑色箭头,深色用白色箭头

换了Shader之后会有个问题,模型缺少了一些光的效果,我们可以加上:

各种反射

这样看起来就更真实一点:

在这里插入图片描述

看起来很厉害的样子,能不能讲点我懂的?

游戏逻辑

1.关卡生成

其实3D箭头游戏的游戏逻辑和2D的箭头游戏完全不同,反倒是像挪车游戏,我们只需要避免箭头两两相对和形成闭环:

无解?这个问题充那啥可以解决

但是还不够安全,研究了一下,可以采用一种叫“剥洋葱”的算法:

给每个点找一个“不会撞到其他点的方向”,用逐步剥离 + 射线检测实现

这样就能得到绝对有解的关卡了,有条件可以把逻辑放到关卡编辑器:

would you like to drink?

2.方块点击

在3D游戏开发中,通常通过点击屏幕 → 发射射线 → 检测碰撞 → 找最近物体 → 触发点击去点选物体:

ray射线

**不懂?**给小伙伴们画一个:

还真是个天才

3.箭头移出

箭头的移出就相对来说简单了,只要没有阻挡,就可以成功移出,用补间动画就行:

tween

效果如下:

给小伙伴们比个心

细心的小伙伴发现了,方块移出有个拖尾效果,夹带私货?

更进一步

作为合集2.0的首发,咱们多唠嗑一点,能看到这里的小伙伴已经打败了90%的小伙伴! 相信你也会点赞分享转发这个高大上的技能。

1.拖尾效果

我看原作方块飞出有个拖尾效果,于是我翻看了下Cocos的官方文档,惊喜地发现:

来源于官方文档

结果却一言难尽,捣鼓了一段时间都没得到想要的效果。。。

我太难了

没办法只能撸一个,拖尾的原理类似残影,就是不断在方块的位置生成3D的颜色带,然后逐渐变透明消失,我们可以通过动态mesh实现:

详情请看源码

效果如下:

炫酷吧

2.合批

3D游戏常用的合批手段通常可以这么处理:

  • 按颜色缓存材质 : 相同颜色的方块共享同一个Material
  • 开启 GPU Instancing : 相同材质+相同网格的方块一次批量绘制

效果如下: ::: column-left 合批前 ::: ::: column-right 合批后 :::

结语

那么问题来了,3年前火过的游戏,会不会再火一次?

本文实战完整源码已集成到亿元Cocos小游戏实战合集2.0,内含体验链接,已经拥有的小伙伴可以直接更新。


我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

实不相瞒,想要个爱心!请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐文章:

亿元Cocos小游戏实战合集1.0

老板说最近这款游戏很火让我抄,可是我连玩都玩不明白...

这款值68亿的游戏,你不实战一下吗?安排!

小伙伴说我的拼图游戏用Mask不能合批...

俄罗斯方块谁不会做......啊?流沙版?

最近很火的一个拼图游戏,老板让我用Cocos3.8做一个...

老板说拼图游戏太卷了,让我用Cocos做个3d版本的...

敢不敢挑战用Cocos3.8复刻曾经很火的割绳子游戏?