U
章 04世界与游戏循环7 课 — 点击打开
07 / 07 · 22 分钟
世界与游戏循环★ 练习

练习:它变成了一个游戏

到目前为止的项目▸ Arena.unity

everything from tab 01–04 · a run you can win or lose

练习3–4 小时

把竞技场变成一个像样的地方,再把它变成一个游戏。在你一直用来交战的那些方块周围雕刻地形,烘焙光照,撒下几百棵树,加上环境音——然后接上三波进攻、失败画面和重玩按钮。60 FPS 依然要稳得住。

复用的东西

Terrain sculpt + layersTerrain 雕刻与图层Baked lightmaps烘焙好的 lightmapSkybox + fogSkybox 与雾Prefab variantsPrefab 变体PropScatter + raycast道具散布与 raycastLOD + batchingLOD 与合批Audio mixer音频混音器GameDirector wavesGameDirector 波次
动态图解

还是那个竞技场,现在成了值得在其中一战的地方——而且你真的会输。

分五个阶段来建

阶段 1 —— 灰盒搭建

在贴任何贴图之前:先塑造出地形的起伏,再操控角色走一圈。灰模阶段的空间如果本来就无聊,种多少棵树都救不回来。

  • Terrain 设为 200 × 200 m,heightmap resolution 513,位置放在 -100, -0.05, -100。

  • 用 Set Height 在现有方块网格周围压出一块约 40 × 40 m 的空地 —— 别把方块挪走,而是绕着它们建世界。

  • 把四周抬高了做成山丘,让玩家看不到 Terrain 的边界。

  • 全部 Smooth 两遍。地形扎手,是新手第一个场景最明显的破绽。

阶段 2 —— 材质与模块化零件

  • Terrain Layer 最多四层:草地、土路、坡面的岩石,再加一层点缀。

  • 每层 Tiling 设成 10–15 m,让重复花纹看不出来。

  • 按 1 m 网格用 6 个模块拼一间小屋:地板、墙、带门的墙、转角、屋顶、台阶。

  • 给墙做两个 Prefab 变体 —— 石墙和木墙 —— 这样小屋和废墟能共用同一个基础。

阶段 3 —— 靠撒,别靠摆

run PropScatter from the component's right-click menu
Trees        count 180   radius 80   scaleRange 0.85 – 1.35   groundMask = Terrain
Rocks        count  90   radius 70   scaleRange 0.6  – 1.8    groundMask = Terrain
Grass tufts  count 260   radius 45   scaleRange 0.8  – 1.2    groundMask = Terrain

// the slope check in PropScatter is what keeps trees off cliff faces
if (Vector3.Angle(hit.normal, Vector3.up) > 30f) continue;

阶段 4 —— 打光

  • Directional Light 放在 50, -30, 0,Mode = Mixed,柔和阴影,intensity 约 1.1,颜色偏暖一点。

  • 把每棵树、每块石头和每个小屋零件都勾上 Static。Knight 和敌人保持动态。

  • 先在 Lightmap Resolution 10 下 Bake 一次看效果,最终版再用 30 烘焙一次。Window▸Rendering▸Lighting。

  • Fog 的颜色对齐 Skybox 的地平线,用 Linear,start 90 m end 150 m —— 然后把相机的 Far 降到 160。

阶段 5 —— 声音与优化

  • 一条 2D 环境音底(风 + 鸟叫),小屋里放一个 3D 音源(篝火),脚步声用 Animation Event 触发。

  • 给树的 Prefab 加 LOD Group,两级 LOD 再加一个 Culled 区间。

  • 在树、石头和草的材质上开启 GPU Instancing。

  • 在 Quality settings 里把 Shadow Distance 设为 40,然后打开 Profiler,对照下面的指标看是不是真的达标了。

做到这些才算完

  • ✓操控 Knight 从小屋走到树林边,既不会撞到隐形墙,也不会掉出地面。
  • ✓站在场景任何位置,都看不到 Terrain 的边缘或地平线的接缝。
  • ✓静态道具的阴影已经烘焙好,只有角色用实时阴影。
  • ✓没有任何两棵树的大小和旋转完全一样。
  • ✓没有树或石头悬在半空,也没有半截插在崖壁上。
  • ✓环境音处处能听到,离小屋越远,篝火声越小。
  • ✓Stats 面板里每一项都达到下面表格的数字,而且是走着测出来的,不是站着测的。

要达到的数字

指标目标值原因
批次数(绘制调用)≤ 100在移动端,第一个拖垮性能的就是这个数字。
屏幕上的三角形数≤ 300k超过这个数,中端 GPU 就开始掉帧。
实时灯光1其余全部要烘焙,没有例外。
阴影距离≤ 50 m实时阴影通常是场景里最贵的一项。
相机远裁剪面≤ 200 m雾正好遮住裁剪面,性能等于白捡。
行走时的 FPS≥ 60站着不动证明不了什么 —— 要边走边测。

想继续加码的话

加分项 1

加上昼夜循环脚本,但完全不重新烘焙 —— 看看哪里坏了、为什么坏。

加分项 2

烘焙一份 NavMesh,让一个敌人在树林之间走巡逻路线。

加分项 3

加一条河,用滚动 UV 的水 shader,再配一个 3D 水声。

加分项 4

用同一批道具、换一套灯光配置,做一个竞技场的夜晚变体。