[DevLog #004] ダンジョンを地下10kmに埋めたら、怖いログが出た話

DevLog

はじめに

ダンジョンを「別のレベル」に分けるのではなく、同じレベルの地下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 を使ったコア戦闘の実装と、気持ちよさをどう作るか

タイトルとURLをコピーしました