feat(cordis): 接入上下文组合与模组事务热替换
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
# __PROJECT_NAME__
|
||||
|
||||
这是 `ShrinkModFramework` 生成的仓库内模组模板。
|
||||
|
||||
## 为什么推荐这个模板
|
||||
|
||||
这个模板直接生成到当前 Unity 项目的 `Assets` 目录下,复用:
|
||||
|
||||
- 当前 Unity 工程
|
||||
- 当前 `ShrinkSDK.sln`
|
||||
- 当前 asmdef 编译链
|
||||
|
||||
所以它比“独立外部 csproj 模板”更省事,也不会碰到额外的 IDE / workload SDK 解析问题。
|
||||
|
||||
## 生成位置
|
||||
|
||||
- 当前输出目录:`__ASSET_RELATIVE_OUTPUT__`
|
||||
|
||||
## 模板内容
|
||||
|
||||
- `Runtime/__ASMDEF_NAME__.asmdef`
|
||||
- `Runtime/__PROJECT_NAME__Mod.cs`
|
||||
- `Runtime/__PROJECT_NAME__Contracts.cs`
|
||||
- `README.md`
|
||||
|
||||
## 建议流程
|
||||
|
||||
1. 生成模板
|
||||
2. 在现有 Unity/Rider/VS 解决方案里直接修改代码
|
||||
3. 等 Unity 正常编译通过
|
||||
4. 后续如果需要,再单独补“导出 DLL 到 Mods 目录”的步骤
|
||||
|
||||
## 默认标识
|
||||
|
||||
- `ProjectName`: `__PROJECT_NAME__`
|
||||
- `Namespace`: `__ROOT_NAMESPACE__`
|
||||
- `Assembly`: `__ASMDEF_NAME__`
|
||||
- `ModId`: `__MOD_ID__`
|
||||
- `DisplayName`: `__DISPLAY_NAME__`
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8aa46c7dafda5194b94ab88513c56b44
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f7a48cec05ee9c842ad9bc0b7e7ec425
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "__ASMDEF_NAME__",
|
||||
"rootNamespace": "__ROOT_NAMESPACE__",
|
||||
"references": [
|
||||
"ShrinkModFramework.Runtime",
|
||||
"ShrinkEventBus.Runtime",
|
||||
"ShrinkCommand.Runtime",
|
||||
"ShrinkNetwork.Runtime"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9358a269a6e4a9740a69798dba1c1655
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
#nullable enable
|
||||
|
||||
using ShrinkEventBus;
|
||||
using ShrinkNetwork;
|
||||
|
||||
namespace __ROOT_NAMESPACE__
|
||||
{
|
||||
public sealed class __PROJECT_NAME__Event : EventBase
|
||||
{
|
||||
public string Message { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
[ShrinkNetworkMessage(32001, "__MOD_ID__/ping")]
|
||||
public sealed class __PROJECT_NAME__PingRequest : IShrinkNetworkRequest
|
||||
{
|
||||
public string Message { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
[ShrinkNetworkMessage(32002, "__MOD_ID__/ping_response")]
|
||||
public sealed class __PROJECT_NAME__PingResponse : ShrinkRpcResponseBase
|
||||
{
|
||||
public string Message { get; set; } = string.Empty;
|
||||
public int Counter { get; set; }
|
||||
}
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2dbfd0d836e24d84eabaff73259c7e90
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
#nullable enable
|
||||
|
||||
using ShrinkCommand;
|
||||
using ShrinkEventBus;
|
||||
using ShrinkModFramework;
|
||||
using ShrinkNetwork;
|
||||
|
||||
namespace __ROOT_NAMESPACE__
|
||||
{
|
||||
[ShrinkMod("__MOD_ID__", "__DISPLAY_NAME__", "1.0.0")]
|
||||
[EventBusSubscriber]
|
||||
[ShrinkCommandSubscriber]
|
||||
[ShrinkNetworkSubscriber]
|
||||
public sealed class __PROJECT_NAME__Mod : ShrinkModBase
|
||||
{
|
||||
private readonly RuntimeState _state = new();
|
||||
|
||||
public override void OnConstruct(ShrinkModContext context)
|
||||
{
|
||||
context.Log("模组已构造。");
|
||||
}
|
||||
|
||||
public override void OnRegisterContent(ShrinkModContext context)
|
||||
{
|
||||
var registry = context.GetRegistry<string>("example.items");
|
||||
registry.Register(
|
||||
context.ModInfo.ModId,
|
||||
context.ModInfo.ModId + ":example_item",
|
||||
"__DISPLAY_NAME__ Item");
|
||||
}
|
||||
|
||||
public override void OnInitialize(ShrinkModContext context)
|
||||
{
|
||||
context.RegisterNetworkHandler<int>("sync.counter", (_, value) =>
|
||||
{
|
||||
_state.Counter = value;
|
||||
context.Log("收到模组网络计数:" + value);
|
||||
});
|
||||
}
|
||||
|
||||
[EventSubscribe]
|
||||
private void OnExampleEvent(__PROJECT_NAME__Event evt)
|
||||
{
|
||||
_state.LastEventMessage = evt.Message ?? string.Empty;
|
||||
_state.Counter++;
|
||||
}
|
||||
|
||||
[ShrinkCommand("__COMMAND_ROOT__ ping", Description = "测试模组命令", Permission = "__MOD_ID__.command.ping")]
|
||||
private string Ping()
|
||||
{
|
||||
return "pong:" + _state.Counter;
|
||||
}
|
||||
|
||||
[ShrinkNetworkSubscribe(Permission = "__MOD_ID__.rpc.ping")]
|
||||
private __PROJECT_NAME__PingResponse HandlePing(__PROJECT_NAME__PingRequest request)
|
||||
{
|
||||
return new __PROJECT_NAME__PingResponse
|
||||
{
|
||||
Message = "pong:" + (request.Message ?? string.Empty),
|
||||
Counter = _state.Counter
|
||||
};
|
||||
}
|
||||
|
||||
private sealed class RuntimeState
|
||||
{
|
||||
public int Counter { get; set; }
|
||||
public string LastEventMessage { get; set; } = string.Empty;
|
||||
}
|
||||
}
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5e1319b1cd7dc0d4b918d12152b358ab
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user