前編では、国土交通省の3D都市モデル PLATEAU から東京駅・丸の内エリアをダウンロードし、Blenderに読み込みました。ところが、そのデータは 「重すぎてそのままゲームには使えない」 という問題を抱えていました。今回の【中編】では、この重たいデータを Unityで扱える軽さに整え、書き出すまでをやっていきます。
【前編】 PLATEAUのデータを入手してBlenderで読み込む
【中編】(今回) ポリゴンを削減・整理してUnity向けに書き出す
【後編】 Unityで配置して、街を歩けるゲームにする
前編のおさらい ― なぜ最適化が必要か
前編で読み込んだのが、この東京駅・丸の内エリア(実写テクスチャ付き)です。
見た目は立派ですが、中身に深刻な問題がありました。建物の壁や屋根が1枚ずつ別々のオブジェクトに分かれていて、その数なんと約4万5千個。Unityでは 1オブジェクト=1つのGameObject として扱われるため、このまま持ち込むと4万5千個のGameObjectがシーンにあふれ、エディタもゲームも重くなってしまいます。
頂点24万・面4.5万というポリゴン数は、現代のUnityなら実はそれほど怖くありません。本当の重さの原因はオブジェクト(GameObject)が多すぎること。まずはここを潰します。
今回の作業環境
| 項目 | 内容 |
|---|---|
| マシン | MacBook Pro(Apple Silicon M4) |
| Blender | 5.1.1(結合・削減・エクスポート) |
| Unity | 6000.4.5f1(Unity 6・ビルトインRP) |
| 元データ | 前編の東京駅・丸の内(メッシュ53394611・LOD2) |
オブジェクトを1つに結合する(最大の軽量化)
一番効くのが 「結合(Join)」 です。Blenderで全オブジェクトを選択し、オブジェクト → 統合(Ctrl/⌘+J) で1つのメッシュにまとめます。これだけで結果は劇的です。
45,455個 → 1個。頂点や面の数は変わりませんが、Unityでの扱いが「4万5千個のGameObject」から「たった1個」になります。これがUnityにおけるPLATEAUデータ最大の軽量化です。テクスチャ(マテリアル)は結合しても保持されるので、見た目はそのままです。
ポリゴン削減(デシメート)という選択肢
「もっと軽くしたい」場合は、ポリゴン自体を減らせます。まず 重複した頂点をマージ(Merge by Distance)すると、分割されていたぶんの無駄な頂点が消えます。さらに デシメート(Decimate)モディファイア で面そのものを間引けます。今回の例では次のように減りました。
PLATEAUのデータは同じ場所に面が二重に重なっていることがあり、そのままだと表示がチラチラ(Zファイト)することがあります。重複頂点のマージ+法線(面の向き)の統一をしておくと、この二重面が解消され、テクスチャも安定して表示されます。軽量化だけでなく「見た目の安定」にも効く整理です。
| 工程 | 頂点数 | 面数 |
|---|---|---|
| 結合のみ | 243,062 | 45,455 |
| + 重複頂点マージ | 約 77,000 | 約 44,500 |
| + デシメート(0.5) | 約 39,000 | 約 33,000 |
削ると見た目はどう変わる?
気になるのは「削って見た目が崩れないか」です。実際に削減して同じアングルでレンダリングし、比べてみました。まず 50%まで削減したケース。
面の数を半分にしても、パッと見ではほとんど違いが分かりません。この程度なら安心して削れます。一方、大幅に(元の15%まで)削ったのがこちら。
ここまで削ると違いがはっきり出ます。ビルの角(エッジ)が甘くなり、平らだった壁が微妙に波打ち、屋上やテクスチャがにじんで見えます。「どこまで削るか」は、軽さと見た目のバランスで決めることになります。
ちなみに、前の章でやったオブジェクトの結合は、見た目がまったく変わりません(データのまとめ方が変わるだけ)。見た目に影響するのは、このデシメート=ポリゴンを削る操作のほうです。
デシメートで面を間引くと、UV(テクスチャの貼り付け位置)が崩れやすく、建物の見た目が荒れることがあります。今回はテクスチャの美しさを優先し、Unityへ持っていくのは「結合のみ」のバージョンにしました。ポリゴン数は元から許容範囲なので、無理に削らない判断です。用途に応じて使い分けましょう。
FBX と glTF、どちらで書き出す?
Unityへ渡す形式として、代表的な FBX と glTF(.glb) の両方で書き出して比べました。どちらもテクスチャを埋め込んでエクスポートできます。
| 形式 | サイズ | Unityでの扱い |
|---|---|---|
| FBX | 約26MB | ◎ 標準対応。追加パッケージ不要(今回採用) |
| glTF(.glb) | 約28MB | ○ オープン規格。読み込みに専用パッケージが必要 |
UnityはFBXを標準でそのまま読めるので、特別な理由がなければFBXが手軽です。glTFはWebや他ツールとの相性が良いオープン規格ですが、Unityで使うにはインポート用パッケージの追加が必要になります。
エクスポート設定の注意点
BlenderからUnity向けにFBXを書き出すとき、いくつか設定のコツがあります。
- 軸の向き:UnityはY軸が上・Z軸が前。Blender標準とは違うので、エクスポート時に 前方=-Z/上=Y に合わせる(ビルトインで用意されています)
- スケール:単位スケールを適用して、Unity側で巨大/極小にならないようにする
- テクスチャの同梱:パス参照ではなく埋め込み(Embed Textures)にしておくと、ファイル1つで完結して受け渡しが楽
Unityにインポート →「真っ白」の対処
書き出したFBXをUnityの Assets に入れると自動で取り込まれます。シーンに置いて表示すると——街が真っ白。テクスチャがありません。
FBXの中にテクスチャは入っているのに、Unityは初期状態だとそれを展開してくれず、マテリアルが空っぽ(真っ白)になります。これはPLATEAUに限らずFBX全般でよくあるつまずきです。
直し方はインポート設定の Materials(マテリアル)タブ から。
- Assets内のFBXを選択 → インスペクターの Materials タブを開く
- 「テクスチャを抽出(Extract Textures)」 を押し、保存先フォルダを選ぶ(埋め込み画像がファイルとして取り出される)
- 「マテリアルを抽出(Extract Materials)」 を押す(テクスチャと結びついたマテリアルが作られる)
今回のデータでは テクスチャ927枚・マテリアル927個 が一気に展開され、マテリアルが正しく再マッピングされました。結果、Unityのシーンに実写テクスチャ付きの東京駅・丸の内が表示されました。
マテリアルが927個あるということは、Unityでは927回の描画(ドローコール)が発生します。本格的に軽くするなら、複数のテクスチャを1枚にまとめる「テクスチャアトラス化」という上級テクニックもあります(今回はそこまではやりません)。
まとめと後編予告
- ✅ Unity最大の軽量化は結合:オブジェクト数 45,455 → 1(テクスチャは保持)
- ✅ さらに軽くするなら重複頂点マージ+デシメート(ただしテクスチャが荒れるトレードオフ)
- ✅ 書き出しはFBXが手軽(Unity標準対応)。軸・スケール・テクスチャ埋め込みに注意
- ⚠️ Unityで真っ白 → Materialsタブでテクスチャ/マテリアルを抽出すればテクスチャ復活
これで、実在の東京駅・丸の内が Unityでちゃんと表示できる軽さになりました。次回【後編】は、いよいよこの街にプレイヤーを置いて歩き回れるゲームに仕立てます。お楽しみに。
※ 本記事で使用した都市データの出典:3D都市モデル(Project PLATEAU)国土交通省/G空間情報センター
それでは、今回はここまで。ありがとうございました😊