跳到主要内容

BattleManager

驱动单场怪物对战的 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))]
// ...每个模块一个 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 旁的一个 MonoBehaviour,通过 [RequireComponent] 必需化。 下面五个是你在扩展对战时会接触的;其余负责表现与记账。

模块访问器职责
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 且没有正在战斗的敌方战斗者是 alpha 时为 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 归零的战斗者的协程。

返回: 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(四个招式槽位为 0–3,挣扎为 4)的招式,运行完整的效果管线。

返回: IEnumerator。

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

强制执行某个特定招式(由调用其他招式的招式效果使用)。

返回: IEnumerator。

LastSuccessfullyPerformedMove​

最后一个成功结算的招式。

类型: Move

Capture 模块​

BattleManagerCaptureModule——捕获野生怪物。

TryCaptureMonster(int index, Ball ball)​

用给定 Ball 对 index 处敌方战斗者执行一次捕获尝试的协程。对训练家、或有一个以上敌方在战斗时 不执行任何操作(并记录错误)。

返回: 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);

// 通过 Health 模块路由 HP,以便动画/特性仍会触发。
yield return BattlerHealth.ChangeLife(lead, lead, -damage);
}
}
}