Перейти к основному содержимому

IBattleSystem

Контракт для взаимодействия с системой сражений из игрового кода. Позволяет проверять состояние боя и подписываться на события.

ibattle system

Вы запускаете сражение и слушаете. Всё, что стоит за интерфейсом, можно менять — вплоть до переноса всего боя на сервер — не трогая ваш код.

Пространство имён: 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

ПараметрТипОписание
playerWonbooltrue, если игрок победил; 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, которые могут быть уничтожены при переходах между сценами.