UE5 + GAS で PvE 協力 ARPG の戦闘コアを組む — Dungeon Wanderers Phase 2 進捗

ダンジョンの石の回廊、トーチの揺らぎと霧 Game

Dungeon Wanderers の戦闘設計思想

Dungeon Wanderers は 4 人協力 PvE のプロシージャルダンジョン ARPG です。Steam を主軸に、Listen Server 方式で小規模協力プレイを想定しています。

戦闘の核は「読み合いの気持ちよさ」。派手な演出より、回避・ガード・パリィという攻防の選択が噛み合う瞬間を大事にしたい。だから Phase 2 では、まず戦闘コアの骨組みを「手触りの軸」から定義しました。

Phase 2 はまだ完了ではありませんが、戦闘 GA 4 種の骨組みが揃った節目です。この記事ではそこまでの設計判断と実装手応えを整理します。

なぜ GameplayAbilitySystem なのか

Unreal Engine の GameplayAbilitySystem(GAS)は学習コストが高いサブシステムですが、Dungeon Wanderers では Phase 1 から一貫して GAS 前提で設計しました。理由は単純で:

  • Lyra / Fortnite が採用している実績がある
  • マルチプレイ同期を意識した設計が最初から組み込まれている
  • 能力・エフェクト・属性が分離されていて、MMO/ARPG 規模の複雑な戦闘ロジックでも破綻しにくい
  • 後付けマルチプレイ対応で詰むことを、過去プロジェクトで経験している

ARPG で後からマルチプレイを足すと、状態同期・予測・ロールバックのすべてが後付けになり、体感が劇的に悪化します。Lyra の設計思想を見て、最初から GAS ネイティブで組むと決めました。

Phase 2 で実装した 4 つの戦闘能力

1. GA_MeleeAttack — コンボ対応の近接攻撃

  • Enhanced Input から発動
  • コンボ状態を FDwanComboState 構造体で管理(純粋ロジック)
  • 次段に繋がる入力ウィンドウが開いている間のみ、コンボが進行
  • BP 側のモンタージュと連動してヒットフレームを定義

2. GA_Parry — 攻撃の瞬間を読む駆け引き

  • Parry は Dungeon Wanderers の核心メカニクス
  • 敵攻撃の直前のごく短い窓に Parry 入力が重なるとリアクション発動
  • タイミング判定をサーバー任せにすると体感が崩れるので、LocalPredicted + 遅延補償で処理
  • 失敗すると隙が大きい — リスクとリターンの設計

3. GA_Dodge — 8 方向 + 無敵フレーム

  • 入力方向に応じて 8 方向にローリング
  • 開始〜中盤に無敵フレーム(i-frame)
  • FDwanDodgeDirection で方向計算を純粋ロジック化、テストで守る

4. GA_Guard — 長押しで持続

  • 長押し中は被ダメージを軽減
  • スタミナ的リソースを消費(将来実装)
  • Parry のリスクリターンに対する「安全側の選択肢」として配置

この 4 つの攻防が噛み合うことで、「攻撃したい → でも敵が攻撃モーションに入った → ガードで凌ぐか、タイミングに賭けてパリィするか、回避で離れるか」という選択が毎瞬間発生する設計を目指しています。

過去プロジェクトの教訓 — LocalPredicted 優先

この設計の背景には、過去プロジェクトでの失敗経験があります。

以前参加していた ARPG 案件ではサーバー権威一辺倒で戦闘を組み、同期の正しさは保証されていました。しかし、プレイヤー体感は壊滅的でした。ping 60ms 環境でも「ボタンを押してから反応が返ってくる」遅延が気持ちよさを完全に殺していました。

この経験から Dungeon Wanderers では設計原則を逆転させました:

  • プレイヤー入力に対する応答は LocalPredicted で即反応させる
  • サーバー検証は「不正チェック」と「他プレイヤーへの同期」に限定
  • ズレが検出された時のロールバックを丁寧に設計(Phase 2 後半のタスク)

特にパリィのようなタイミング駆動のメカニクスは、サーバー判定に回した瞬間に「入力したのに効かない」という体感崩壊が起きます。Parry だけはどうしてもローカル優先という制約が、戦闘全体の設計に一貫性を要求しています。

これは UE5 標準の AbilityActivationMode::LocalPredicted を正しく使えば実現可能ですが、「設計原則として最初から優先する」と決めておくことが重要でした。

TDD で純粋ロジックを守る

戦闘ロジックは性質上、退行バグが怖い領域です。「前は正しく動いてたパリィが、新機能追加でタイミングがズレた」みたいな退行は、プレイ感にクリティカルに効きます。

Phase 2 では以下の構造体を純粋ロジックとして分離し、Unreal のテストフレームワークで自動テスト化しました:

  • FDwanComboState — コンボ状態遷移
  • FDwanDamageFormula — ダメージ計算式
  • FDwanDodgeDirection — 回避方向計算
  • FDwanSkillSlotSet — 16 スロット切替ロジック

現在 59+ tests が常時 PASS しています。戦闘の「数字」部分は、プロジェクトが大きくなってもここで守られます。

BP 側のアニメーション・エフェクト・手触り調整は従来通り非 TDD ですが、手触り ≠ 数字ロジックの分離を最初から明確にしたのが Phase 2 の設計的な勝ち筋だと感じています。

サブエージェントレビュー運用

今回 Phase 2 の実装では、Claude Code の gas-specialist / network-checker サブエージェントレビューを合わせて受けました。GAS 設計の怪しい点・ネットワーク面で詰みそうな点を、実装直後にフィードバックしてもらう運用です。

結果、以下のようなレビューが入りました:

  • 「GA の Activation タグが他の Ability と衝突する可能性」
  • 「Cue の発動が RepNotify の前に入って視覚と数値がズレうる」
  • 「Cost.Stamina の GE 適用タイミングが Instant / Duration で挙動違うので明示すべき」

全部手動でコードを追って気づけたレベルではなかった類の指摘です。個人開発で GAS のような巨大サブシステムを触る時、レビューパスを AI に持たせるのはかなり効く運用でした。

次のマイルストーン

  • Phase 2 ダメージ適用: GE_Dwan_Damage + ヒット判定 + Lag Compensation
  • Phase 2 Combat/LockOn モジュール実装: 敵対象の捕捉・切替
  • 戦闘プロトタイプ動画化(Parry の手触りデモが核になる)
  • Phase 3 Phase System(ダンジョン進行管理)

まとめ

Dungeon Wanderers Phase 2 は 戦闘コアの骨組みが揃った地点です。GAS ネイティブ設計・LocalPredicted 優先・TDD で純粋ロジック保護 — 過去プロジェクトの失敗を教訓にした設計原則が、機能追加に耐える土台を作りつつあります。

次はダメージ適用と LockOn まわり。Parry の手触りデモ動画が撮れたら、またここで共有します。

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