UnityModBase.BepInExLauncher 是 UnityModBase 的 BepInEx 生命周期适配层。它负责在合适的 BepInEx 和 Unity 生命周期节点初始化、启动和释放核心框架,本身不声明模组配置、日志或业务功能。
- 在 BepInEx 插件
Awake阶段调用UnityModBase.Initialize - 监听 Unity 场景加载,并在首次场景加载后调用
GameBootRegistry.Boot - 在插件销毁时取消场景订阅并调用
UnityModBase.Dispose - 将适配层初始化和启动错误写入 BepInEx 日志
配置、日志、热键、翻译、用户上下文和 IMGUI 窗口均由核心类库提供。
- .NET Framework 4.7.2
- BepInEx
UnityModBase.dll
启动器元数据:
| 项目 | 值 |
|---|---|
| BepInEx GUID | com.buele.bepinexlauncher |
| 版本 | 1.0.0 |
| 程序集 | UnityModBase.BepInExLauncher.dll |
将下列文件放入目标游戏的 BepInEx/plugins 目录:
UnityModBase.dll
UnityModBase.BepInExLauncher.dll
只应安装一份启动器。多个启动器实例虽然会遇到幂等的初始化和启动入口,但任一实例销毁时都可能提前释放共享的进程级状态。
| 阶段 | 行为 |
|---|---|
BepInEx Awake |
先订阅 SceneManager.sceneLoaded,再以 Paths.PluginPath 初始化 UnityModBase |
| 首次场景加载 | 调用一次 GameBootRegistry.Boot,执行已登记的游戏启动扩展点 |
| 后续场景加载 | 启动已经成功时不再重复派发 |
插件 OnDestroy |
取消场景订阅,并统一释放 UnityModBase |
如果 Initialize 失败,启动器会撤销场景订阅、记录错误并销毁自身;销毁路径会调用 Dispose 清理部分初始化状态。
如果 GameBootRegistry.Boot 向外抛出异常,本次启动不会被标记为成功,后续场景加载会再次尝试。启动扩展点内部的普通异常通常由核心注册器隔离并记录,不会阻止其他扩展点执行。
依赖该启动器的 BepInEx 模组可以显式声明依赖关系:
using BepInEx;
[BepInPlugin("com.example.mod", "Example Mod", "1.0.0")]
[BepInDependency("com.buele.bepinexlauncher")]
public sealed class ExamplePlugin : BaseUnityPlugin
{
}模组初始化逻辑应使用 UnityModBase 的游戏启动扩展点,而不是再次调用全局生命周期入口:
using UnityEngine;
using UnityModBase.HClassAttribute;
internal static class ModStartup
{
[InitializeOnGameBoot]
private static void Initialize()
{
// 注册用户、配置、日志和实时控制项。
}
}
[RegisterOnGameBoot]
internal sealed class RuntimeComponent : MonoBehaviour
{
}InitializeOnGameBoot方法必须是非泛型、静态、无参数且返回void。RegisterOnGameBoot类型必须继承UnityEngine.Component。- 启动器已经负责
Initialize、Boot和Dispose,模组不应重复调用这些入口。 - 模组自身被单独卸载时,应主动移除静态事件订阅,并通过
UserManager.RemoveUser释放自己的用户上下文。
完整接入示例见核心类库 README,成员说明见API 文档。
不使用 BepInEx 或需要自行定义游戏启动边界时,不需要安装本启动器。宿主可以直接引用 UnityModBase.dll,并按照核心类库文档自行驱动 Initialize、GameBootRegistry.Boot 和 Dispose。