引言哈喽大家好我是亿元程序员一位有着8年游戏行业经验的主程。不知道大家还记不记得笔者之前写过一篇3D箭头游戏实战当时我们已经把基础版本跑通了MagicaVoxel编辑3D像素模型关卡导出文本数据解析每个方块的x/y/z/r/g/b用一个白色基础模型配合Shader动态上色通过“剥洋葱”思路给每个方块找可移出方向点击屏幕后发射射线选中最近方块方块无阻挡就飞出有阻挡就回弹最后还补了拖尾效果和性能优化当时做出来之后还挺满意能编辑关卡能生成模型能点击消除能拖尾性能也不算差。结果有小伙伴拿去做箭头游戏的试玩素材后私信我亿哥老板说你的3D箭头游戏用来做试玩太普通了没人想玩让我变点花样…能不能做一个合并方块的版本**合并方块**仔细了解了一下就是把原来多个方块合并成一个大的。与此同时刚好专属群里也有水友讨论到既然如此笔者只好再水一期传道授业的事怎能叫水呢叫分享把这个3D箭头游戏再升级一版。本期带大家看看如何把普通的3D箭头方块升级成支持合并块的版本。本文实战完整源码可在文末获取已经拥有合集的小伙伴可以直接更新。上期回顾3D箭头基础版做了什么简单回顾一下上期3D箭头游戏主要分成几块。1. 关卡编辑器通过MagicaVoxel编辑 3D 像素模型导出文本数据用每个方块的坐标和颜色生成关卡。2. 数形结合解析导出的PLY文本拿到每个体素方块的x/y/z/r/g/b再在Cocos里实例化出对应的3D方块。3. 颜色 Shader只保留一个白色基础模型通过Shader把贴图当成mask再动态混合baseColor和arrowColor不用为每种颜色单独做模型。4. 游戏逻辑点击屏幕发射射线选中最近方块方块根据箭头方向判断是否被挡住没挡住就飞出去。5. 更进一步补上动态Mesh拖尾以及按颜色缓存材质、开启GPU Instancing减少绘制压力。这一版作为3D箭头基础玩法已经够用了。但是如果要做试玩素材还缺一个东西第一眼的变化感。这次怎么变花样小伙伴的思路是把相邻的小方块合并成不同形态的大块。以前是[1][1][1] [1][1][1]现在可以变成[ 2 ][1] [1][ 2 ]也就是说以前每个体素点都是一个独立小方块现在会根据颜色、方向、空间关系把部分小方块合并成大块。这样关卡里就会同时出现普通单格方块单轴长条块小矩形块少量大体块看起来就不再是一堆完全一样的小cube而是更像一个更有难度的3D关卡。但是问题来了。合并方块不是把scale放大一下就完事。只要方块尺寸变了生成、贴图、碰撞、拖尾全都要跟着改。核心实战方块合并1. 新增MergedBlock旧版一个顶点就是一个方块。新版一个方块可能由多个体素点合并而来所以需要一个新的结构记录合并后的信息简单解释一下min/max记录这个合并块覆盖的体素范围sx/sy/sz记录合并后的尺寸cx/cy/cz记录中心点用于摆放节点dir记录箭头方向r/g/b记录颜色生成流程也从原来的PLY顶点 - 生成方块变成了PLY顶点 - 计算方向 - 合并成MergedBlock - 生成方块这一层抽象很重要因为后面的缩放、旋转、碰撞、拖尾都要按合并后的真实尺寸来处理。2. 方向分配先制造同向区域想要合并有个前提相邻格子的方向要一致。如果每个方块方向完全随机旁边的格子不是向左就是向右根本合不起来。所以新版先对方向分配做了一轮优化。旧版大概是这个方向能走随机挑一个。新版变成这个方向能走看看周围能不能一起走。核心思路检查每个体素点在6个方向上是否有阻挡找到当前可以移出的点选择一个使用次数较少的方向避免方向过度集中从该点开始向周围BFS蔓延能沿同方向移出的邻居也尽量分配同方向这样会自然形成一些同方向区域。同方向区域越多合并出来的块就越自然。3. 合并规则同色、同向、相邻合并不是乱合。当前规则很保守必须同时满足颜色相同箭头方向相同空间连续相邻还没有被合并过**为什么**三观不合的人还是比较难在一起的何况方块有上面4个条件。踩坑实录箭头贴图又扁了第一版合并跑起来后确实有变化了。但是马上发现一个问题长条块上的箭头和圆点被拉扁了。原因也很简单。旧版Shader里是直接按UV采样标准正方体没问题。但长条块的世界空间比例变了UV还按原来那样铺图案自然会被拉伸。解决思路是方块可以变长但图案尽量保持原比例。新版Shader做了几件事把贴图当成2x2图集找到当前UV所在象限用dFdx/dFdy估算UV在世界空间的真实比例根据比例压缩采样区域重映射texUV后再采样关键就是方块可以拉长箭头不要跟着一起拉扁。更进一步拖尾也要适配合并块上期已经做过拖尾效果当时是通过动态Mesh生成一条逐渐透明的3D色带。但是旧版方块都是小cube拖尾截面固定也还行。合并之后方块可能变成长条拖尾也要跟着变化。新版里做了这些调整根据方块的世界旋转计算局部截面方向使用worldScale.y和worldScale.z得到真实宽高拖尾网格按矩形截面生成四个角这样长条块飞出去时拖尾也会跟着变宽或变高看起来更贴合。最终效果改造之后方块不再全是同尺寸小cube。局部会出现长条、矩形、大块视觉层次更明显:旧版效果新版效果结语老板一句“变点花样”听起来像是简单的美术需求改起来却是需要点技术的。小伙伴们有没有哪些被老板一句话打动的瞬间本文实战完整源码已集成到亿元Cocos小游戏实战合集2.0已经拥有的小伙伴可以直接更新。我是亿元程序员一位有着8年游戏行业经验的主程。在游戏开发中希望能给到您帮助也希望通过您能帮助到大家。实不相瞒想要个赞和爱心请把该文章分享给你觉得有需要的其他小伙伴。谢谢推荐文章亿元Cocos小游戏实战合集2.0亿元Cocos小游戏实战合集1.0老板说最近这款游戏很火让我抄可是我连玩都玩不明白…最近很火的一个拼图游戏老板让我用Cocos3.8做一个…老板说拼图游戏太卷了让我用Cocos做个3d版本的…如何在CocosCreator3.8中实现动态切割模型