This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
- 依赖解析
|
||||
- 生命周期阶段
|
||||
- 内容注册表
|
||||
- 自动启动
|
||||
- 可选显式启动
|
||||
- 外部 DLL 模组热加载
|
||||
- Harmony 热补丁接入
|
||||
- 网络同步通道
|
||||
@@ -31,17 +31,19 @@
|
||||
- 内置的资源包系统、命令系统、配方编辑器
|
||||
- 内置的具体联网实现
|
||||
|
||||
## 自动启动
|
||||
## 启动
|
||||
|
||||
现在默认**不需要**把 `ShrinkModBootstrap` 挂到场景里。
|
||||
|
||||
框架会通过:
|
||||
安全默认值不会自动启动或扫描外部 DLL。需要装载工程内模组时,可以显式调用
|
||||
`ShrinkModLoader.LoadAll(settings)`;需要外部代码模组时,调用方必须先完成自己的清单、
|
||||
启用状态和哈希校验,再提交精确白名单:
|
||||
|
||||
```csharp
|
||||
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)]
|
||||
ShrinkModRuntimeBootstrap.InitializeDriver(settings);
|
||||
ShrinkModLoader.LoadAuthorized(settings, authorizedDllPaths);
|
||||
```
|
||||
|
||||
自动读取 `ShrinkModFrameworkSettings` 并调用装载流程。
|
||||
只有显式打开 `autoLoadOnStartup` 时,`AfterAssembliesLoaded` 入口才会装载工程内模组;
|
||||
该自动入口仍不加载任何未授权外部 DLL。
|
||||
|
||||
相关入口:
|
||||
|
||||
@@ -52,12 +54,14 @@
|
||||
|
||||
## 配置文件
|
||||
|
||||
创建 `ShrinkModFrameworkSettings` 资产后,框架会自动查找它。
|
||||
菜单 `ShrinkSDK/模组/创建设置` 会在
|
||||
`Assets/Resources/GameAssets/Runtime/Data/ShrinkSDK/ShrinkModFrameworkSettings.asset`
|
||||
创建配置。运行时优先加载该路径,并保留旧根路径回退。
|
||||
|
||||
关键配置包括:
|
||||
|
||||
- `autoLoadOnStartup`
|
||||
- 是否在启动时自动装载模组
|
||||
- 是否在启动时自动装载工程内模组,默认关闭
|
||||
- `useContextHost`
|
||||
- 默认开启:把模组四阶段放进 `ShrinkModContextHost`,替换失败恢复旧组件源;关闭后回退旧 Loader
|
||||
- `verboseLogging`
|
||||
@@ -65,11 +69,11 @@
|
||||
- `assemblyNamePrefixes`
|
||||
- 只扫描指定前缀的程序集
|
||||
- `enableExternalDllMods`
|
||||
- 是否启用外部 DLL 模组
|
||||
- 是否允许显式白名单中的外部 DLL 模组,默认关闭
|
||||
- `externalModsFolderName`
|
||||
- 外部模组目录名,默认 `Mods`
|
||||
- `watchExternalModsDirectory`
|
||||
- 是否自动监听目录变化并协调外部 DLL revision 变化
|
||||
- 是否监听文件变化并重新提交既有白名单,默认关闭;监听不会扩大授权范围
|
||||
- `externalModsReloadDelaySeconds`
|
||||
- 文件变更后延迟多少秒再尝试热加载
|
||||
- `externalAssemblyRevisionSoftLimit`
|
||||
@@ -182,13 +186,8 @@ public class DemoSafeMod : ShrinkModBase
|
||||
|
||||
## 外部 DLL 模组热加载
|
||||
|
||||
框架会扫描:
|
||||
|
||||
`Application.persistentDataPath/<externalModsFolderName>`
|
||||
|
||||
默认就是:
|
||||
|
||||
`Application.persistentDataPath/Mods`
|
||||
框架不会递归扫描模组目录。调用方必须把每个允许进入 AppDomain 的入口 DLL 绝对路径
|
||||
作为白名单提交给 `LoadAuthorized`;目录中未列出的 DLL 不会被读取或加载。
|
||||
|
||||
ContextLoader 装载规则:
|
||||
|
||||
@@ -199,16 +198,19 @@ ContextLoader 装载规则:
|
||||
- 不支持 IL2CPP Player 动态程序集加载
|
||||
- 支持同目录依赖程序集解析
|
||||
|
||||
你可以在运行时调用:
|
||||
首次安全加载:
|
||||
|
||||
```csharp
|
||||
ShrinkModLoader.LoadNewExternalMods();
|
||||
ShrinkModRuntimeBootstrap.InitializeDriver(settings);
|
||||
ShrinkModLoader.LoadAuthorized(settings, authorizedDllPaths);
|
||||
```
|
||||
|
||||
默认会扫描当前 DLL revision,并把新增、替换、删除映射为一个完整期望组合;
|
||||
变更事务失败时保留旧模组组合。设置 `useContextHost = false` 才回退为仅新增 DLL 的旧路径。
|
||||
后续可调用 `ShrinkModLoader.LoadNewExternalMods(settings)` 重新读取同一白名单的 revision,
|
||||
把新增、替换、删除映射为完整期望组合;变更事务失败时保留旧模组组合。设置
|
||||
`useContextHost = false` 时,旧路径同样只读取显式白名单,但仍保持只增不减的兼容语义。
|
||||
|
||||
如果 `watchExternalModsDirectory = true`,框架还会监听新增、修改、删除、重命名事件,经过主线程 debouncer 后提交一次完整组合;同一 burst 内的中间坏文件不会覆盖当前有效 revision。
|
||||
如果 `watchExternalModsDirectory = true`,框架会监听目录变化并在主线程 debouncer 后重新提交
|
||||
既有白名单;未授权文件即使触发通知也不会被加载。同一 burst 内的中间坏文件不会覆盖当前有效 revision。
|
||||
|
||||
### 常驻 revision 诊断
|
||||
|
||||
@@ -697,8 +699,8 @@ public sealed partial class DemoFullMod : ShrinkModBase
|
||||
|
||||
现在这套框架已经从“只能在工程内静态发现模组”的骨架,升级成了:
|
||||
|
||||
- 自动启动
|
||||
- 可增量接入外部 DLL
|
||||
- 可显式托管启动
|
||||
- 可按精确白名单增量接入外部 DLL
|
||||
- 可选 Harmony 补丁
|
||||
- 可扩展的网络同步框架
|
||||
|
||||
|
||||
Reference in New Issue
Block a user