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

Публичный API для пользователей DLL

Если вы используете уровни Lite, Basic, Pro или Online MCE, движок поставляется как скомпилированная DLL без исходного кода. Это руководство объясняет публичную поверхность API, которую вы можете использовать для взаимодействия и расширения MCE из ваших собственных C#-скриптов.

Пространство имён SDK

MCE раскрывает свой публичный API через пространство имён OpenMon.MCE.SDK. Оно содержит чистые интерфейсы, предоставляющие доступ к подсистемам движка без привязки вашего кода к внутренним реализациям.

IMonsterCaptureEngine

Основная точка входа. Все остальные интерфейсы доступны через неё:

using OpenMon.MCE.SDK;

public class MyGameManager : MonoBehaviour
{
[Inject] private IMonsterCaptureEngine engine;

private void Start()
{
Debug.Log($"MCE Version: {engine.Version}");
Debug.Log($"Monsters in DB: {engine.Database.MonsterCount}");
Debug.Log($"Player name: {engine.Player.PlayerName}");
}
}

Свойства:

СвойствоТипОписание
DatabaseIMonsterDatabaseДоступ только для чтения к базе данных монстров/приёмов/предметов
BattleIBattleSystemСостояние боя и события
PlayerIPlayerDataРостер игрока, деньги, имя, значки
SaveSystemISaveSystemОперации сохранения и загрузки
VersionstringСтрока версии движка MCE

IMonsterDatabase

Запросы монстров, приёмов, способностей, предметов и типов:

IMonsterDatabase db = engine.Database;

// Получить монстра по номеру декса
MonsterEntry flameleon = db.GetMonster(152);

// Получить монстра по имени
MonsterEntry sparkbit = db.GetMonster("Sparkbit");

// Получить эффективность типов
float effectiveness = db.GetTypeEffectiveness(
MonsterType.Electric,
MonsterType.Water
);
// Returns 2.0 (super effective)

IBattleSystem

Мониторинг состояния боя и реакция на боевые события:

IBattleSystem battle = engine.Battle;

// Проверка, идёт ли бой
if (battle.IsInBattle)
{
// Действия во время боя
}

// Подписка на события боя
battle.OnBattleStarted += HandleBattleStarted;
battle.OnBattleEnded += HandleBattleEnded;

IPlayerData

Доступ к текущему состоянию игрока:

IPlayerData player = engine.Player;

// Команда монстров игрока
Roster roster = player.PlayerRoster;
int teamSize = roster.Count;
MonsterInstance firstMonster = roster[0];

// Деньги, имя и значки игрока
int money = player.Money;
string name = player.PlayerName;
int badges = player.BadgeCount;

ISaveSystem

Управление операциями сохранения и загрузки:

ISaveSystem saves = engine.SaveSystem;

saves.Save(1); // Сохранить в слот 1
saves.Load(1); // Загрузить из слота 1
bool hasData = saves.HasSaveData(1); // Проверить наличие данных
saves.DeleteSave(1); // Удалить данные сохранения

// Прослушивание событий
saves.OnSaved += (slot) => Debug.Log($"Saved to slot {slot}");
saves.OnLoaded += (slot) => Debug.Log($"Loaded from slot {slot}");

Внедрение зависимостей

MCE использует Zenject (Extenject) для внедрения зависимостей. Для доступа к интерфейсам SDK в ваших скриптах используйте атрибут [Inject]:

using Zenject;
using OpenMon.MCE.SDK;

public class MyCustomFeature : MonoBehaviour
{
[Inject] private IMonsterCaptureEngine engine;
[Inject] private IMonsterDatabase database;
[Inject] private IBattleSystem battle;

// Zenject автоматически внедрит эти зависимости до вызова Start()
}
Впервые используете Zenject?

Если вы новичок во внедрении зависимостей, вот простая версия: добавьте [Inject] над приватным полем типа интерфейса, и Zenject автоматически его заполнит. Вам не нужно вызывать GetComponent или FindObjectOfType. Поле будет заполнено до выполнения Start().

Если ваш скрипт не является MonoBehaviour, управляемым Zenject, вы можете разрешить зависимость вручную:

var engine = ProjectContext.Instance.Container.Resolve<IMonsterCaptureEngine>();

Настройка через Inspector

Многие системы MCE предоставляют настройку через Unity Inspector без необходимости кода:

Конфигурация ScriptableObject

АссетНазначениеРасположение
BattleConfigurationFileСкорость боя, множители опыта, шансы захватаRuntime/Configuration/
MonsterEntryДанные видов монстровMonsterDatabase/
MoveОпределения приёмовMonsterDatabase/Moves/
WildEncountersSetТаблицы встречАссеты по картам
BattleAIКонфигурация стратегии ИИBattle/AI/

Расширение MCE без исходного кода

Паттерн 1: Слушатель событий

Создайте MonoBehaviour, прослушивающий события MCE и запускающий вашу логику:

public class AchievementTracker : MonoBehaviour
{
[Inject] private IBattleSystem battle;
private int battlesWon;

private void OnEnable()
{
battle.OnBattleEnded += OnBattleEnded;
}

private void OnDisable()
{
battle.OnBattleEnded -= OnBattleEnded;
}

private void OnBattleEnded(bool playerWon)
{
if (playerWon)
{
battlesWon++;
if (battlesWon >= 100)
UnlockAchievement("Battle Master");
}
}
}

Паттерн 2: Запрос к базе данных

Используйте API базы данных для создания пользовательских функций:

public class TypeMatchupHelper : MonoBehaviour
{
[Inject] private IMonsterDatabase database;

public List<MonsterType> GetWeaknesses(MonsterType type)
{
var weaknesses = new List<MonsterType>();
foreach (var attackType in database.GetAllTypes())
{
if (database.GetTypeEffectiveness(attackType, type) > 1f)
weaknesses.Add(attackType);
}
return weaknesses;
}
}

Паттерн 3: Интеграция с сохранениями

Привяжитесь к системе сохранений для пользовательских данных:

public class CustomSaveData : MonoBehaviour
{
[Inject] private ISaveSystem saveSystem;

private void OnEnable()
{
saveSystem.OnSaved += OnGameSaved;
saveSystem.OnLoaded += OnGameLoaded;
}

private void OnGameSaved(int slot)
{
string json = JsonUtility.ToJson(myCustomData);
PlayerPrefs.SetString($"custom_data_slot_{slot}", json);
}

private void OnGameLoaded(int slot)
{
string json = PlayerPrefs.GetString($"custom_data_slot_{slot}");
myCustomData = JsonUtility.FromJson<MyData>(json);
}
}

Паттерн 4: CommandGraph + пользовательские скрипты

Комбинируйте события CommandGraph с вашими MonoBehaviour'ами:

  1. Создайте скрипт с публичным методом.
  2. В CommandGraph добавьте узел события актора.
  3. В Inspector привяжите событие к методу вашего скрипта.

Это позволяет запускать пользовательскую логику C# из визуального скриптинга без модификации внутренних систем MCE.

Что нельзя сделать без исходного кода

ОграничениеОбходной путь
Изменить формулу уронаИспользуйте множители конфигурации в BattleConfigurationFile
Добавить новые модули бояИспользуйте API событий боя для реакции на состояние
Изменить физику перемещенияНастройте параметры скорости и столкновений через Inspector
Добавить новые типы узлов CommandGraphСоздайте пользовательские MonoBehaviour, запускаемые событиями актора
Изменить макеты UIПереопределяйте префабы (если доступны) или накладывайте свой UI поверх
Нужно больше контроля?

Если публичный API слишком ограничен для вашего проекта, рассмотрите обновление до уровня Source. Он включает полный исходный код на C# и документацию по архитектуре для глубокой кастомизации.

Ссылки на сборки

Для ссылки на типы MCE в ваших скриптах ваше определение сборки (.asmdef) должно ссылаться на:

{
"references": [
"OpenMon.MCE.Runtime"
]
}

Если вы не используете определения сборок, типы MCE доступны глобально через DLL.

Лучшие практики

  1. Зависьте от интерфейсов, а не реализаций. Используйте IMonsterCaptureEngine, а не конкретные классы.
  2. Отписывайтесь от событий. Всегда удаляйте обработчики событий в OnDisable или OnDestroy для предотвращения утечек памяти.
  3. Не кэшируйте устаревшие данные. Запрашивайте SDK каждый раз, когда нужны актуальные данные, особенно для IPlayerData.
  4. Используйте Zenject-инъекцию. Избегайте FindObjectOfType или синглтонов для доступа к MCE.
  5. Проверяйте справочник API. Интерфейсы SDK имеют XML-документацию на каждом члене. Ваша IDE покажет подсказки.