跟着元气学编程【4】:相机跟随

2022/10/06130 浏览综合
首先就是我又又换了一种随机移除房间的算法,也就是说上期确实什么都没干。我本来打算这期写如何卸载unity的,因为每次运行都有几率直接崩溃,根本没法调试。直到我搜到了一篇文章,里面有人跟我有一样的问题。答案也很简单——检查并删除无限循环。
在程序里面到处乱看,寻找可能的无限循环。最开始觉得是一个使用递归检查的函数可能会无限循环,但仔细一想又不对,无限递归应该会抛栈溢出的异常,而不是直接崩溃。我尝试下函数断点,可是真的找不到,而且很恶心的一点是,程序断开单步执行不会崩溃,如果想单步跳过看接下来的操作,那出大事了,直接崩溃。
几天里我都是一边喝水,一边抱着必死的心态开启一个个调试。我和断点四目相对,单步跳过的按钮怎么也按不下去,按了unity裂开,不按我裂开。在unity裂成丝的时候我决定换个算法,解决bug代码的最好办法就是直接删除。
但是这算法怎么换呢?我想到上次的思路是建立房间与map的联系,那直接在map里搞得了。还是使用递归的方法,就是头铁怎么着吧。
TapTap
TapTap
头铁的后果是同样的情况再次发生。但这次不能再耗unity和电脑的阳寿来调试了,我选择设置个临时变量times,一旦被调用次数超过50次就抛异常,强行终止运行。上面给出的其实已经是当前算法的完整版本加上曾经的调试。中间发生过很多曲折的事情,每个注释都是血的教训。
不得不说map版本的递归路径检查比上次简洁很多,因为它没法正常运行。我最开始就想错了,这样完全无法检查路径连通性,而且还导致了诡异的bug:绘制房间时有房间的中心点是重叠的。我不知道这个算法和更改中心点有什么关系,我根本就没碰过。怀疑是GetCurrent的锅,因为我改成这样了。
TapTap
暴躁嵌套,极致享受。反正封装起来之后就看不到了,看不到就没有了。目前还不知道这玩意能不能正常运行,我现在哪些代码能运行都不知道。不想思考怎么修复了,我再换个随机移除的算法。
TapTap
以上是我的新想法。这个想法最简单了,因为想到这个算法时我的脑子抽得最厉害。我简单地想着被移除房间也是连着的(可能是因为之前测试不完整算法时移除的房间总是连着的,导致我被误导了),所以直接随机选个点作为种子,然后围绕这个种子进行移除。效果倒也有,而且很丝滑,错得很丝滑。
(录了这么长的原因是中间竟然连续成功了几次)
等一下我发现了个问题。“被移除房间是连着的”这个命题不成立,但是“正常房间是连着的”这个命题肯定成立啊,那我们……
TapTap
直接拿上面那个算法去生成不就好了吗……这也是最开始的算法,好家伙三期白干。
写完了,目前运行良好。还有另外一个好消息,GetCurrent函数因为新的算法得以缩减成一行代码,终于摆脱了死亡嵌套。等我再写个房间随机大小和过道和特定起点终点房生成和人物出生点传送《就》可以结束了。
9月22日开始写的代码,现在已经是国庆了。稍微写了一套随机房间大小的代码,不仅结构混乱代码丑陋,效果也很诡异,因为我把参数调太大了,导致生成的效果就很……放几段让大家感受下。
(竟然成功了一下)
参数调小一点就不会这样了。可是并没有从根源解决问题,有关间隔长度的问题还是没解决。不想这期搞了,根据这么多期的经验,反正下一期就把上一期的代码删的差不多了,不如直接留到下一期。单纯随机房间的效果如下。
我觉得还行,目前为止最接近原版的算法。就这么结束了吗?还是再塞点内容吧,顺便做个相机跟随。
在远古时期,相机跟随是要自己写脚本的。随着时代的变迁,unity官方推出了cinemachine,让相机有关操作变得非常简单(甚至还能用unity拍动画电影,但是好像没必要)。
直接去package manager搜cinemachine下载就行了。接下来的操作……等一下让我看看文档,我也不会(・・;)
啊懂了。安装后gameobject选项中会出现cinemachine,点击选择virtual camera后点到新建的virtual camera的inspector,在follow字段把要跟随的物体拖进去,就完事了。
等下,就完事了?这么简单?事实证明确实如此,如果我们只想要跟随这一个功能。目前效果如下。
甚至连摄像机缓冲都给你准备好了。有史以来最快乐的一期。最后贴个代码,这期就结束了。
TapTap
TapTap
TapTap
不记得在哪看的了,说异常比较影响性能。感觉应该把GetValue改一下,不过用的不多可能不会有太大影响。
事实上C#里的迭代器并没有跟我一样实现的这么潦草,内部是一个类似于状态机的东西。懒得改了,我就说我的这个东西是盗版迭代器。
下期继续搞地图生成,估计还做不完。我已经做好写1年的准备了,中途穿插别的东西,跟这期一样。题目统一写除了地图生成以外的内容,关于地图的编不出来了。
TapTap
8
2
4