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

BattleManager

1回のモンスターバトルを駆動する MonoBehaviour です。BattleManager は薄い調整役で、 実際の処理は 15 以上のモジュール(それぞれが同じ GameObject 上の独立した MonoBehaviour)に分割され、ターンの流れは BattleStateMachine が制御します。これはそのアーキテクチャの Source 層マップです。

Namespace: OpenMon.MCE.Battle

SDK と Source のサーフェス

ほとんどの統合では BattleManager を直接扱いません。読み取り専用の SDK インターフェース IBattleSystem(イベント、現在の状態)を通じてバトルを観測します。 以下のメンバーは internal(モジュールアクセサ)か、エンジンアセンブリ (OpenMon.MCE.Runtime)内部で使う具象 BattleManager API、すなわち Source 層です。 状態をゲームコードから読むためではなく、バトルロジックを拡張するときに使ってください。

クラスの形​

[RequireComponent(typeof(BattleStateMachine))]
[RequireComponent(typeof(BattleManagerBattlersModule))]
// ...モジュールごとに 1 つの RequireComponent...
public class BattleManager : OpenMonBehaviour<BattleManager>, IBattleManager, IPlayerDataReceiver
{
// モジュールアクセサ(internal — 兄弟コンポーネントから解決):
internal BattleManagerBattlersModule Battlers { get; }
internal BattleManagerHealthModule BattlerHealth { get; }
internal BattleManagerMovesModule Moves { get; }
internal BattleManagerCaptureModule Capture { get; }
internal BattleManagerAIModule AI { get; }
// ...BattlerStats, BattlerSwitch, Rosters, Scenario, Statuses,
// Characters, Animation, Audio, Megas...

// 公開バトル状態:
public BattleType BattleType;
public EnemyType EnemyType;
public bool IsBattleOver;
public int TurnCounter { get; }
public byte BattleSpeed { get; }
public bool CanPlayerRun { get; }

public void SubscribeToBattleInitialized(Action callback);
public void SubscribeToBattleFinished(Action<BattleResultParameters> callback);
public void TickTurn();
public void FinishBattle();
public BattleMonsterSprite GetMonsterSprite(BattlerType type, int index);
}

各モジュールは共有基底クラス BattleManagerModule<T> を継承し、同じ兄弟モジュールアクセサ 群を公開するため、モジュール同士が相互に呼び出せます。

public abstract class BattleManagerModule<T> : OpenMonBehaviour<T>
where T : BattleManagerModule<T>
{
protected BattleManager BattleManager { get; }
protected BattleManagerBattlersModule Battlers { get; }
protected BattleManagerHealthModule BattlerHealth { get; }
// ...BattleManager と同じアクセサ...
}

モジュール一覧​

各バトル挙動は BattleManager の隣に置かれる 1 つの MonoBehaviour で、 [RequireComponent] により必須化されます。以下の 5 つはバトルを拡張するときに触れるもので、 残りは表示と記録を扱います。

モジュールアクセサ責務
BattleManagerBattlersModuleBattlersバトラーの検索、スプライト、フォルム、逃走
BattleManagerHealthModuleBattlerHealthHP 変化、ひん死の検出と処理
BattleManagerMovesModuleMoves技の実行、命中率
BattleManagerCaptureModuleCapture捕獲試行
BattleManagerAIModuleAIロスターごとの AI
BattleManagerBattlerStatsModuleBattlerStatsステータス段階、開始時の仲良し度
BattleManagerBattlerSwitchModuleBattleManagerBattlerSwitchバトラーの出し入れ
BattleManagerRostersModuleRostersロスター準備、ひん死チェック
BattleManagerScenariosModuleScenario天候、地形、シナリオ設定
BattleManagerStatusesModuleStatuses状態異常
BattleManagerCharactersModuleCharactersトレーナーキャラクター
BattleManagerAnimationModuleAnimationバトル導入/進行アニメーション
BattleManagerAudioModuleAudioバトル音声
BattleManagerMegaModuleMegasメガ/ギガ フォルムチェンジ

公開状態とコールバック​

BattleType​

進行中のバトルの種類(シングル、ダブルなど)。

型: BattleType

EnemyType​

このバトルが Wild(野生)モンスター相手か Trainer(トレーナー)相手か。

型: EnemyType

IsBattleOver​

バトルが決着すると true。

型: bool

TurnCounter​

このバトルで経過したターン数。

型: int(読み取り専用)

BattleSpeed​

バトル設定から取得した、このバトルのアニメーション加速係数。

型: byte(読み取り専用)

CanPlayerRun​

敵が Wild で、戦っている敵バトラーのどれもアルファでないとき true。

型: bool(読み取り専用)

SubscribeToBattleInitialized(Action callback)​

バトルの初期化完了時に発火するコールバックを登録します。

SubscribeToBattleFinished(Action<BattleResultParameters> callback)​

バトル終了時に発火し、BattleResultParameters(バトル種別、勝者、捕獲モンスター、 リスポーンフラグ)を受け取るコールバックを登録します。

TickTurn()​

ターンカウンターを進め、LastSuccessfulMoveThisTurn をクリアします。各ターン開始時に ステートマシンが呼び出します。

FinishBattle()​

BattleResultParameters を構築し、バトル終了コールバックを発火します。

GetMonsterSprite(BattlerType type, int index)​

バトラースロットの画面上の BattleMonsterSprite を取得します。Battler や (BattlerType, int) タプルを受け取るオーバーロードもあります。

戻り値: BattleMonsterSprite。

Battlers モジュール​

BattleManagerBattlersModule — バトラーとインデックスの相互解決、およびスプライト。

GetBattlerFromBattleIndex(BattlerType type, int battleIndex)​

ある陣営のバトルインデックス位置の Battler を取得します。

戻り値: Battler。

GetTypeAndIndexOfBattler(Battler battler)​

逆引き: バトラーの (BattlerType Type, int Index)。

戻り値: (BattlerType Type, int Index)。

GetBattlersFighting(BattlerType type)​

ある陣営で現在戦っている全バトラー。引数なしのオーバーロードは両陣営を返します。

戻り値: List<Battler>。

IsBattlerFighting(BattlerType type, int battlerIndex)​

指定スロットに実際に戦っているバトラーがいるか。

戻り値: bool。

ChangeForm(BattlerType battlerType, int index, ...)​

バトル中にバトラーのフォルムを変更するコルーチン(リージョン/メガ/へんしん)。 異なるフォルムチェンジのトリガーごとに複数のオーバーロードがあります。

戻り値: IEnumerator。

RunAway(BattlerType type, int index, bool playAnimation, bool bypassAllyChances = false)​

バトルから逃走を試みるコルーチン。

戻り値: IEnumerator。

Health モジュール​

BattleManagerHealthModule — HP の変更とひん死処理。

ChangeLife(Battler battler, Battler user, int amount, Move userMove = null, bool playAudio = true, bool forceSurvive = false, bool isSecondaryDamage = false, bool ignoreAbilities = false, Action<int, bool> finished = null)​

バトル中のバトラーにダメージや回復を適用する正規の方法。被弾アニメーションと音声を再生し、 特性を発動させ、finished を通じて (適用量, ひん死か) を報告します。Battler 参照の 代わりにバトラーインデックスを受け取るオーバーロードもあります。

戻り値: IEnumerator。

CheckFaintedBattlers()​

このステップで HP が 0 になったバトラーを検出するコルーチン。

戻り値: IEnumerator。

ProcessFaintedBattlers()​

ひん死アニメーションを再生し、ひん死のバトラーを解決するコルーチン。

戻り値: IEnumerator。

GetNumberOfFainted(BattlerType battlerType, int battlerIndex)​

ロスター内のひん死モンスター数。

戻り値: int。

Moves モジュール​

BattleManagerMovesModule — 技の実行。

PerformMove(BattlerType type, int index, List<(BattlerType Type, int Index)> targets, int moveIndex)​

スロット moveIndex(4 つの技スロットは 0〜3、わるあがきは 4)の技を指定ターゲットに 対して実行し、効果パイプライン全体を走らせます。

戻り値: IEnumerator。

ForcePerformMove(BattlerType type, int index, ...)​

特定の技を強制的に実行します(他の技を呼び出す技効果が使用)。

戻り値: IEnumerator。

LastSuccessfullyPerformedMove​

最後に成功した技。

型: Move

Capture モジュール​

BattleManagerCaptureModule — 野生モンスターの捕獲。

TryCaptureMonster(int index, Ball ball)​

index の敵バトラーに対し、指定 Ball で捕獲を試みるコルーチン。トレーナー相手や、 敵が 2 体以上戦っている場合は何もしません(エラーをログ出力)。

戻り値: IEnumerator。

AI モジュール​

BattleManagerAIModule — プラガブルなロスターごとの AI。

PlayerControlsFirstRoster​

人間プレイヤーが最初の味方ロスターを操作するか。

型: bool

AllyAIs / EnemyAIs​

各陣営の各ロスターに割り当てられた BattleAI 戦略。

型: List<BattleAI>

GetAI(BattlerType type, int index)​

指定ロスターを制御する BattleAI を取得します。

戻り値: BattleAI。

BattleAI(戦略の基底)​

AI 戦略は抽象 ScriptableObject BattleAI(OpenMon.MCE.Battle.AI)を継承します。 組み込み戦略には RandomBattleAI、PerformEffectiveMove、PerformRandomMove、 MLBattleAI(ML-Agents 駆動)があります。

public abstract class BattleAI : MonsterDatabaseScriptable<BattleAI>
{
public abstract IEnumerator RequestPerformAction(MCESettings settings,
BattleManager battleManager, BattlerType type, int inBattleIndex,
Action<BattleAction> callback);

public abstract int RequestNewMonster(MCESettings settings,
BattleManager battleManager, BattlerType type, int inBattleIndex,
List<Battler> forbiddenBattlers);

public virtual void OnBattlerFainted(BattleManager battleManager,
BattlerType ownType, int ownIndex, BattlerType faintedType, int faintedIndex);

public virtual void OnBattleEnded(BattlerType ownType, int ownIndex,
BattlerType winners, BattleManager battleManager);
}

独自の AI を追加するには、BattleAI を継承し、RequestPerformAction(ターンの行動を選ぶ) と RequestNewMonster(ひん死後の交代を選ぶ)を実装し、そのアセットをバトルテンプレートに 割り当てます。

BattleStateMachine​

BattleStateMachine([RequireComponent] の兄弟)がターンループを駆動します。 BattleManager.Construct がバトル初期化を開始し、準備が整うと次を呼びます。

GetCachedComponent<BattleStateMachine>().StartBattleLoop();

StartBattleLoop()​

順序付きターンループ(行動収集 → 優先度で並べ替え → 解決 → ひん死チェック → 次ターン)を IsBattleOver まで走らせるコルーチンを開始します。

バトルの拡張​

using System.Collections;
using OpenMon.MCE.Battle;
using OpenMon.Foundation.Behaviours;

namespace MyGame.Battle
{
// 独自モジュールは BattleManager と同じ GameObject に置かれ、共有基底クラスを通じて
// 他のモジュールに到達します。
public class MyBattleHookModule : BattleManagerModule<MyBattleHookModule>
{
public IEnumerator HalveEnemyLead()
{
Battler lead = Battlers.GetBattlerFromBattleIndex(BattlerType.Enemy, 0);
int damage = (int)(lead.CurrentHP / 2);

// アニメーション/特性が発動するよう HP を Health モジュール経由で流します。
yield return BattlerHealth.ChangeLife(lead, lead, -damage);
}
}
}