BattleManager
驱动单场怪物对战的 MonoBehaviour。BattleManager 是一个轻量协调器:真正的工作被拆分到
15+ 个模块(每个都是同一 GameObject 上独立的 MonoBehaviour)中,回合流程由
BattleStateMachine 驱动。这是该架构在 Source 版中的地图。
Namespace: OpenMon.MCE.Battle
在大多数集成中,你不会直接与 BattleManager 打交道——你通过只读的 SDK 接口
IBattleSystem(事件、当前状态)观察对战。下面的成员是 internal
(模块访问器)或在引擎程序集(OpenMon.MCE.Runtime)内部使用的具体 BattleManager API,
即 Source 版和 Studio 版。在扩展对战逻 辑时使用它们,而不是用于从游戏代码读取状态。
类结构
[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] 必需化。
下面五个是你在扩展对战时会接触的;其余负责表现与记账。
| 模块 | 访问器 | 职责 |
|---|---|---|
BattleManagerBattlersModule | Battlers | 战斗者查找、精灵图、形态、逃跑 |
BattleManagerHealthModule | BattlerHealth | HP 变化、濒死检测与处理 |
BattleManagerMovesModule | Moves | 招式执行、命中率 |
BattleManagerCaptureModule | Capture | 捕获尝试 |
BattleManagerAIModule | AI | 按队伍的 AI |
BattleManagerBattlerStatsModule | BattlerStats | 能力等级、开场亲密度 |
BattleManagerBattlerSwitchModule | BattleManagerBattlerSwitch | 战斗者上下场 |
BattleManagerRostersModule | Rosters | 队伍准备、濒死检查 |
BattleManagerScenariosModule | Scenario | 天气、地形、场景设置 |
BattleManagerStatusesModule | Statuses | 状态异常 |
BattleManagerCharactersModule | Characters | 训练家角色 |
BattleManagerAnimationModule | Animation | 对战入场/流程动画 |
BattleManagerAudioModule | Audio | 对战音频 |
BattleManagerMegaModule | Megas | 超级/极巨 形态变化 |
公开状态与回调
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。