U
タブ 04世界とゲームループ7 レッスン — タップで開く
07 / 07 · 22 分
世界とゲームループ★ 練習課題

練習課題:ゲームになる

ここまでのプロジェクト▸ Arena.unity

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

練習課題3–4 時間

アリーナを「場所」に変え、そのうえで「ゲーム」に変えます。これまで戦闘に使ってきたブロックの周りに地形を Sculpt し、ライトを Bake し、木を数百本ばらまき、環境音を加えます——それからウェーブを三つ、敗北画面、リプレイボタンを組み込みます。60 FPS はそのまま維持してください。

再利用するもの

Terrain sculpt + layersTerrain の Sculpt とレイヤーBaked lightmapsBake 済みのライトマップSkybox + fogSkybox とフォグPrefab variantsPrefab のバリアントPropScatter + raycast小道具の散布と raycastLOD + batchingLOD とバッチングAudio mixerオーディオミキサーGameDirector wavesGameDirector のウェーブ
アニメーション図

同じアリーナが、今度は戦う価値のある場所になり——そして本当に敗北があるゲームになります。

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 —— 置くのではなくばらまく

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 で Bake します。Window▸Rendering▸Lighting。

  • 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 パネルの数値が下の表をすべて満たしています。立ち止まった状態ではなく、歩いている状態で測ってください。

狙う数値

項目目標値理由
バッチ数(描画)≤ 100mobile で最初に性能を殺すのはこの数値です。
画面内の三角形数≤ 300kこれを超えると、ミドルレンジの GPU はフレーム落ちを始めます。
リアルタイムライト1ほかはすべて Bake してください。例外なしです。
影の描画距離≤ 50 mリアルタイムシャドウはたいていシーンで最も重い要素です。
カメラの Far plane≤ 200 mFog が切断線を隠してくれるので、性能はおまけで付いてきます。
歩行中の FPS≥ 60立ち止まった状態では何も証明できません。動きながら測ってください。

もっとやりたい人へ

ボーナス 1

昼夜サイクルのスクリプトを追加しても Bake はやり直さない——どこが崩れて、なぜ崩れるのかを確認してください。

ボーナス 2

NavMesh を Bake して、敵の 1 体に木の間を回る巡回ルートを歩かせます。

ボーナス 3

川を 1 本追加し、UV をスクロールさせる water shader と 3D の水音を付けます。

ボーナス 4

同じ小道具で別のライト設定を使い、アリーナの夜の variant も作ります。