展示片,87 秒,无声。由导演脚本驱动虚拟指针与按键、离屏逐帧渲染;这里是压缩到 720p 的版本。
概览
一套原创的小型游戏界面,用来展示“把界面设计稿在引擎里搭成程序可以直接使用的界面资源”这件事:自适应、多语言、控件化、资源规范、性能、交互手感、UI Shader、设计稿还原,以及配套的生成与检查工具。
界面包括大厅、背包(10000 条数据的循环列表)、星灵(角色详情)、设置、控件陈列室、设计稿对比和三种弹窗。Unity 2022.3 LTS,内置渲染管线,UGUI + TextMeshPro,没有第三方插件。
自适应:一份 Prefab,四种宽高比
界面不读屏幕尺寸,只读“设备”渲染目标,所以同一个包可以在运行时切换比例,布局实时重排。4:3 到 21:9 之间没有断点,只靠锚点、Layout Group、Content Size Fitter 和 Aspect Ratio Fitter;列表列数由宽度算出。竖屏是同一个 Prefab:差异写在 JSON 的 portrait 块里,没有第二份层级。




多语言:溢出是设计出来的
中 / 英 / 日 / 德实时切换,四种语言共 205 条文案,键由脚本校验对齐。德语专门用来压测长文本。每个文本节点在 JSON 里都必须声明溢出策略:
- 缩字号有下限:标题、物品名、定宽按钮先缩到约 70%,再不够才省略
- 省略号:下拉当前项、定高的描述
- 随文本撑开:自由宽度的按钮由文字决定宽度
- 换行:说明文字自动换行,德语复合词内置软连字符
- 横向滚动:页签放不下时可滑动,边缘渐隐
字体回退链是 Outfit → Noto Sans SC → Noto Sans JP,切到日语时后两者交换;静态 SDF 图集只烘焙语言表里出现的字符。

控件化与资源规范
界面里没有一次性的散装节点:23 个基础控件加 10 个 Prefab Variant,6 个界面和 3 个弹窗全部由控件的嵌套实例拼成。每个界面根上有一份 ViewRefs,程序按 id 取用节点,不依赖层级路径。
规范写成代码而不是文档:命名由检查工具校验,导入设置由 Postprocessor 强制,图集由脚本按文件夹生成(公共一个,每个界面一个)。面板、按钮底板、进度条、投影、发光、雷达图和徽记都由 Shader 绘制,全工程的贴图只有图标、星灵的图层和三个九宫格边框,源文件都是脚本里的 SVG。

星灵:没有动画片段的角色
角色页有两只可以切换的星灵,「枕月」和「栖光」。它们不是一张立绘:枕月由 16 张 SVG 图层、32 个图元拼成,栖光是 17 张、35 个。没有动画片段,动作全部是程序化的——每个部件有自己的延迟和幅度(帽尖和绒球滞后于身体),会动的光交给 Shader。
枕月平时在打瞌睡:摇晃、点头、鼻涕泡随呼吸涨缩;指针靠近时半睁眼,点一下会惊醒;升级时伸懒腰、跃起翻一圈。两只星灵各有一套数据,用同一个切换器控件切换,属性条、雷达图和下方的物品格跟着换。


性能:优化前后都是实测值
基准跑在打出来的 Windows 包里:同一批数据、同样的滚动距离,分别测对照组(全部实例化到 GridLayoutGroup + ScrollRect)和循环列表。
| 10000 条数据,滚动 300 帧 | 全部实例化 | 循环列表 |
|---|---|---|
| 每帧耗时(无窗口、不限帧) | 213.68 ms | 2.97 ms |
| 最差一帧 | 329.55 ms | 7.78 ms |
| 格子 / GameObject | 10,000 / 60,000 | 100 / 600 |
| 构建耗时 | 1,823 ms | 0 ms |
| 窗口模式,垂直同步 60 Hz | 10.6 FPS | 60.0 FPS |
测试机:Intel Core i9-9900K、NVIDIA GeForce RTX 2080 Ti,1920×1080,只在这一台机器上测过。每次重跑数值会有小幅波动,这里是 2026 年 10 月 1 日这一次的结果。
也有测了之后决定不做的:给列表单独拆嵌套 Canvas。耗时差异在测量噪声内(2.97 ms 对 2.89 ms),Batch 反而从 37 变成 38——这个界面里列表本身就是绝大部分图元,没有可隔离的静态内容。对照数据留在基准里。

设计稿还原:先出稿,再搭建,最后量差异
背包界面的设计稿先用 HTML / CSS 写出来,浏览器渲染成 1920×1080 的 PNG,再在 Unity 里按稿搭建。两边只共用设计 token、文案、字体、图标和背景图;布局、文字渲染、模糊各自实现。
对比工具做在游戏里:左右滑动、叠加、热力图三种视图,数字在运行时由两张图逐像素算出——差异像素 6.72%,平均误差 2.05%。差异集中在文字抗锯齿、1px 以内的图标边缘和面板投影的衰减曲线,布局位置没有成片的偏移。


工具:界面是数据,Prefab 是生成物
- 生成器:JSON 界面描述 → Editor 脚本生成 Prefab 与场景。43 个 Prefab、两个场景、材质、图集和字体图集全部由脚本生成
- Prefab 检查工具:多余的 Raycast Target、未进图集的 Sprite、命名不合规、缺失引用、Layout 嵌套过深、Canvas 缺少 Shader 通道,带一键修复。它第一次跑时在工程自己身上查出了 91 处命名问题和 4 处嵌套过深,改完之后是 0
- 流水线:Unity 以
-batchmode运行,截图矩阵、基准、展示片和 PDF 可以用一条命令从源文件重建
自写的部分还有 UI Shader(SDF 圆角矩形、描边、渐变、流光、毛玻璃、溶解、雷达图,以及星灵用的几个发光 Shader)和一个每帧零分配的 Tween 库。鼠标、触摸、手柄与键盘都能完整操作。

已知局限
- 没有真机测试:竖屏、刘海和安全区是在 Windows 包里模拟的,触摸与实体手柄没有在设备上验证过
- 设计稿对比只做了背包界面一屏(16:9、中文)
- 没有音效和音乐
- 检查工具的 Editor 窗口没有截图:工程全程以无界面的 batchmode 制作,展示的是它导出的报告