Files

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);
```
实例注册仍然会扫描对象本身的方法签名,不依赖编译期清单,适合:
- 运行时创建的对象
- 模组实例
- 需要带状态的命令宿主