IBattleSystem
Контракт для взаимодействия с системой сражений из игрового кода. Позволяет проверять состояние боя и подписываться на события.
Вы запускаете сражение и слушаете. Всё, что стоит за интерфейсом, можно менять — вплоть до переноса всего боя на сервер — не трогая ваш код.
Пространство имён: OpenMon.MCE.SDK
Определение
public interface IBattleSystem
{
bool IsInBattle { get; }
event Action OnBattleStarted;
event Action<bool> OnBattleEnded;
}
engine.Battle — это BattleSystemFacade. Он устанавливает IsInBattle и вызывает OnBattleStarted и OnBattleEnded, когда движок обращается к его хукам NotifyBattleStarted() и NotifyBattleEnded(bool playerWon). В текущем движке эти хуки пока никто не вызывает, поэтому IsInBattle остаётся false, а оба события не срабатывают. Пока они не подключены, наблюдайте за сражениями через запускатель сражений (battle launcher), который привязан в DI и действительно уведомляет: IBattleLauncher.BattleInProgress, SubscribeToBattleLaunched, SubscribeToBattleToUnload и SubscribeToBattleEnded(Action<BattleResultParameters>).
Свойства
IsInBattle
Идёт ли в данный момент сражение.
Тип: bool
Возвращает true с момента загрузки сцены сражения до тех пор, пока результаты не будут обработаны и игра не вернётся в мир.
События
OnBattleStarted
Вызывается при начале сражения, после загрузки сцены сражения и инициализации BattleManager.
Сигнатура: event Action OnBattleStarted
OnBattleEnded
Вызывается при завершении сражения, до выгрузки сцены сражения.
Сигнатура: event Action<bool> OnBattleEnded
| Параметр | Тип | Описание |
|---|---|---|
playerWon | bool | true, если игрок победил; false, если игрок проиграл, сбежал или был повержен |
Пример использования
using OpenMon.MCE.SDK;
using Zenject;
public class BattleTracker : MonoBehaviour
{
// Only IMonsterCaptureEngine is bound in DI; reach subsystems through it.
[Inject] private IMonsterCaptureEngine engine;
private IBattleSystem battle;
private int totalBattles;
private int wins;
private void Awake()
{
battle = engine.Battle;
}
private void OnEnable()
{
battle.OnBattleStarted += OnBattleStart;
battle.OnBattleEnded += OnBattleEnd;
}
private void OnDisable()
{
battle.OnBattleStarted -= OnBattleStart;
battle.OnBattleEnded -= OnBattleEnd;
}
private void OnBattleStart()
{
totalBattles++;
}
private void OnBattleEnd(bool playerWon)
{
if (playerWon) wins++;
Debug.Log($"Record: {wins}/{totalBattles}");
}
private void Update()
{
// Disable certain UI when in battle
if (battle.IsInBattle)
{
// Hide overworld HUD elements
}
}
}
Всегда отписывайтесь от событий в OnDisable() или OnDestroy(), чтобы избежать утечек памяти. Это особенно важно для MonoBehaviour, которые могут быть уничтожены при переходах между сценами.