はじめに
ダンジョンを「別のレベル」に分けるのではなく、同じレベルの地下10kmに隔離する——。
今回はそういう設計を採用しました。やってみると2つのトラブルが連続で起きて、どちらも最初はかなり焦りました。でも片方はエンジンの仕組みを理解したら「むしろ喜ぶべきログ」だったという話です。
なぜ「同一レベルの地下10km」なのか
ダンジョンと拠点の街を行き来する方法として、最初は「レベル分離(Open Level)」を検討しました。
でもすぐに撤回しました。理由は2つです。
- マルチプレイでレベルをまたぐと、接続が切れるリスクがある
- GameState に蓄積したデータ(RunPhase・FloorIndex など)がリセットされる
これは致命的です。
代わりに採用したのが、同一レベル内でダンジョンを超遠方に物理的に隔離する方法です。街は通常の座標(Z = 0 付近)に、ダンジョンは Z = -1,000,000(地下10km)に配置します。
レベルはずっと同じ1つ。GameState のデータも消えない。ワープもただの座標移動です。
また、ダンジョン生成には DA(Dungeon Architect)の Add Blueprint Node を使っています。通常の Add Actor Node ではなく Blueprint Node を使うことで、DA が生成したアクターを Blueprint として扱え、カスタム処理を柔軟に差し込めます。
トラブル①:街がダンジョンの上空に見えてしまった
実際にダンジョンへワープして上を見上げたら、はるか上空に拠点の街が見えていました。
このゲームの世界観は「不思議なダンジョン(空や太陽がある地下空間)」なので、上に街が浮いているのは明らかにおかしいです。
解決策:Kill Z を深く設定する
UE5 には LWC(Large World Coordinates) という機能があり、超大きな座標でもフローティングポイントの精度を維持できます。地下10kmへの配置はこれで成立しています。
あとは即死を防ぐだけです。Z = -1,000,000 の座標に移動した際に「落下死」しないよう、ワールドセッティングの Kill Z を -2,000,000 に設定しました。
これで地下10kmが安全な隔離空間として機能します。街はダンジョンから目視できない距離に離れているので、上空に見えることもなくなりました。
トラブル②:敵がスポーンしない(魔法陣だけ表示される)
ダンジョンに敵スポナーを設置してテストしたところ、スポーン時の VFX(魔法陣)は出るのに、肝心の AI 本体が現れませんでした。
さらに、クライアント側のログに不穏な文字が。
Reason=Destroyed
「サーバー側のキャラクターが破棄された?」と思い、かなり焦りました。
原因:NavMeshBoundsVolume を置き忘れていた
Reason=Destroyed のログは、後述するネットワーク・カリングによる正常な挙動でバグではありませんでした。
スポーン失敗の真の原因は別にあります。地下10kmの隔離エリアに NavMeshBoundsVolume を配置し忘れていたことです。
FCS のスポナーは「AIが立てる足場があるか」をチェックしてからスポーンします。NavMesh がなければ「足場なし」と判定し、安全装置が働いてスポーンをキャンセルします。VFX だけ出てキャラが出ないのはそのためでした。
解決策: 地下10kmのエリア全体を覆う巨大な NavMeshBoundsVolume を配置。これで AI が正常にスポーン・徘徊できるようになりました。
「Reason=Destroyed」ログの正体
ここが今回いちばん面白かった部分です。
このログは「ダンジョン開始地点に全員ワープした後、一人でしばらく歩いたとき」に出ていました。自分自身はその後も普通に操作できています。
この2点から、ログの正体が特定できます。
これはバグではなく、UE5 の通信最適化が正常に動いた証拠です。
UE5 のマルチプレイには ネットワーク・カリング(Net Cull Distance) という仕組みがあります。「一定距離以上離れたプレイヤーのデータは、お互いの PC から一時的に消去する」という通信節約機能です。
今回起きたのはこういうことです。
全員がダンジョン入り口にワープ
→ 自分が一人で歩き始める
→ 他プレイヤーと一定距離以上離れる
→ サーバーが「もう互いに見えない距離だ」と判断
→ 自分の PC から「他プレイヤーのコピー」をメモリ解放(Destroy)
→ Reason=Destroyed のログが出る
消えたのは「遠くにいる他プレイヤーの描画データ」であり、自分自身のキャラクターではありません。だから操作に影響がなかったのです。
実際に入口の方へ引き返してみると、近づいた瞬間に他プレイヤーが再び出現しました。サーバーからデータが送られてきて、PC 上に再スポーンされた形です。
これは UE5 が正しく帯域を節約してくれている証拠なので、何も対処する必要はありません。
今日学んだこと
- 同一レベルの地下10km隔離は、マルチプレイで GameState を維持しながらダンジョンを切り替える有効な手法。
- Kill Z を -2,000,000 に設定することで、地下10km座標を安全な作業空間にできる。
- NavMeshBoundsVolume は隔離エリアにも配置が必要。忘れると AI がスポーンしない。
Reason=Destroyedログはバグではない。ネットワーク・カリングによる正常な通信最適化。
現在の状況
ダンジョンの隔離配置・敵スポーン・帰還フローまで一通り動くようになりました。
次はいよいよコア戦闘の実装です。「15〜25秒で1体倒せる」戦闘感触を FCS で作っていきます。
次回:FCS を使ったコア戦闘の実装と、気持ちよさをどう作るか

