Публичный 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}");
}
}
Свойства:
| Свойство | Тип | Описание |
|---|---|---|
Database | IMonsterDatabase | Доступ только для чтения к базе данных монстров/приёмов/предметов |
Battle | IBattleSystem | Состояние боя и события |
Player | IPlayerData | Ростер игрока, деньги, имя, значки |
SaveSystem | ISaveSystem | Операции сохранения и загрузки |
Version | string | Строка версии движка 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()
}
Если вы новичок во внедрении зависимостей, вот простая версия: добавьте [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);
}
}