練習課題:ゲームになる
everything from tab 01–04 · a run you can win or lose
アリーナを「場所」に変え、そのうえで「ゲーム」に変えます。これまで戦闘に使ってきたブロックの周りに地形を Sculpt し、ライトを Bake し、木を数百本ばらまき、環境音を加えます——それからウェーブを三つ、敗北画面、リプレイボタンを組み込みます。60 FPS はそのまま維持してください。
再利用するもの
同じアリーナが、今度は戦う価値のある場所になり——そして本当に敗北があるゲームになります。
5 つのパスで作る
パス 1 —— グレーのブロックアウト
テクスチャを貼る前に、地形の形を Sculpt してキャラクターで歩き回ってみてください。グレーの段階で面白くない空間は、木を何本置いても救えません。
Terrain は 200 × 200 m、heightmap resolution は 513、位置を -100, -0.05, -100 にします。
Set Height を使って、既存のブロックのグリッドの周りに 40 × 40 m ほどの平地を作ります——ブロックは動かさず、その周りに世界を組み立ててください。
外周を盛り上げて丘にし、プレイヤーから Terrain の境界が見えないようにします。
全体を 2 回 Smooth します。ギザギザの地形は、初めてのシーンだとバレる最大の原因です。
パス 2 —— マテリアルとモジュール部品
Terrain Layer は 4 つまで:草、土の道、斜面の岩、そしてアクセントを 1 つ。
1 層あたりの Tiling を 10〜15 m にして、繰り返しが見えないようにします。
1 m グリッドに揃えた 6 つの部品(床、壁、扉付きの壁、コーナー、屋根、段)で小屋を組み立てます。
壁の Prefab に石と木の 2 つの variant を作れば、小屋と廃墟が同じベースを共有できます。
パス 3 —— 置くのではなくばらまく
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 で Bake します。。
Fog は Skybox の地平と同じ色、Linear、start 90 m・end 150 m——それからカメラの Far を 160 に下げます。
パス 5 —— 音と最適化
2D の環境音のベース(風と小鳥)、小屋に 3D の音を 1 つ(焚き火)、足音は Animation Event で鳴らします。
木の Prefab に LOD Group を付け、2 レベル + Culled の構成にします。
木、岩、草のマテリアルで GPU Instancing を有効にします。
Quality settings で Shadow Distance を 40 にし、その後 Profiler を開いて、下の数値を本当に満たしているか確認してください。
完了条件
- ✓Knight を小屋から林の端まで歩かせても、見えない壁に当たったり地面を抜けたりしません。
- ✓シーンのどこに立っても、Terrain の縁や地平の継ぎ目は見えません。
- ✓静的な小道具の影は Bake 済みで、リアルタイム影はキャラクターだけです。
- ✓サイズも回転もまったく同じ木が 2 本とありません。
- ✓空中に浮いた木や岩、崖に半分埋まった木や岩がありません。
- ✓環境音はどの場所でも聞こえ、小屋から離れるほど焚き火の音が小さくなります。
- ✓Stats パネルの数値が下の表をすべて満たしています。立ち止まった状態ではなく、歩いている状態で測ってください。
狙う数値
| 項目 | 目標値 | 理由 |
|---|---|---|
| バッチ数(描画) | ≤ 100 | mobile で最初に性能を殺すのはこの数値です。 |
| 画面内の三角形数 | ≤ 300k | これを超えると、ミドルレンジの GPU はフレーム落ちを始めます。 |
| リアルタイムライト | 1 | ほかはすべて Bake してください。例外なしです。 |
| 影の描画距離 | ≤ 50 m | リアルタイムシャドウはたいていシーンで最も重い要素です。 |
| カメラの Far plane | ≤ 200 m | Fog が切断線を隠してくれるので、性能はおまけで付いてきます。 |
| 歩行中の FPS | ≥ 60 | 立ち止まった状態では何も証明できません。動きながら測ってください。 |
もっとやりたい人へ
昼夜サイクルのスクリプトを追加しても Bake はやり直さない——どこが崩れて、なぜ崩れるのかを確認してください。
NavMesh を Bake して、敵の 1 体に木の間を回る巡回ルートを歩かせます。
川を 1 本追加し、UV をスクロールさせる water shader と 3D の水音を付けます。
同じ小道具で別のライト設定を使い、アリーナの夜の variant も作ります。