
接下来就到了这期的正式内容。这期的代码我断断续续写了三个星期,然后一半都没完成

所以完整的内容我可能会分两期,而且这期还有别的新玩意(尽量完整复原一个正常人是怎么写代码写崩溃的=(
首先要请出我们的老朋友,来自 橘白 的房间素材(铁打的素材流水的系列)。不过这次我们要随机房间大小,所以要把这张图片切成几块不重复的sprite

艹我不知道怎么切,我想把重复的删掉或者不切出来,网上搜不到我也不会······不过无伤大雅
切完之后我打算分析原版的地牢生成规律。我一开始的猜测是每个关卡都是模版,因为基本上游戏玩多了可以发现地图房间的分布大概率就那几种,而且有的时候可以猜到哪边通往传送门房。于是我在网上找到了各种各样的相关小图,把它们一个一个抄下来

“得先把一个房间生成出来再考虑一堆房间。”我的心里其实早就盘算好了,就用tilemap。
我学习的unity教程是2016年的,所以当我自信满满地打开菜单时,我意识到时代变了。“Assets-Create-2D-Tile···s?这些都是什么玩意啊?”

不过你永远可以相信官方文档。粗略看了一眼后,我决定使用ruletile(其他的要么看起来更高级不像是我一下子能学会的,要么根本看不懂)
一个新建的ruletile长这样

default gameobject/collider:官方新手教程说先别理它。官方说的我还能不听?
重点是这个number of tiling rule。直译就是平铺tile的规则数。我就跟着教程照葫芦画瓢地做了

现在可以在tile palette上画一下。这比我之前学的智能多了,tile会根据周围tile的变化自动变换,而以前是需要手动切换使用的tile的
点击链接观看视频“这样在代码生成阶段我就可以不用判断外围了!这么简单一天不就写得出来?”这就是噩梦开始的地方

“我考虑下素材放哪······”我本来想放到resources里的,以前也是这么学的。
但是我忘了啊!我又去浏览器搜,然后发现官方说不推荐使用resources,说是占内存而且会增加启动时间,且无法进行热更新。
关我啥事啊,我是电脑,不缺这点内存,而且热更新跟我一点关系都没有。我就头铁地继续使用resources+textasset路径配置文件,并且决定使用UWR(Unity web request,之前的www被弃用了)进行素材的加载
事实证明编程是“面向浏览器”,我压根就不会UWR,就去网上找了一段常用代码测试一下



最后不知道怎么就修好了。我寻思着就不用UWR了,直接Resources.LoadAll,后面再优化

我也不知道为啥,怎么样都加载不出来,网上也查不到解决办法,我就这么被迫地使用了更为复杂的assetbundle
首先我又去了官网查assetbundle的用法,找到了这么一个脚本,一键打包所有指定了标签的assetbundle





最后写了个工具类帮助加载资源和配置文件


当第一块瓦片出现在屏幕上的时候,两个星期的时间跨度让我恍惚着以为已经结束了。实际上差远了!我已经可以预料到这个系列结束时我总结什么了(刚开始就想着结束的屑)
我把地图生成器拆分成两个部分:template和decorator。template两者都有顶层的抽象接口进行统一,template负责整个地图的生成,decorator是单个房间的装饰。(decorator下期再写了,没素材,或许我可以去网上找点)可能有点状态模式或者策略模式(两者我不太分得清),再或者桥接模式(这个完全不懂,不要听我胡说)的味道?当然由于赶着收工,我没怎么规划代码,后面再考虑重构吧,而且我确实没什么经验,也不知道怎么写比较好




就这些破东西我就写了一天,而且一大半还是注释。到这里还好,下面才是真正的绝望
我看了很多关于元气的地牢生成算法,发现它们都没有让过道的长度都是一致的。所以不能复制粘贴(不是,是借鉴ᶘ ᵒᴥᵒᶅ)了。不过我倒是学到了几个有用的思路:
1.随机游走算法(超简易版),也就是拿一个点,让它自己乱走,走过的路径生成一个房间。要解决路径重复的问题
2.房间宽和高最好是奇数,方便把游走点放到正中央
······没了,因为我剩下的懒得看了,很多都过于复杂或者要碰撞体或者预制体,我一个都不知道怎么做,搜也搜不到。“自己······写?”被现实敲打过的我已经在半懵半绝望的状态了
接下来这套半完成的算法耗费了我两天的脑细胞(真的就是对着电脑坐了将近两天),但是更拉垮了,回到了上个系列的水平(低情商:就TM乱写)





这几百行代码前前后后憋了我好几天,今天终于写完了。看着也不复杂怎么我就写了这么久呢?中间由于没有断点我只能一个一个debug.log判断哪里出了问题。结果最后还是有bug(经典留下一期,我估计下一期就没有什么别的内容了)
点击链接观看视频我就用笨方法刷新了,真的懒得上网查那种编辑器拓展了(体内的摆烂基因开始发作),大家可以查一下方便测试
最后的bug是并不是所有的房间的间隔都一致。而且由于算法的缺陷,想要在两个房间中间添加过道的话基本只有一条游走点经过的路径,跟原版不符。而且出生房和传送房必须是最远路径且单一过道。这个可能还要再来个算法(被初中数学杀几百回的我还不给算法打成渣?)
在查微软官方文档时(没错我连C#的语法也忘了),发现了很多我之前没学过的中高级语法。可能还要找时间全部看一遍(还好有中文,要是英文我真的就想毁灭了)
好了就这样了。我也不知道下期是多久以后了。所以明年见!

来个首尾呼应(也不算太首)。总结:不要学编程