88 lines
2.3 KiB
Markdown
88 lines
2.3 KiB
Markdown
# ShrinkCommand
|
|
|
|
独立于 `ShrinkNetwork` 的命令系统,目标是提供类似 Minecraft/Brigadier 风格的命令路径、权限、帮助输出和属性式自动注册。
|
|
|
|
Godot 和普通 .NET 项目安装 `ShrinkSDK.Command`;可打包源码位于 `DotNet~`,属性式自动注册由 `ShrinkSDK.CodeGen` 在构建时织入。
|
|
|
|
当前版本已把**静态命令发现**切到编译期注册表:运行时默认服务不再通过 `AppDomain.GetAssemblies() + GetTypes()` 全域扫描静态命令类型,而是直接消费编译期注入的清单。实例命令注册路径保持不变,仍适合模组实例和运行时对象。
|
|
|
|
## 特性
|
|
|
|
- 路径式命令定义:`whitelist add <player>`、`say <message...>`
|
|
- 支持字面量段和贪婪参数段
|
|
- 内建 `help` / `?`
|
|
- 支持命令来源限制:控制台专用 / 非控制台专用 / 任意来源
|
|
- 支持权限校验
|
|
- 支持属性式自动注册,也支持手工注册
|
|
- 可在 Unity 和纯 .NET 宿主中复用
|
|
|
|
## 快速开始
|
|
|
|
```csharp
|
|
using ShrinkCommand;
|
|
|
|
[ShrinkCommandSubscriber]
|
|
public static class DemoCommands
|
|
{
|
|
[ShrinkCommand("say <message...>", Description = "广播一段文本")]
|
|
private static string Say(string message)
|
|
{
|
|
return "[say] " + message;
|
|
}
|
|
}
|
|
|
|
var service = new ShrinkCommandService();
|
|
service.AutoRegisterAll();
|
|
```
|
|
|
|
手工执行:
|
|
|
|
```csharp
|
|
var result = await service.ExecuteAsync(source, "say hello world");
|
|
```
|
|
|
|
## 方法签名
|
|
|
|
支持的参数:
|
|
|
|
- `ShrinkCommandContext`
|
|
- `IShrinkCommandSource` 或其派生类型
|
|
- 路径中声明的普通参数,按顺序绑定到方法参数
|
|
|
|
支持的返回类型:
|
|
|
|
- `void`
|
|
- `string`
|
|
- `ShrinkCommandExecutionResult`
|
|
- `UniTask`
|
|
- `UniTask<string>`
|
|
- `UniTask<ShrinkCommandExecutionResult>`
|
|
- `Task`
|
|
- `Task<string>`
|
|
- `Task<ShrinkCommandExecutionResult>`
|
|
|
|
## 内建命令
|
|
|
|
- `help`
|
|
- `help <path...>`
|
|
- `?`
|
|
- `? <path...>`
|
|
|
|
## 自动注册说明
|
|
|
|
### 静态命令
|
|
|
|
默认运行时会直接读取编译期生成的 `ShrinkCommandGeneratedRegistry`,注册所有静态 `[ShrinkCommandSubscriber]` + `[ShrinkCommand]`。
|
|
|
|
### 实例命令
|
|
|
|
```csharp
|
|
service.RegisterCommands(myCommandInstance);
|
|
```
|
|
|
|
实例注册仍然会扫描对象本身的方法签名,不依赖编译期清单,适合:
|
|
|
|
- 运行时创建的对象
|
|
- 模组实例
|
|
- 需要带状态的命令宿主
|