跳到主要内容

DLL 用户公共 API

如果你使用的是 MCE 的 Lite、Basic、Pro 或 Online 版本,引擎以编译后的 DLL 形式分发,不包含源代码。本指南说明你可以使用的公共 API 接口,从你自己的 C# 脚本中与 MCE 交互和扩展。

SDK 命名空间​

MCE 通过 OpenMon.MCE.SDK 命名空间暴露其公共 API。该命名空间包含干净的接口,提供对引擎子系统的访问,而不会将你的代码耦合到内部实现。

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存档和读档操作
VersionstringMCE 引擎版本字符串

IMonsterDatabase​

查询怪兽、招式、特性、道具和属性:

IMonsterDatabase db = engine.Database;

// 按图鉴编号获取怪兽
MonsterEntry flameleon = db.GetMonster(152);

// 按名称获取怪兽
MonsterEntry sparkbit = db.GetMonster("Sparkbit");

// 获取所有怪兽
IReadOnlyList<MonsterEntry> allMonsters = db.GetAllMonsters();

// 获取招式
Move thunderbolt = db.GetMove("Thunderbolt");

// 获取所有招式
IReadOnlyList<Move> allMoves = db.GetAllMoves();

// 获取属性克制
float effectiveness = db.GetTypeEffectiveness(
MonsterType.Electric,
MonsterType.Water
);
// 返回 2.0(效果拔群)

// 获取所有属性
IReadOnlyList<MonsterType> types = db.GetAllTypes();

// 获取总数
int count = db.MonsterCount;

IBattleSystem​

监控战斗状态并响应战斗事件:

IBattleSystem battle = engine.Battle;

// 检查是否正在战斗中
if (battle.IsInBattle)
{
// 在战斗期间执行某些操作
}

// 订阅战斗事件
battle.OnBattleStarted += HandleBattleStarted;
battle.OnBattleEnded += HandleBattleEnded;

private void HandleBattleStarted()
{
// 战斗刚开始 - 可能暂停计时器、隐藏 UI 等
}

private void HandleBattleEnded(bool playerWon)
{
// 战斗结束 - playerWon 告诉你结果
if (playerWon)
{
// 更新自定义胜利计数器、触发成就等
}
}

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;

// 保存到栏位 1
saves.Save(1);

// 从栏位 1 读取
saves.Load(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() 运行前被填充。

如果你的脚本不是由 Zenject 管理的 MonoBehaviour,可以手动解析:

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

Inspector 可配置选项​

许多 MCE 系统通过 Unity Inspector 暴露配置,无需编写代码:

ScriptableObject 配置​

资源用途位置
BattleConfigurationFile战斗速度、经验值倍率、捕获率Runtime/Configuration/
MonsterEntry怪兽物种数据MonsterDatabase/
Move招式定义MonsterDatabase/Moves/
WildEncountersSet遭遇表按地图资源
BattleAIAI 策略配置Battle/AI/

组件配置​

大多数 MCE 组件在 Inspector 中暴露关键设置:

  • PlayerCharacter:行走速度、奔跑速度、是否可以奔跑、是否拥有自行车。
  • EncounterTile:遭遇率、遭遇配置引用。
  • BattleLauncher:战斗场景引用、过渡设置。
  • SceneInfo:地图名称、BGM、区域、默认遭遇。

UnityEvent 和回调​

MCE 在其组件上暴露了多个 UnityEvent,你可以在 Inspector 中不编写代码就将它们连接起来:

PlayerCharacter 事件​

事件触发时机
OnStepTaken玩家走一步
OnDirectionChanged玩家改变面向方向
OnInteraction玩家按下互动按钮

Actor 事件​

Actor(NPC、物体)有回调事件:

事件触发时机
OnInteracted玩家与 Actor 交互
OnGraphCompletedCommandGraph 完成执行

在 Inspector 中将你的 MonoBehaviour 拖入事件槽并选择要调用的方法即可连接。

无需源代码扩展 MCE​

模式 1:事件监听器​

创建一个 MonoBehaviour 监听 MCE 事件并触发你自己的逻辑:

public class AchievementTracker : MonoBehaviour
{
[Inject] private IBattleSystem battle;
[Inject] private IPlayerData player;

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)
{
// 将自定义数据与 MCE 存档一起保存
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 中,添加 Actor 事件节点。
  3. 在 Inspector 中,将事件连接到你脚本的方法。

这让你无需修改 MCE 内部即可从可视化脚本触发自定义 C# 逻辑。

无源代码时的限制​

限制替代方案
修改伤害公式使用 BattleConfigurationFile 中的配置倍率
添加新战斗模块使用战斗事件 API 响应战斗状态
更改移动物理通过 Inspector 调整速度和碰撞参数
添加新 CommandGraph 节点类型创建通过 Actor 事件触发的自定义 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 会显示提示。