これは何か
NSB は私たちが開発中の PvP サンドボックス MMORPG で、精神的には 20 年前の『Shadowbane』を受け継いでいます。プレイヤーが自ら街を築き、戦い、領土を奪い合うゲームです。クライアントは Unreal Engine 5.8(C++)、サーバーは C# / .NET 10 で書いた権威サーバーで、世界は「シャード」と呼ぶマップをつなぎ合わせて構成します。
プロジェクトの最初のコミットは 2026-10-28 02:37 です。11 月 1 日までのコミットは全部で 117 件。ドキュメント、データテーブル、サーバー、クライアント、マップのすべてを AI エージェントが仕上げました。
この記事で扱うのはその中の一つだけ、AI でマップを作るときにどんな問題に突き当たり、どう解決したかです。例は最初の正式マップ「北の森」。断崖の台地に広がる約 5 × 4 km の原生林で、台地の間には底の見えない霧の谷があります。

一人と、AI のチーム
最初の数日は、一つの AI エージェント(Claude Code)がすべてを引き受けていました。最後の 1、2 日は作業量が一つのコンテキストに収まらなくなり、Cindy 上でマルチエージェント協調に切り替えました。役割分担は小さなスタジオのようなものです:
| 役割 | 担当 | 仕事 |
|---|---|---|
| 統括(Lead) | Claude | タスクの分解、割り振り、検収、取りまとめ。自分ではコードを書かない |
| プログラマー | Claude Code | ツールを書き、レイアウトを直し、レベルを再構築し、検証を実行する |
| アートディレクター | Codex | エディターに入って画面を確認し、コンセプトアートと項目ごとに比較して、レビュー報告と手戻りリストを書く |
| アシスタント | 別のモデル | 資料調査、コミット履歴の読み取り、事実の整理 |
AI はどうやって「エディターに入る」のでしょうか。UE 5.8 には MCP サーバーが標準で付いていて、エージェントはこれを通じてレベル内の物の照会と配置、モデルのインポート、マテリアルの変更、カメラを動かしてのスクリーンショット撮影ができます。人がマウスをクリックして手伝う必要はありません。
ワークフロー:4 ステップ、ステップごとに止まって人に見せる
北の森は最初、感覚に任せてそのまま組み上げました。初日の夕方にはネットワーク経由で入れる浮島ができていて、キャンプもモンスターもゲートも揃っていました。しかしテストプレイですぐに問題が山ほど見つかりました。柵は四方がすき間だらけ、物がめり込み、メイン道路は一気に走り切れないほど長い。どれも本来は「寸法を測る」段階で見つかるはずのものです。
そこで初日の深夜に 4 ステップの手順を決め(プロジェクト決定 D062)、以後のマップはすべてこれに従っています:
| ステップ | 内容 | 成果物 |
|---|---|---|
| 1 コンセプトアート | 設定カードを書き、テキストだけから 3〜5 枚のコンセプトアートを生成する。光源を列挙し、各要素に使う予定の素材を明記する | 設定カード、コンセプトアート、プロンプト記録 |
| 2 俯瞰ゾーニング図 | レイアウトファイルを書き、スクリプトで「北が上、100 m で 1 マス」のゾーニング図を描く。1 回走るのにかかる時間とスタミナを計算し、モンスターの索敵範囲がメイン道路やゲート付近にかからないかを検査する | 02_layout.json、ゾーニング図 |
| 3 スケール図 | エディターで各モデルの実寸、原点、コリジョンを測り、ドワーフ、人間、ハーフジャイアントと並べてスクリーンショットを撮る | 寸法表、問題リスト、スケール図 |
| 4 生成 | 前のファイルだけを読み、レベルを作り、木を撒き、小物を配置し、ナビゲーショングリッドを書き出し、サーバーのマップデータを書き、スクリーンショットで検収する | レベル、ナビゲーショングリッド、マップデータ、比較画像 |
各ステップが終わったらまず確認し、それから次へ進みます。 テストプレイで問題が見つかったら、どのステップの問題かを先に判断します。雰囲気と光はステップ 1 へ、距離とモンスター配置はステップ 2 へ、寸法、めり込み、コリジョンはステップ 3 へ戻ります。


鉄則:エディターで手作業で物を動かさない
ステップ 4 はマップツールキットが担当し、入口は一つのコマンドだけです:
python run.py wilds terrain # 地形、木、地被植物の撒き点をオフラインで生成
python run.py wilds level # レベルを作成し、地形をインポート
python run.py wilds scatter # PCG で巨木と地表の植生を撒く
python run.py wilds dress # キャンプ、墓地、モンスター出現地点の配置物
python run.py wilds nav # ナビゲーショングリッドを書き出す
python run.py wilds mapdata # サーバー用のマップデータを書く
python run.py wilds verify # 自動検証
レベル内のすべては三つのファイルから生成されます。レイアウト(02_layout.json)、素材リスト(03_assets.json)、ツールキットのコードです。おかしな所を見つけたら、AI が直すのはこの三つで、それから該当するステップを再実行します。エディターで手作業でドラッグはしません。この決まりの利点は再現性です。いつレベルを消して作り直しても、同じマップが得られます。ツールキットを変更したら北の森で回帰テストを行い、地形と撒き点は前の版とバイト単位で一致し、328 個の配置物の位置差は 0 でなければなりません。
これらの手順はのちに skill(操作マニュアル)としてもまとめました。新しく起動したエージェントは一読すればマップの作り方が分かるので、最初から説明する必要はありません。
検証は「それらしく見える」に頼らない
AI は「完了しました」と言うのがとても得意です。そこで各ステップには自動で実行できるチェックを用意しました:
- 地面照合:ランダムな 300 点について、エディターのレイが当たる地面とジェネレーターが計算した地面を比較し、誤差は ±10 cm 以内とする。
- 到達チェック:キャンプから出発して、すべての主要地点とモンスター出現地点に歩いて行けること。
- データ検証:サーバーのマップデータを検証にかけ、エラー 0 件。
- 穴チェック:ナビゲーショングリッドを 1 マスずつ地形と比較し、落ちる場所がないかを調べる(なぜこの項目を加えたかは後で述べます)。
- ボット:サーバーを再起動してボットを 3 体放ち、マップの各ゲートを往復させる。
- コンセプトアートとの比較:コンセプトアートのカメラ位置に合わせてゲーム内で同じ角度を撮り、左右に並べる。
最後の項目が最も重要です。2 日目の時点で、記録にこう書いています。通行検証に合格しても、見た目の再現に合格したことにはならない。
森はどう育ったか
10 月 28 日:浮島のサンプル。 まず約 1.2 × 0.9 km の浮島を作りました。シルバーファー 2751 本、シダ・苔・倒木が 7 万個あまり、周囲に砕けた崖が 84 個です。その夜のうちに約 2 × 1.5 km に拡張し、ネットワークゲームに「荒野」として接続しました。ボットに 2 つのゲートを往復させるテストは 3/3 で成功しています。

10 月 29 日:浮島から大陸へ。 世界全体の地図帳を描いているとき、浮島が世界観に合わないことに気づきました。世界は砕けた大陸で、中心は一続きにつながり、外周だけが裂けていて、至るところに逆円錐形の空島があるわけではありません。北の森はこれに合わせて約 5 × 4 km の大陸の森として作り直しました。

10 月 30 日:断層台地。 コンセプトアートに合わせて、地形を霧の谷で切り分けられた断層台地に変更しました。まず等高線図で確認してから生成します。地形メッシュは約 156 万三角形、メイン道路は 3.8 km です。その後は丸一日、崖に取り組みました。横方向の岩層、崩落の切れ込み、崖際の大岩、谷の中に 1400 個のボリュメトリックフォグです。夜には木を層状の森に作り替え、最も多いときで約 5 万本、最も古いモミは高さ 100〜127 m になりました。


10 月 31 日:境界とルール。 木の根が崖の外にはみ出さないようにし、崖線に細かな欠けを加えました。ゲーム中に F3 で座標を表示できるようにして、スクリーンショットの際に位置をそのまま報告できるようにしました。境界の壁と「霧の底では死ぬ」というルールも追加しました。
11 月 1 日:穴埋めと 3 回のアートレビュー。 マップ切り替えのロード画面を追加し、マップ内の 2000 個以上の竪穴を埋め、その後アートディレクターが合格を出すまで 3 回続けてレビューしました。
ぶつかった問題と解決策
1. AI が作るものは「整いすぎる」
最初の崖は台地から谷底まで 1 マスで真っすぐ落ちていて、縦の稜線ばかりが見え、切り分けたケーキのようでした。解決策は崖の上端から外側 160 m を計算し直すことです。硬軟が交互に重なる岩層、段差、浸食の溝を作り、崖際の約 2 割はまるごと崩れて切れ込みになり、崖の足元には崖錐が積もります。
最初の切れ込みには副作用がありました。モンスターの巣へ通じる細い台地を崩して断ち切ってしまったのです。その後、切れ込みは両側とも十分に広い台地でだけ崩すことにして、地形生成時に、各主要地点へキャンプから歩いて行けるかを先にオフラインで検査するようにしました。
崖際に何を置くかでも回り道をしました。まず素材パックの大岩を 3、4 倍に拡大して崖沿いに貼ってみましたが、色が薄く形が丸く、こぶが並んだようになりました。次にプロジェクトにある既存の層状の崖ブロックを試しましたが、テクスチャを拡大するとぼやけます。最終的には、地形自身に節理に沿って 10〜25 m の岩塊を切り出させ、岩塊の間に垂直の割れ目を残しました。大岩は崖の上端で外に向いた岩肌としてだけ使って土に埋め、地面は緩い斜面と植生で岩の根元を覆います。

2. 見えている地面と、踏む地面が違う
初日にぶつかった問題です。キャラクターの脚が地面に沈み、柵とキャラクターが宙に浮いていました。原因は、地形に Nanite を使っていて、コリジョンが Nanite の自動簡略化モデルから生成されていたことです。見えている表面とは十数 cm から 100 cm あまりずれていました。簡略化モデルに全三角形を残すように変えると、ランダムな 300 点の誤差は ±9 cm 以内に戻りました。その後の地形は再構築のたびに ±0.1 cm に収まっています。
同じような問題は他にもありました。PCG で撒いた木は「デフォルトのコリジョン」を有効にしていたのに生成結果は「コリジョンなし」で、人がそのまま通り抜けられ、BlockAll を直接指定する必要がありました。6 倍に拡大した切り株のコリジョンはカプセル 1 本だけ。大きなテントにはそもそも単純コリジョンがありませんでした。この種の問題はすべてステップ 3「スケール図」に集約し、スクリプトで一通り測って問題リストにします。テストプレイでぶつかるのを待つことはしません。
3. マップに現れた 2000 個以上の竪穴
テストプレイで気づきました。マップの端からまだ遠いのに、森の中に四方の壁が垂直で底の見えない四角い穴がいくつもあるのです。
最初はモデルに穴が開いていると疑いました。調べると、メッシュは外枠を除いて開いた辺が 1 本もなく、問題はハイトフィールドそのものにありました。崖のアルゴリズムはほぼ垂直なので、幅 1、2 マスの谷があるだけで周囲の崖が数十〜100 m 以上落ち込み、メッシュ上では幅約 8 m の四角い井戸になります。マップ全体をオフラインで集計すると、こうした細い割れ目と閉じた穴が 2069 個見つかり、大半は崖際 20 m 以内にありました。発生源の内訳は、最大がハイトフィールド自体(1503 個)で、崖際の欠けが 469 個、崩落の切れ込みが 97 個です。
さらに気づきにくい種類もありました。崖際の大岩は台地の地面をかさ上げするだけで、穴の口にまたがった部分の下は空洞です。上から見ると地面があるのに、乗ると落ちます。
解決策は幅で判定するルール群です。20 m 四方が収まらない割れ目は台地に持ち上げる。細い入口の奥の小さな入り江は平らにする。十分な幅で崩せない切れ込みはそもそも崩さない。岩の下と岩の間のすき間は塞ぐ。残った深い穴は最深 3 m の、歩いて出られる浅いくぼ地まで埋める。外に開いて外の霧の谷とつながっている崖の入り江は正常な崖なので残します。
検証の方法も変えました。エディターでレイを飛ばすと 1 点あたり約 175 ミリ秒かかり遅すぎるので、1.25 m 間隔のナビゲーショングリッドを 1 マスずつ地形と比較することにしました。修正前は 192301 マスが地面より低く、修正後は 0 マスです。

4. マップの外へ出て、どこまでも落ちる
テストプレイ中に南の境界からマップの外へ出てしまい、そのまま落ち続けて止まらなくなりました。原因は、台地がマップの端まで伸びてそこで切れていて、縁の外には何もなかったことです。
修正は二段構えです。マップの端から 250 m は一律に霧の谷にし、周囲に見えない壁を立てました。同時にゲームルールを一つ加えました。霧の底では死ぬ。霧の谷に落ちると毎秒 HP が 25% 減り、約 4 秒で死亡してキャンプで復活します。墓碑は落ちる前に最後に立っていた地面に残るので、持ち物を拾いに戻るのに谷へ飛び込む必要はありません。谷底の霧も濃くし、崖から見下ろすと一面の白で、岩峰の先だけが見えるようにしました。
5. スクリーンショットは嘘をつく
AI が視覚的な作業をするとき、最もはまりやすい落とし穴です。
炎が消えた。 アートディレクターの最初の 2 回のレビューのスクリーンショットでは、キャンプの焚き火と墓地のろうそくの炎がほとんど見えず、画面の隅には Lumen キャッシュの超過を示す赤字がよく出ていました。ライティングとキャッシュの設定の問題だと思っていた時期もあります。最後にプログラマーが突き止めました。エディターが前面にないとき、UE は毎秒約 3 フレームに制限します(bThrottleCPUWhenNotForeground)。炎のパーティクルは残らず、Lumen も収束が間に合いません。AI はバックグラウンドでエディターを動かすので、エディターはいつも「前面にない」状態でした。この制限を切って Simulate モードで撮ると、炎は戻り、赤字も消えました。キャッシュサイズは少しも変えていません。
空に三つの石。 スクリーンショットの空に、三つの石がずっと浮かんでいました。調べると、前日に崖際の岩を試したときに一時的にレベルに置いたもので、ツールキットのどのステップもそれらを片付ける担当になっていませんでした。今はレベルと環境のいくつかのステップの冒頭で、こうした試し置きフォルダを片付けます。
保存したのに保存されていない。 ゲームクライアントが起動していて、このマップに入ったことがあると、エディターの「保存」はエラーを出さないのに、ファイルがまったくディスクに書き込まれません。今のツールキットは保存のたびにファイルの更新時刻を照合し、変わっていなければエラーにします。
6. マップ切り替えで固まる
別のマップから北の森へ歩いて入ると、画面が数秒間固まっていました。そこで、まずバックグラウンドで新しいレベルをメモリに読み込み、その間ゲームは普段どおりロード画面(地名、安全レベル、プログレスバーとパーセント、背景はこのマップのコンセプトアート)を描き、読み込み後に切り替えるようにしました。北の森のバックグラウンド読み込みは約 5〜7 秒で、本当に固まるのは約 1 秒だけです。この 1 秒は別のスレッドが同じ画面を描きます。途中でクラッシュを一つ踏みました。プリロードしたワールドを「ゲームワールド」として登録すると、切り替え時にエンジンのワールドリークチェックに止められます。

7. AI がパソコンを使うときも、ルールを守る
AI と人は同じパソコンを使っていて、AI の操作がパソコンを使っている人の邪魔をすることがあります。解決策はいくつかの厳格なルールです:
- キーボードとマウスを模擬しない。 パソコンでは誰かが別のウィンドウを使っているかもしれず、模擬したキー入力がそこに打ち込まれてしまいます。結果の確認はすべてエディターのビューポートのスクリーンショットで行います。
- ゲームを閉じる、サーバーを再起動するときは先に人に聞く。
8. 素材ライセンス:NoAI
シーンのモデルの多くは Fab で購入した素材で、その少なからぬものに NoAI マークが付いています。私たちの理解(プロジェクト決定 D057)はこうです。ゲームに入れるのは構わない。AI がこれらの素材を含むスクリーンショットを見て確認するのも構わない。ただし素材の画像やゲームのスクリーンショットをどの画像生成モデルにも渡してはならず、学習にも使ってはならない。だからコンセプトアートはテキストだけから生成し、「ゲームのスクリーンショットをもとに描き直す」ことはできません。
アート面のルールももう一つあります。光は実在の光源からだけ──焚き火、火鉢、ランタン、ろうそく、天空光です。初日の浮島には何もないところに現れる紫の灯り、青い灯り、発光する霧があり、いかにも偽物に見えたのですべて取り除きました。墓地に後から加えた小さな暖かい灯りの下には、どれも本物のろうそくがあります。
AI に AI をレビューさせる:3 回のアートレビュー
穴を埋め、通行がすべて合格しても、画面はコンセプトアートとはまだかけ離れていました。この段階はアートディレクターに任せました。エディターに入ってコンセプトアートのカメラ位置で撮影し、項目ごとに比較してレビュー報告を書きます。各項目には場所、現状、どう変えるか、どう検収するかを書きます。
1 回目の指摘は次のとおりです。キャンプの 4 張りのテントが柵に沿って均等に円形に並び、展示台のよう。墓地に主役がいない。森は空から見ると同じ厚さの木の絨毯。プログラマーが一通り直しました。
2 回目は穴埋め、林縁、キャンプの門、炎を合格としましたが、墓地はむき出しの泥地になって以前より空っぽになり、林冠もまだ一続きでした。手戻りリストは具体的です。墓地の苔は地面の 55%〜65% を覆い、裸地は 25% 以下にする。主祠は同じ素材パックのアーチ壁と勾配屋根に替える。2 つのモデルは接合部の高さがどちらも 254.06 で、揃えられる。疎林の林冠採用率を 0.45 から 0.12〜0.18 に下げる。空き地は幹の位置ではなく樹冠の縁を基準に空ける。
3 回目で通過しました。林冠は 100 × 100 m の窓で、密林の被覆率の中央値が 91%、疎林が 42%。キャンプは 2 組のテントとして読めます。墓地にはアーチと勾配屋根の古い祠、階段、崩れた壁、苔、ろうそくが揃いました。アートディレクターはさらに、それまで墓地の構図の判断に使っていた遠いカメラが祠を小さく、空を大きく見せていたことに気づきました。普通の 1.7 m の目の高さにすると、祠、墓碑、遠くの崖と霧の谷が同じ画面に収まります。そのため、構図のために墓地全体を動かすことはしませんでした。




神木も同じ考え方です。倒れた巨木は近くの枝葉に隠れて読み取れませんでした。アートディレクターはプログラマーにモデルをさらに拡大させるのではなく、観察方向に視線の窓を切り開き、根盤、倒れた幹、供物を順に追って見られるようにしました。

まだ終わっていないことも報告に書かれています。外側の崖の局所的な輪郭、伐採キャンプから目の高さでは崖下の霧の谷が見えないこと、墓地のある台地がコンセプトアートより平らなことです。コンセプトアートは目標であって、すでに到達した状態ではありません。

いくつかの実感
- AI に直させるのはファイルで、シーンではない。 すべてをレイアウトとツールキットから生成すれば、問題が起きても戻せるし、作り直せるし、回帰テストもできます。AI がエディターで手作業でドラッグしたものは次の再構築で消え、何を動かしたのかも誰にも分かりません。
- どのステップも自動で検証できるようにする。 「問題なさそう」は AI にとって拘束力がありません。地面の誤差、到達性、穴チェックのマス数、樹冠被覆率といった数字こそ、AI が本当に合わせにいく目標です。
- スクリーンショットをコンセプトアートと比べ、しかもスクリーンショット自体を疑う。 同じシーンでも、エディターが前面にあるかどうか、カメラが少し高いか低いかで、結論がまったく逆になることがあります。
- ルールは書き残す。 キー入力を模擬しない、光は火源からだけ、素材をモデルに渡さない。これらを skill とメモリに書いておけば、新しく起動したエージェントは最初から分かっています。
いくつかの数字
| 項目 | 数字 |
|---|---|
| プロジェクトの最初のコミット | 2026-10-28 02:37 |
| 11 月 1 日までのコミット数 | 117 |
| マップツールキット | 40 ファイル、約 1.7 万行(汎用で、北の森専用ではない) |
| 北の森の大きさ | 約 5 × 4 km、メイン道路 3.8 km |
| 埋めた竪穴 | 2069 個、穴チェックの漏れマス 192301 → 0 |
| 木 | 最多で約 5 万本、疎密調整後の主林 18519 本 |
| アートレビュー | 3 回 |
次にやること
- 伐採キャンプの視線の窓と外側の崖の輪郭を仕上げる。
- 同じ手順で次のマップ「辺境の原野」を作る。
- パッケージ版クライアントで完全なパフォーマンステストを行う。
この記事は、プロジェクトのコミット履歴、設計文書、レビュー報告をもとに AI がまとめて執筆しました。スクリーンショットは開発中のエディターとゲームの画面です。