Mod进阶教程6 模组依赖 - WorldBoxOpenMods/ModLoader GitHub Wiki
ModLoader提供了一个简单的依赖系统, 允许你在其他模组存在的情况下才加载你的模组, 以及允许你调用其他模组的方法.
在这里, 依赖分为两类: 必需依赖(Dependencies string[]
)和可选依赖(OptionalDependencies string[]
)
它们可以在mod.json中声明, 其中的项是对应模组的ID: "{作者名}.{模组名}", 例如: "Inmny.Example-Mod".
当且仅当所有必需依赖的模组都存在且被正确编译时(不保证正确运行), 你的模组才会被加载.
使用方法足够简单, 在mod.json中声明一个数组, 例如:
{
// 其他...
"Dependencies": [
"Inmny.Example-Mod"
]
}
然后在你的项目里添加对应的引用, 引用的dll可以来自于worldbox_Data/StreamingAssets/mods/NML/CompiledMods
除了引用dll, 你也可以直接引用它们的项目, 如果存在.csproj的话.
可选依赖的模组可以不存在, 但是如果存在, 你可以调用它们的方法.
使用方法相较必需依赖较为复杂, 实际上也还是非常简单的, 你需要在mod.json中声明一个数组, 例如:
{
// 其他...
"OptionalDependencies": [
"Inmny.Example-Mod"
]
}
同样的, 给你的项目添加对应的引用.
可选依赖由于存在可能不存在的情况, 所以你需要在调用它们的方法前进行判断.
这里做一个约定, 当可选依赖存在且正确编译时, 编译器会在编译时定义一个宏{大写作者名}_{大写模组名}
, 其中所有非字母数字字符都会被替换为下划线'_'.
例如: "Inmny.Example-Mod"会被替换为"INMNY_EXAMPLE_MOD".
所以你可以使用#if
来判断可选依赖是否存在, 例如:
#if INMNY_EXAMPLE_MOD
using ExampleMod;
#endif
using NeoModLoader.api;
namespace ExampleModDepen
{
public class ModClass : BasicMod<ModClass>
{
protected override void OnModLoad()
{
LogInfo(GetConfig()["Default"]["WhatToSay"].GetValue() as string);
#if INMNY_EXAMPLE_MOD
// ExampleModMain 是 Example-Mod 中的一个类
ExampleModMain.Called();
#endif
}
}
}
为了让你的IDE能够正确识别, 你需要手动在项目属性中添加对应的宏, 例如:
<PropertyGroup>
<DefineConstants>INMNY_EXAMPLE_MOD</DefineConstants>
</PropertyGroup>