メインコンテンツまでスキップ

バトルシステムのアーキテクチャ

MCE のバトルシステムは、モジュール式のコンポーネントアーキテクチャの上に構築されています。BattleManager は 1 つの GameObject 上に、戦闘の 1 つの側面をそれぞれ担当する 15 個の専用モジュールとともに置かれます。BattleStateMachine がターンループを駆動し、システム全体は Zenject の依存性注入で結び付けられます。

進行中のバトル

その画面にあるものはすべて、別々のモジュールが報告したものです。2 つの HP バー、行動 メニュー、スプライトとその登場アニメーション、そして誰が先に動くかを決めた行動順。 BattleManager はそのどれも直接所有しておらず、各モジュールに順番に問い合わせ、 次に何が起こるかはバトルループが決めます。

アーキテクチャの概要​

BattleLauncher (ScriptableObject, loads the battle scene)
└─ BattleManager (orchestrator, on the battle scene's GameObject)
├─ BattleStateMachine (turn loop)
├─ BattleManagerBattlersModule (battler lookup, sprites, forms)
├─ BattleManagerHealthModule (HP, fainting)
├─ BattleManagerMovesModule (move execution)
├─ BattleManagerItemsModule (in-battle items)
├─ BattleManagerCaptureModule (catch mechanics)
├─ BattleManagerAIModule (enemy decisions)
├─ BattleManagerAnimationModule (intro and flow animations)
├─ BattleManagerAudioModule (music, SFX)
├─ BattleManagerStatusesModule (burn, poison, sleep, field effects...)
├─ BattleManagerBattlerStatsModule (stat stages)
├─ BattleManagerBattlerSwitchModule (party switching)
├─ BattleManagerRostersModule (party management)
├─ BattleManagerScenariosModule (weather, terrain, scenario setup)
├─ BattleManagerMegaModule (Mega Evolution)
└─ BattleManagerCharactersModule (trainer characters and sprites)

BattleManager​

BattleManager は中央のコーディネーターです。バトルのロジック自体は持たず、モジュールに委譲します。その責務は次のとおりです。

  • バトル開始時にすべてのモジュールを初期化する。
  • モジュール間の通信のための共有の参照点を提供する(各モジュールは BattleManager を通じて同じ階層のモジュールにアクセスします)。
  • UI(プレイヤーの行動)と AI(敵の行動)からのコマンドを受け取る。
  • バトルの開始・終了イベントを通知する。

BattleManager は IBattleManager を実装します。進行中のバトルの BattleType(SingleBattle または DoubleBattle)と EnemyType(Wild または Trainer)を公開します。そのメンバーについては BattleManager API を参照してください。

BattleStateMachine​

BattleStateMachine は 1 つのコルーチンループです。各ターンで次のことを行います。

Update which battlers have fought
→ Request actions (the player's menu, the AI of every other roster)
→ Determine the order (move priority, then speed)
→ Perform the actions
→ After-turn callbacks (before and after the status countdown)
→ Status countdown (weather, burn, poison...)
→ Check and process fainted battlers (XP, replacements)
→ [next turn]

IsBattleOver になるまで続きます。その後、終了アニメーションを再生し、賞金を渡し(または敗北時の所持金を差し引き)、バトル終了時のコールバックを実行します。バトルがサーバー権威(MCE Online)の場合、ターンはローカルではなくサーバーが解決します。ループは行動を送信し、返ってきたものを表示します。

バトルモジュール詳解​

BattleManagerBattlersModule​

両陣営の Battler インスタンスを管理します。Battler は MonsterInstance を拡張して、バトル中の状態を持ちます。

  • 能力ランク(StatStage、BattleStatStage)、急所ランク、みがわり、揮発性の状態。
  • 戦ったバトラーの一覧、消費したアイテム、最後に使った技と受けた技。
  • MonsterMathHelper による実効ステータス(基礎値 + 個体値 + 努力値 + 性格 + 能力ランク)。

BattleManagerHealthModule​

ChangeLife を通じたすべての HP 変化(ダメージと回復。ヒットのアニメーションと音を伴う)と、ひんしのバトラーの検出と処理を扱います。

BattleManagerMovesModule​

技を実行します(PerformMove)。命中と回避のチェック、技の効果とアニメーション。ダメージ自体は技(DamageMove)が 技 の計算式を使って算出します。

BattleManagerItemsModule​

バトル中のアイテム使用 -- 回復アイテム、状態異常の治療、X アイテム -- をプレイヤーのバッグから消費します。トレーナーには専用の Bag があります。

BattleManagerCaptureModule​

野生モンスターの捕獲(TryCaptureMonster):

  • 種の捕獲率、現在の HP、状態異常、ボール(BattleUtils.CalculateShakeProbability)に基づく捕獲率の計算。
  • ボールが揺れるアニメーション。捕獲または脱出の前に複数回の揺れの判定があります。
  • 捕獲したモンスターをプレイヤーのパーティまたはストレージに追加。

BattleManagerAIModule​

ロースターごとに、差し替え可能な BattleAI 戦略を 1 つ保持します。

  • 現在のバトル状態を受け取る。
  • BattleAction(技を使う、交代、アイテムを使う、逃げる)を返す。
  • 組み込みの戦略と、それらを連結する・自作する方法については バトル AI を参照してください。

BattleManagerStatusesModule​

あらゆる種類の状態を管理します。

  • 状態異常(バトラーごとに同時に 1 つ):やけど、こおり、まひ、どく、もうどく、ねむり。
  • 揮発性の状態(VolatileStatus、バトラー上):こんらん、ひるみ、バインドなど。
  • サイドの状態(SideStatus)とグローバルな状態(GlobalStatus)。フィールドの片側、または全体に及ぶ効果です。バトルの天候と地形はシナリオ(BattleManagerScenariosModule)に属します。

各状態は、TriggerStatusesCountdown とその前後のコールバックを通じて、ターンの適切なタイミングで効果を適用します(例:ターン終了時のやけどダメージ、技の前のまひ)。

BattleManagerBattlerStatsModule​

能力ランクの変化を扱います。

  • 能力ランクは -6 から +6 の範囲です。
  • こうげき、ぼうぎょ、とくこう、とくぼう、すばやさのランクは倍率を適用します:+1 = 1.5 倍、+2 = 2.0 倍、…、+6 = 4.0 倍、-1 = 0.67 倍、-2 = 0.5 倍、…、-6 = 0.25 倍。命中と回避は独自のテーブルを使います。
  • 特性はランクの変化に反応できます(Battler は OnStatChange と AfterStatChanged のフックを提供します)。

BattleManagerMegaModule​

メガシンカのサポート:

  • バトラーの種が利用可能なメガフォームを持つかを確認する(CanSwitchToMegaForm)。
  • バトルごとにロースター 1 つにつき 1 回のメガシンカを許可する。
  • フォームチェンジを再生し、メガフォームのデータを適用する。

BattleManagerCharactersModule​

各陣営にキャラクターを与えます:トレーナーのスプライト(BattleTrainerSprite)、賞金、敗北時の所持金。プレイヤーの背面がどのように描かれ、アニメーションするかについては、トレーナーの背面スプライトとボール投げ を参照してください。

バトルの流れの例​

プレイヤーが「Fight」を選び、技を選んだときに起こることは次のとおりです。

  1. Request actions -- プレイヤーは技パネルから技を選び、AI がもう一方のロースターの分を選びます。
  2. 順序 -- すべての行動が、技の優先度、次に素早さの順(高いほうが先。同値ならランダム)で並べられます。
  3. 技の実行(素早いほうのバトラー):
    • 命中を判定する -- 技は当たるか?
    • ダメージを計算する(ダメージ技の場合):((2*Level/5+2) * Power * Atk/Def) / 50 + 2
    • 補正を適用する:対象の数、天候、地形、急所、ランダム乱数(0.85-1.0)、タイプ一致、タイプ相性、状態、そして特性・アイテム・サイドの状態による加算。
    • 追加効果(能力変化、状態異常)を適用する。
  4. 技の実行(遅いほうのバトラー。まだ立っている場合)。
  5. ターン終了のコールバックと状態のカウントダウン -- 天候と状態によるダメージ、持ち物の効果、特性の発動。
  6. ひんしの処理 -- バトラーの HP が 0 なら、ひんしを処理し(経験値/努力値を与え、進化を確認)、交代を求めます。

野生バトルとトレーナーバトル​

項目野生バトルトレーナーバトル
EnemyTypeWildTrainer
捕獲できるできない
逃走できる。戦っている敵にアルファがいない場合(CanPlayerRun)できない
賞金なしあり
AIランチャーのデフォルト AI。バトルが独自のものを持つ場合を除く同じ
再戦ランダムエンカウントスクリプト(CommandGraph)

バトルタワーと匿名トレーナー​

ポーズメニューの Battle Tower(TowerController)は、終わりのない PvE の進行を実行します。プレイヤーのチームを TowerRuleSet に照らして検証し、IBattleLauncher を通じて生成された AI の対戦相手とのバトルを開始し、そのバトル自身の終了コールバックから結果を適用して次の戦いを再開します。敗北するまで続きます。プレイヤー向けのフローとデフォルトのバランスについては、シークレットベースとプレイヤージム のガイドを参照してください。

タワーの対戦相手は匿名です。プレイヤーのロースター参照から生成されるため、CharacterData も Bag も持ちません。バトルシステムは、こうしたトレーナーを例外にせず許容します。

  • BattleManagerCharactersModule は敵トレーナーのスプライトセットを保護します -- CharacterData が null ならロースターは戦い続けますが、トレーナーのスプライトは表示されません(賞金にも寄与しません)。
  • BattleManagerItemsModule は、敵の Bag が null の場合に空の Bag で代用するため、AI は有効だがアイテムのないバッグを受け取ります。

これにより、シーンも正体もなく生成された対戦相手が、作り込まれたトレーナーとまったく同じようにバトルできます。

バトルの設定​

2 つのレイヤーがバトルを設定します。

  • BattleConfigurationFile(Create > MCE > Battle > Configuration)は、プレイヤー向けのバトル設定を保持します:Battle Style と Battle Animation Speed Up(1〜8)。BattleManager.Configuration を通じて読み取られ、BattleSpeed の出どころです。
  • BattleLauncher アセットは、バトルシーン、野生とトレーナーのバトル音楽、Default AI を保持します。

捕獲の難易度と経験値のルールは、MCESettings アセットとゲームのグローバルデータにあります。

バトルイベントの購読​

ソースコードなし​

バトルランチャーは依存性注入にバインドされており、バトルが開始されたとき、アンロードされる直前、終了したときに通知します。

[Inject] private IBattleLauncher battleLauncher;

battleLauncher.SubscribeToBattleLaunched(() => Debug.Log("Battle launched"));
battleLauncher.SubscribeToBattleEnded(result => Debug.Log($"Battle ended, won: {result.PlayerWon}"));

IBattleSystem(engine.Battle。OnBattleStarted と OnBattleEnded を持つ)は SDK 独自のコントラクトですが、エンジンはまだこれに値を供給していません:IBattleSystem を参照してください。

ソースコードあり(Source・Studio エディション)​

ソースにアクセスできれば、BattleManager.SubscribeToBattleInitialized と SubscribeToBattleFinished で購読したり、BattleManager の隣に独自のモジュールを追加したりできます(バトルの内部 を参照)。