反模式 02 · 坏例 → 好例改写对照
反模式 02 · 坏例 → 好例改写对照
同样的场景,两种做法。左边是独立游戏常见的错误做法,右边是正确的。
1. 面对"想要更漂亮的画面"
❌ 坏例
"我们想让画面更精致,所以打算:把所有纹理提到 2048,给每个资产单独做材质,加上 SSAO + DOF + Bloom + 色差 + 动态模糊,再上一个实时 GI 插件。"
问题:没有预算表;没有招牌;技术堆叠;纹理浪费;每个资产独立材质(破坏合批 + 风格散)。
✅ 好例
目标:让画面更有辨识度,帧预算 GPU 后处理只剩 1.5ms。
方案:
- 招牌:全场景手绘笔触噪声法线 + 边缘溶解(3 天,0.8ms)——这是我们的那一招
- 母材质:3 个(环境/角色/植被),所有资产重映射,覆盖率目标 90%
- 纹理:保持 1024,Rough/AO/Metal 打包成 ORM,省 2 次采样
- 后处理:保留 LUT + 颗粒 + 半分辨率 Bloom(0.9ms),去掉 SSAO(改用烘焙 AO)、DOF、动态模糊
- 降级:招牌技术有画质开关,低端机关闭笔触噪声
预算:GPU 后处理 1.5ms → 0.9ms;纹理内存 -30%;DrawCall -40% 不做的:实时 GI、SSAO、DOF、2048 纹理、独立材质
2. 面对"玩家看不清敌人"
❌ 坏例
"敌人颜色改成红色,更醒目。"
问题:只靠色相(最不可靠通道);色盲无效;没解决根本的明度分层问题。
✅ 好例
问题:敌人在暗场景中与背景明度差仅 12(L*),灰度下不可分辨。
方案(三通道冗余):
- 明度:敌人 shader 加明度保险,
_MinLuminance保证 ≥ 背景 +35 L*- 运动:加 Rim 光(Fresnel,强度 0.4),任何背景下都浮出
- 形状:加背面外扩描边,宽 2px 屏幕空间恒定
- 额外:被遮挡时用纯色剪影显示
验证:灰度测试 ✅ / 红绿色盲模拟 ✅ / 缩略图 320×180 ✅ 成本:0.1ms(共用母材质,无新增变体)
3. 面对"战斗打击感不够"
❌ 坏例
"我们做了更华丽的挥剑特效,加了 200 个粒子。"
问题:数量不等于手感;200 粒子会 overdraw 炸;没有 hitstop 和音效同步。
✅ 好例
时间轴(t=0 命中):
- t=0:Hitstop 80ms(时间缩放 0.05,特效用 unscaled time 继续播)
- t=0:受击者闪白 2 帧
- t=0:音效同帧播放
- t=0:屏震 5px / 150ms / 12Hz(<20Hz 防晕)
- t=0:命中粒子 8 个(锥形喷射)
- t=60ms:冲击波环 mesh 缩放 0.5→1.5 淡出
- t=80ms:Hitstop 结束,击退位移 0.3m
- t=150ms:屏震结束
粒子:8 个(不是 200),overdraw 贡献 0.3 层 成本:GPU 0.4ms 关键:音效与闪白同帧;Hitstop 期间特效不冻结
4. 面对"美术每天花很多时间导资产"
❌ 坏例
"我写了一个通用的资产管理系统,有数据库、有 Web 界面、有权限管理。"(3 周)
问题:ROI 极低;维护成本无限;美术不一定用。
✅ 好例
最小方案(合计 2.5 人天):
- 导入预设脚本(1 天):按命名后缀自动设 sRGB/尺寸/压缩/格式
- Blender 导出预设(0.5 天):一键导出正确的 FBX(单位/轴向/应用变换)
- 批量材质实例生成(0.5 天):按贴图名自动建实例挂母材质
- 校验器(0.5 天):菜单一键跑,输出可点击的错误列表
ROI:
- 导入预设:2 分钟 × 500 次 = 16.6h / 8h = 2.1(+ 消除 500 次人为错误)
- 导出预设:3 分钟 × 300 次 = 15h / 4h = 3.75
- 批量实例:5 分钟 × 200 次 = 16.6h / 4h = 4.2
- 校验器:避免后期 40h 大扫除 / 8h = 5.0
不做:Web 界面、数据库、权限系统
5. 面对"想要那种说不清的氛围"
❌ 坏例
美术:"你想要什么样的?" 设计:"就是……那种感觉,你懂吧。" 美术:"……我试试看。"(做了 3 版都不对,浪费 2 周)
问题:用形容词沟通;没有翻译方法;迭代靠猜。
✅ 好例(三小时工作流)
0:00–0:20 问内核 "玩家在这里应该感到什么?" → "孤独" "绝对不要感到什么?" → "不要温馨,不要有希望"
0:20–0:40 排序参考图 从情绪库挑 5 张,让设计只排序(不描述)→ 排序结果:大负空间的排前,暖色的排最后
0:40–1:00 反推视觉语法 构图:大量负空间 · 光:单一冷光源 · 色:低饱和冷色 · 运动:慢
1:00–2:00 做原型(不新建任何资产)
- 角色屏幕占比从 22% → 7%(相机拉远 + FOV 从 60 → 35)
- 指数雾 density 0.015 → 0.045
- 环境饱和度 -35%,主体对比度 +40
- 相机跟随阻尼 ×1.8
- 加缓慢上升的尘埃粒子
2:00–2:30 拉设计到真机前,只问"更接近还是更远了" → 迭代 2 轮
结果:3 小时锁定方向,0 个新资产,全是参数调节
6. 面对"要不要上 Lumen / Nanite"
❌ 坏例
"UE5 有 Lumen 和 Nanite,都开呗,反正引擎自带。"
问题:没测过;没考虑最低机型;没有降级方案;可能不是你的招牌。
✅ 好例
Lumen:
- 成熟度 80%;成本 2.5ms(Low 档预算只有 1.5ms 阴影+GI)
- 本作是静态场景为主 + 手工布光,GI 动态性收益低
- 决定:不开。用烘焙(0.2ms)+ Light Probe,省下 2.3ms 给招牌
- 复审条件:若未来加入"可破坏光源"玩法再评估
Nanite:
- 本作是低模风格化,模型本来就很轻,LOD 收益接近零
- 代价:磁盘 +40%,内存 +25%,打包时间 +50%
- 决定:不开
替代投入:把省下的 2.3ms + 一半磁盘预算,全给招牌技术(体积光 + 尘埃)
7. 面对"买的素材包太多,风格不统一"
❌ 坏例
"算了,凑合用吧,反正玩家看不出来。"
问题:玩家一定看得出来;评测会直接写"画面拼凑感强"。
✅ 好例(素材包统一流程,1–2 人天)
- 重映射母材质:所有资产改用项目的 3 个母材质(脚本批量)
- 色板重映射:写工具把贴图颜色吸附到项目色板(或调 Tint 参数)
- 统一比例:批量缩放脚本,统一到项目模数
- 统一老化:所有材质套用同一个
_Wear范围- 统一笔触:加一层项目的手绘噪声遮罩
- 校验器:禁止非母材质资产提交
- 台账:登记授权与使用范围
结果:1.5 天把 3 个素材包统一成一个世界
8. 面对"渲染做的很漂亮但玩家记不住"
❌ 坏例
"我们再多做几个场景,内容量上去就好了。"
问题:数量不等于记忆;没有招牌和记忆点。
✅ 好例
诊断:剥离测试 = L1 装饰(换皮也成立);记忆点 0 个;无招牌技术
处方:
- 选招牌:本作内核是"被注视",选屏幕外暗示系统(投影 + 声音先行 + 前景剪影)作为招牌,5 天做到极致
- 记忆点 ×3:
- 第 2 关:第一次看到"巨大影子掠过但本体从未出现"(奇观)
- 中段:发现影子其实就是自己(机制转折)
- 终章:影子转身面对玩家(情绪爆点)
- 每个记忆点独占性能预算 + 3–5 秒停留 + 音效配合
- 色彩脚本:从冷灰 → 逐渐去色 → 终章单色
- 其余全部降到 60 分:场景减半,资产复用率拉到 80%
结果:内容量 -40%,记忆度大幅提升
9. 面对"要出货了,发现掉帧"
❌ 坏例
"快!把所有特效关掉,纹理降到 512,关掉阴影!"(画面崩坏,且不知道真正原因)
问题:没定位就乱砍;牺牲了不该牺牲的东西。
✅ 好例
- 定位(1 小时):真机 Development Build + GPU 分析 → 发现透明 pass 占 5.2ms(预算 2.0)
- 归因:两个全屏透明粒子层 + 软粒子深度采样 + 全屏半透明 UI
- 精准修:
- 大气粒子层降采样到半分辨率(-1.8ms)
- 关掉软粒子深度采样,改用高度淡出(-0.9ms)
- UI 全屏半透明层改为不透明 + 局部透明(-0.6ms)
- 粒子数 -40%,尺寸 +60%(-0.7ms)
- 结果:-4.0ms,视觉几乎无损,纹理和阴影一个没动
教训:先量,再改。永远不要"凭感觉砍画质"。
10. 面对"TA 太忙了"
❌ 坏例
继续加班救火,每天处理 10 个不同的问题。
✅ 好例
诊断:连续 3 周都在做 L0 救火,没有积累任何杠杆
处方:
- 统计本周 10 个问题的类型 → 4 个是"导入设置错误"、3 个是"材质用了独立材质"、2 个是"命名不规范"
- 针对性建杠杆:
- 导入设置错误 → 导入预设(0.5 天)→ 消灭一类问题
- 独立材质 → 校验器 P0 拦截(0.5 天)→ 消灭一类问题
- 命名不规范 → 批量重命名工具(0.5 天)→ 消灭一类问题
- 结果:1.5 天投入,每周省 8 小时救火时间
铁律:同一个坑掉第二次 = TA 失职。
通用改写公式
遇到任何问题,按这个顺序重写:
① 量化现状(数字,不是感觉)
② 定位原因(归因到具体模块/技术)
③ 链接内核(这个服务于内核吗?)
④ 给 2–3 个方案 + 各自的成本数字
⑤ 选一个,写明不做什么(Non-Goals)
⑥ 写明降级方案与开关
⑦ 写明验收标准(可测量)
⑧ 记录决策与复审条件