いよいよ PLATEAUシリーズ最終回です。前編で東京・丸の内のデータをBlenderに読み込み、中編でUnity向けに軽量化しました。今回の【後編】は、その街を 実際にプレイヤーが歩き回れるゲームに仕立てます。無料で手に入る実在の東京を、自分の足で歩く——その第一歩を作ります。

🗼 シリーズの流れ(今回で完結)
【前編】 PLATEAUのデータを入手してBlenderで読み込む
【中編】 ポリゴンを削減・整理してUnity向けに書き出す
【後編】(今回) Unityで配置して、街を歩けるゲームにする

前編・中編のおさらい

中編で、約4万5千個のオブジェクトを1つに結合し、テクスチャ付きでUnityに取り込んだ東京駅・丸の内エリアがこちらです。この街を舞台にします。

中編でUnityに取り込んだ東京駅・丸の内

今回の環境

項目内容
マシンMacBook Pro(Apple Silicon M4)
Unity6000.4.5f1(Unity 6・ビルトインRP/前中後編で統一)
入力Input Manager(WASD・マウス)
プレイヤーCharacterController+自作の一人称スクリプト

街をシーンに置く

中編で書き出したFBXは、すでにUnityのシーンに配置済みです。あとは プレイヤーが歩けるように、街に「当たり判定(コライダー)」と「地面」を用意すれば、ゲームの土台が完成します。

  • MeshCollider:街のメッシュに追加。これでビルの壁にぶつかれる(すり抜けない)
  • 地面(Plane):PLATEAUは建物だけのデータで地面がないので、足元に床を1枚敷く

プレイヤーを置いて歩けるようにする

一人称で歩くプレイヤーは、CharacterController(人型の当たり判定+移動)と、短い自作スクリプトで作ります。WASDで移動、マウスで視点、Shiftでダッシュ、Spaceでジャンプです。移動の核はこれだけです。

// マウスで視点、WASDで移動(抜粋)
float mx = Input.GetAxis("Mouse X") * lookSpeed;
float my = Input.GetAxis("Mouse Y") * lookSpeed;
transform.Rotate(0, mx, 0);                 // 左右に振り向く
pitch = Mathf.Clamp(pitch - my, -85, 85);   // 上下を見る
cam.localEulerAngles = new Vector3(pitch, 0, 0);

Vector3 move = transform.right * Input.GetAxis("Horizontal")
             + transform.forward * Input.GetAxis("Vertical");
velocity.y += gravity * Time.deltaTime;      // 重力
cc.Move((move * speed + Vector3.up * velocity.y) * Time.deltaTime);

このスクリプトと、カメラを子に持つ「Player」を街の中に置けば、もう歩けます。配置は エディタ拡張(メニュー1つ)で自動化し、コライダー追加・地面・プレイヤー生成を一括で行えるようにしました。

【落とし穴】街が実寸大すぎる問題

⚠️ ハマり:プレイヤーが「巨人」or「アリ」になる
PLATEAUは実際の寸法のデータです。取り込み方によってはUnity内で1ビルが数百もの大きさになったり、逆に街全体が手のひらサイズになったりします。標準のプレイヤー(身長1.8m)をそのまま置くと、街に対して巨人になったりアリになったりして、まともに歩けません。

そこで、街の大きさからスケールを自動推定することにしました。「一番高いビル ≒ 200m」と仮定して『1mあたり何ユニットか』を計算し、プレイヤーの身長・移動速度・ジャンプ力・カメラの描画距離をすべてその比率に合わせます。こうすれば、取り込んだ街がどんなスケールでも、ちょうど良い等身で歩けます。

ライティングを整える

そのままだと街がのっぺりするので、太陽光(Directional Light)の角度・強さ・色を昼間らしく調整し、空・地面からの環境光(Ambient)も足して、影が真っ黒に潰れないようにしました。ビルのガラスや石の質感が出てきます。

NavMeshは必要?

当初は経路探索の NavMesh過去記事で扱った仕組み)を敷く予定でした。が、整理すると——

  • NavMesh=AI(敵キャラ等)が自動で道を探して歩くための仕組み
  • 今回はプレイヤー自身が操作して歩くので、CharacterControllerだけで十分

というわけで、今回はNavMeshは使わずCharacterControllerで実装しました。「街にNPC(通行人や敵)を歩かせたくなったら、そこでNavMeshを街にベイクする」——という順番が自然です。次の発展に取っておきます。

リアル東京を歩いてみた

Playボタンを押すと——東京駅前・丸の内の街に降り立ち、ビルの谷間を歩けます。実在の高層ビルを見上げながら、自分の足で歩く感覚は格別です。

ビルの谷間を歩く一人称視点

視点を上空に上げれば、街全体を見渡せます。中央に東京駅(特徴的な曲面の屋根)、その周りに丸の内の高層ビル群——実在の都市がまるごとUnityの中にあります。

上空から見た東京駅・丸の内エリア全体

上空から街の上を進んでみた様子がこちらです(酔わないようゆっくりめにしています)。

▲ 東京駅・丸の内エリアを上空から見渡す(Unity・Playモード)

3部作の振り返りと今後

  • 前編:PLATEAUから実在の東京(丸の内)を無料で入手し、Blenderへ
  • 中編:4万5千オブジェクトを1つに結合してUnity向けに軽量化、テクスチャも復活
  • 後編:CharacterControllerでプレイヤーを置き、実在の街を歩き回れるゲーム

「無料で手に入る本物の街を、自分のゲームの舞台にできる」——PLATEAUの可能性を3回かけて体験できました。実在の街がベースなので、作るほど「自分の街のゲーム」になっていくのが楽しいところです。

じつは、まだ使っていない“街の部品”があります

今回の3部作では 建物(bldg) だけを使いましたが、前編でダウンロードしたPLATEAUのFBX一式の中には、ほかにも街を構成する部品が入っていました。改めて中身を確認したところ、丸の内エリアでは次の要素が含まれていました。

要素内容今回
建築物(bldg)ビルなどの建物✅ 使用
地形(dem)地面の起伏未使用
道路(tran)道路の面未使用
橋梁(brid)橋・高架未使用

つまり、いま歩いている街は「建物だけ」の状態。足元に地面がなく道路もないので、どこか書き割りのような印象もあります。そこで後日、この地形・道路・橋梁を追加して、もっと“本物の街並み”に整備してみる予定です。地面と道路が入れば、本記事で「街が少し浮いて見える」と感じた部分も解消できるはずです。続きもお楽しみに。

※ 本記事で使用した都市データの出典:3D都市モデル(Project PLATEAU)国土交通省/G空間情報センター

それでは、今回はここまで。ありがとうございました😊