下载 App
《我是你祖宗!》开发日记第五天
大家好,我还在做那款竖屏家族传承游戏《我是你祖宗!》。
这一篇会比较长,因为这周做的事分成两半:一半在修「你以为是自己点错了」的错,一半在给玩家多留几只手能扳的杆。
先说修的那半,因为它是这周最疼的。
一、页面每隔一个就丢一个,所以你点谁都没反应。
这是这周最狠的一个 bug,也是我自己写的。
现象是:进了游戏,主页上该有的东西只剩一半——目标卡在,家族关系图不见了;建议卡在,指引卡不见了。你点后辈的头像,没反应。你点「过一年」,能过。你点「托梦建议」,没反应。
我一开始以为是按钮没接上,查了半天按钮都是好的。后来才发现,问题在换页的时候:我为了不闪屏,先把新内容建在一块离屏区域里,建完再一个个搬进可见的页面。搬的时候我写的是「遍历子节点、逐个搬走」。
问题就在这。那个「子节点列表」是活的——你把第一个搬走,列表自己就往前挪一位;循环接着读第二个,读到的其实是原来的第三个。于是我只搬走了第 1、3、5… 个,剩下的还留在离屏区,跟着那句「销毁离屏区」一起被干掉了。
而家族关系图,正好是第二个。
所以这个 bug 的可怕之处不是它坏,是它坏得很有规律:一半的东西还在,一半没了。玩家不会觉得「这是个 bug」,他会觉得「这游戏就是这样,点头像大概要点别的地方吧」,然后退出去。
改成「一直搬第一个,直到搬空」,好了。
二、进游戏会顿一下,然后音乐放一遍就没了。
黑屏那个我上一篇说自己修好了,这周发现只修了一半:图是预热了,但是一帧里全解完,五十多张图挤在一帧里,等于从一个黑屏换成了一个卡顿。现在改成分帧预热,进度条真的会动,一帧只解七张。
音乐那条更冤。我一直以为 BGM 是循环的,因为我在代码里写了 looped = true。这周翻引擎文档才发现——looped 是「音频资源」的属性,不是「播放器」的属性。我把它写在了播放器上,等于往一个不存在的地方塞了个字段。所以背景音乐从来都是放一遍就没了,大约三分半之后,游戏就安静了,而我以为它在循环。
三、更荒唐的一处:资源是「用到才下」的。
我加了日志,看了一次真机运行的记录,发现一次游戏里出现了 一百多条「正在下载」——音频、场景图、界面皮肤,全是第一次用到的时候才去取的。
也就是说,你点开一封来信,那一帧要先把这封信要用的场景图下下来、解开,才画给你看。这就是「点一下,卡一下」的真正来源。
我把构建配置改成启动时全量预下载(资源已经被我压到 16MB,代价很小),同一次运行的下载记录从 100 多条变成 1 条。三首 BGM 也改成进游戏前就全部读进内存,切菜单、走到终章,不再现场读盘。
四、我给自己挖了个坑,把整个游戏弄进不去了。
这条必须写,因为它是这周最难看的。
上一篇我为了减少重复计算,给主页加了个「数据签名」:把家族状态拼成一个字符串,没变就跳过重算。拼的时候我顺手写了 Number(game.year)——可那个文件里根本没有 Number 这个东西(别的页面有,它没有)。于是这行代码一执行就报错,而它挂在进游戏的必经之路上。
结果就是:点「继续」→ 直接进不去。
更丢人的是,这个错是我自己上一轮引入的,而我是靠玩家侧的崩溃日志才知道的。我现在的做法是:每次改完,除了全量语法检查,还要跑一个本地「冒烟探针」——它真的新开一局、真的建首页、真的把五个页签挨个刷新一遍、真的过一年,然后逐条断言。这周这个探针一共跑到 52 条断言,全过。「编译通过」和「能玩」是两件事,这一周我记住了。
五、不符合你现状的事,不要弹给你。
原来事件是按「年龄、路线、有没有田、有没有善行」筛的,看起来很合理,实际上很尬:
你身上只有 8 文钱,它问你「要不要出 30 文帮邻居」;
你连个铺子都没有,它问你「伙计的婚宴随多少份子」;
你家里没人做官,它问你「衙门里那件事怎么办」;
它上上年问过你一次「族中的秤」,今年又来一遍。
现在加了一道闸门:钱不够的、身份对不上的、家里没田没铺没官的、功名已经到头不该再被问乡试的、同一个题目刚问过的——都不弹。
代价是事件池变小了。但换来的是:每一条弹出来的事,你当下都真的能处置。
六、然后是我这周真正想做的事:多给你几只手。
上一篇我担心一件事:这游戏是「涌现」的——规则自己跑,结果自己长出来,不该由玩家直接指定。可太克制了也不行,玩起来会像看一个自动播放的族谱。
所以这周我加的东西,全都遵循一条线:给玩家「规则的杆」,不给「结果的按钮」。
岁政:每年可以定一条族规。劝农(田收+12%,但培养−10%)、崇文(培养+12%、中式率+3%,但田收−6%)、团练、节用、赈恤。一年只定一次,定了不能反悔,跨年自动失效。没有只赚不赔的选项——你得看今年家里缺什么。
托梦语气:以前只能选「劝他读书」,现在还要选「怎么劝」。温和抬采纳率、严厉降逆反但容易被拧着来、以身作则让听进去的人自己再长一点。语气只改「怎么劝」,不改「劝什么」——后辈照样可以不听。
族学课程:书塾办起来之后,可以选教经义、算学还是武备。它不改路线,只把每年的自然成长往一边偏一点。
房头分工:分家出去的房头不再是纯负担。可以派去协办税粮(减田税)、督耕祖业(加进项)、督课子弟(加培养和中式率)、护院守夜(减外患)。每房一职,可随时改派;凋敝的房头接不了差,得先安抚人心。
分产再平衡:给某一房再拨一亩,它会明显回暖,但祖田变薄、其余房头会不满;收回一亩,祖业回血,那房离心加深。你是在天平两端加砝码,不是在下命令。
灾年预案:平时在族务里定好,真逢旱岁薄收时自动执行。开仓放粮(耗仓粮换人心与名望)、减租安佃(再让一成收成换善名)、照常催征(保住田租但积怨)。
开仓赈济:赈田份例在手时,可以三年一次开仓救荒,换善行、人心与世交名望。
加上之前已经接上的家业×科举(书塾每级 +中式率、塾师再叠一层,并且科举面板会把加成来源拆开写清楚),现在这些系统是真的互相咬着了,而不是各算各的。
七、美术、声音、体积。
补了 22 张美术:4 张结局插画(不朽、开国、家谱终章、香火散尽)、3 张产业图(书塾/药铺/货栈)、12 枚成就分组印章、3 张场景图(官衙、校场、节庆庙会)。顺手修了一个偷懒的地方:以前「做官」和「练武」的人显示的是同一张场景。
补了 5 个专属音效(婚嫁、金榜、节庆、终章、不可用提示)和 2 首新 BGM(主菜单《家灯初上》、终章《灯尽香沉》)。以前整局只有一首曲子,菜单还是静音的。
体积:assets 从 80MB 砍到 16MB。不透明插画转 JPEG、立绘降到实际需要的分辨率、清掉 43MB 没人引用的旧原图、删掉四个从不加载的字体(其中一个 15MB)。这不是给压缩率做体操,是让下载安装快一点、移动端内存松一点。
八、性能的收尾。
页面重建一次在本机是 7ms,手机上大概 20–30ms——也就是你每点一次有效操作,掉一帧。这周做了两件事:
数据没变就不重建:给页面算一个签名(年份、钱、香火、人口、成员路线与进度……)。签名一样就只刷新页眉数字,实测从 7ms 降到 1.95ms。动作失败、重复点同一项、开关弹层,都不再白重建一遍。
弹层打开时不重建背后的页面:托梦、产业、族务、科举这些操作全在弹层里,背后页面反正被遮住了,等关掉弹层再补建。这一条直接省掉了大部分动作的重建开销。
顺带把「每次重建都打一行控制台日志」也删了——日志文件是每五秒落盘的,重建频繁时那是实打实的磁盘写入。
这周我学到什么。
上一篇我写:难的是让已经做出来的东西,说到做到。
这一周我想加一句:更难的是让玩家「有得选」,同时又别把选择变成答案。
岁政、语气、课程、分工、分产、预案——这六个东西都不是「按下去就赢」,它们是六个方向盘。你把力气压在哪一头,后辈会怎么长、家里会怎么塌、哪一年会翻车,仍然不归你管。
这正是我想做的那种游戏:你只能调规则,不能替他们活。
一棵祖宗留下的种子,能不能长成一片森林?这一周我在做的,是给这片森林多加几阵风。













