下载 App
开发日志②|用代码画机器:子弹工厂的美术、风格与物料
第一篇聊了《多米诺的子弹工厂》如何回应「涌现」。这一篇想换个角度,聊聊这些设施、机器人和界面,是怎么被一点一点画出来的。
一座子弹工厂里,有轨道、加工设备、炮台,也有不断来袭的机械敌人。它们不仅要各自有辨识度,还要放在同一张画面里,看起来属于同一个世界。

目前,游戏采用的是贴图与程序化绘制结合的方式:一部分使用图片素材,一部分由代码绘制形状,再根据运行状态加入动作和效果。
不过,用代码画出来,并不意味着视觉设计可以交给代码或 AI 自行决定。
一、程序化设施:先建立一套共同的机械语言
这里所说的「程序化」,不是随机生成机器,也不是直接生成一张完整图片,而是把设施拆成可以绘制和控制的部分。
底座、外壳、面板、图标,以及运行时的动作,都可以分别组织,再组合成一台设备。
如果每个设施都独立设计一套画法,数量增加之后,画面很容易变得杂乱。因此,程序化设施首先需要一套共同的视觉基础。
所以最初的一批设施,是我们的美术自己画出来的。

然后以美术画的这一批为参考,让 AI 去生成相同样式、风格的新建筑,再补上动画。这个方案把原本需要 3~4 天的美术工作量,压缩到了 1 天。
目前的设施绘制里,复用了圆角底座、蓝灰色底板、浅色边框和深蓝黑轮廓。四角的结构与边缘刻线,让它们保留一些机械装配的感觉;外壳和内部面板则采用分层平涂,避免细节过多,影响小尺寸下的识别。
在这套基础上,再用不同形状和功能色表现设备差异。
统一的不是每台机器的长相,而是它们的“造型语法”:即使功能不同,也能看出是同一座工厂里的设备。
游戏也并非所有设施都完全由代码绘制。一些炮台采用底座贴图与程序化上层结构结合的方式。固定部分可以保留图片里的设计,转动、状态变化等部分则交给程序控制。
二、让设施真正“工作起来”
静态外形解决了“这是什么”,动作则需要告诉玩家“它正在做什么”。
以机械铁锤为例,它的工作过程不只是突然落下一次伤害效果。
蓄力时,锤体逐渐抬升,图标从下向上填色;接近满蓄力时,通过抖动与发光加强预告;砸下时,再加入光圈和火花,强调加工发生的瞬间。

这些表现既是美术效果,也是状态反馈。
我们希望玩家不必一直盯着数值面板,也能从设备的动作里判断:它正在等待、正在蓄力,还是刚刚完成了一次加工。
程序化绘制适合承担这类变化,因为各个部件可以独立运动。但动作幅度、节奏、亮度和效果范围,仍然需要受到视觉设计的约束。并不是机器越晃、火花越多,就越有表现力。
工厂里会同时有很多东西运转,单台设备的表现,还需要考虑它在整张画面里的分量。
三、程序化怪物:属于同一家族,但不能只有换色
怪物同样采用了贴图与程序化绘制混用的方式。
程序绘制的机器人共享深色粗轮廓、钢灰色机体和红色独眼。这些元素建立起机械敌人的家族感,但不同类型仍需要有不同的轮廓和动作。
小型机器人使用圆头和短腿,通过轮流抬腿、身体起伏表现移动。

远程机器人则增加履带、炮口和雷达。蓄力时眼睛变亮,射击后产生后坐,让它的攻击过程有可见的预告和反馈。

装甲球的接缝与铆钉会随着移动转动,而眼窗保持相对稳定。熔炉机器人则通过摇摆、烟雾和炉火闪烁,突出它的结构特征。
相比单纯调整颜色,这些差异更能帮助玩家区分敌人。

Boss的表现也进一步拆到了部位:头部、躯干、铁拳、炮臂和腿分别绘制,部位受损后出现裂纹与黑烟。
这让损伤不只存在于血条里,也能留在怪物身上。
四、团队中的美术:把控的不是某张图,而是整套标准
在这样的制作方式里,美术的作用并不会因为程序化而减少,反而需要从单个素材延伸到整套视觉规则。
需要把控的内容包括:
- 造型语言:哪些地方使用圆角,机械结构保留多少细节。
- 描边与层次:轮廓的粗细、深浅,以及前后部件如何区分。
- 配色关系:哪些颜色作为基础,哪些颜色用来强调功能和危险。
- 动作表现:机器怎样蓄力、机器人怎样移动,什么程度的夸张合适。
- 整体密度:设施、敌人、子弹和特效同时出现时,画面是否仍然清楚。
程序负责把这些规则转化为可绘制、可运动、可随状态变化的实现,但不能只检查“形状有没有画对”。
一个设施单独看起来不错,放到整座工厂里,可能会显得过亮、过细,或者抢走其他信息的注意力。因此,视觉统一最终需要在实际游戏画面里判断,而不是只看单个素材。
程序化提供的是调整与复用的能力,美术则决定这些能力应该朝什么方向使用。
五、UI也要属于这座工厂
视觉统一不能停在场景里。
如果设施是一套风格,按钮和面板又像来自另一个游戏,玩家打开商店或存档界面时,整体感就会被打断。

目前,界面延续了圆润的灰蓝底框、浅色内边和深色轮廓。文字使用高对比的白色字芯与深色描边,让它在复杂背景上仍有明确的边界。
资源栏、按钮和弹窗尽量共享这套语言,同时用蓝色高亮表达选中,用红色提示危险操作。
交互上,悬停和按压时的小幅晃动,也让界面保留一些轻快的机械玩具感。
提示栏与文本框,我们用了纯色圆角的大色块:简单、直接、可读性强。这类 UI 不属于场景的一部分,必须与场景做出明显区分,让玩家一眼就能读到信息。


不过,UI并不需要照搬设施的所有细节。它首先要让信息容易找到、操作容易理解。装饰应该帮助建立风格,而不是让按钮看起来更复杂。
六、寻找美术风格的过程
前面讲的是现在的样子,这一节往回倒一倒,讲讲这套风格是怎么找出来的。

这是我们第一天让 AI 制作的原型。
方向讨论清楚之后,美术就开始对着这个原型推风格了。

图:清新蓝白风格。干净,但放进工厂场景之后偏冷、偏弱。

图:高饱和蓝色。足够醒目,但长时间游玩容易疲劳。
寻找风格的过程中,我们其实撞上了一个更要命的问题:子弹做出来之后,要怎么发射出去?
我们停下手头的工作,两个人对着这个问题讨论了一下午,最后定下方向——做成塔防。
方向一定,美术也跟着有了方向。我们以前开发过一款独立游戏《元素与构筑》,美术对这种风格有把握,当天晚上就画出效果图,确定了最终版。

图:最终版风格。灰蓝打底、高饱和的功能色点缀,兼顾辨识度和长时间游玩的耐看性。
七、物料生成:AI 出图快,但风格得拉回来
是的,为了加快开发速度,我们的大部分物料都由 AI 生成。但生成只是起点:AI 出图快,风格却统一不了——不同批次的图,饱和度、描边粗细、光感都不一样。所以每张图进游戏之前还要过一遍手:统一描边、压掉过亮的高光、把色相拉回灰蓝,让它们看起来仍然属于同一座工厂。



写在最后
从第一天的原型,到现在的画面,我们做的事其实只有一件:让所有东西看起来都来自同一座工厂。程序化提供快速调整与复用的能力,美术决定这些能力该朝什么方向使用——这两件事缺一不可。感谢各位开发者的观看游戏已上线,感兴趣的老师们可以去玩玩提点建议











