面板 UI (NpUi)
NpUi 是用于描述面板内容的小型构建器。插件只需写出行列表,编辑器会用与内置面板相同外观的控件进行绘制。无需了解 Godot。
NpUi 用在两个地方。
| 注册点 | 字段 | 显示位置 |
|---|---|---|
AddContentTab | Build | 下方区域面板(从「窗口」菜单打开) |
AddMode | Panel | 处于该模式时的工具面板 |
所有方法都返回同一个 NpUi,因此可以用 . 连写。各行按书写顺序从上到下排列。
| 方法 | 绘制内容 | 变化时 |
|---|---|---|
Title(string text) | 粗体分组标题 | — |
Label(string text) | 一行文字(自动换行) | — |
Label(Func<string> text) | 动态文字。显示期间每 0.5 秒重新读取 | — |
Button(string text, Action click, string tooltip = "") | 按钮 | 点击时调用 click |
Text(string label, string initial, Action<string> changed) | 名称 + 文本框 | 每次输入文字时调用 changed |
Number(string label, double initial, double min, double max, double step, Action<double> changed) | 名称 + 数字框(上下按钮) | 每次值变化时调用 changed |
Check(string label, bool initial, Action<bool> changed) | 复选框 | 勾选或取消时调用 changed |
Separator() | 水平分隔线 | — |
Label(() => …) 在面板显示期间每 0.5 秒重新调用函数以更新文字。
- 面板重新显示时以及点击按钮后也会立即重新读取。
- 函数每 0.5 秒调用一次,请写得轻量。不要放入扫描整个世界的计算(
Bounds·Blocks())。 - 显示
CountBlocks()这样的轻量值,或存放在自己字段中的值。 - 函数中发生异常时,该插件被隔离。
| 注册点 | 何时创建 |
|---|---|
AddContentTab 的 Build | 启用插件时一次 |
AddMode 的 Panel | 该模式面板首次显示时一次 |
面板创建一次后不会重新创建。因此 Number · Text · Check 的 initial 是创建时刻的值。之后会变化的值用 Label(() => …) 显示。若要把已保存的设置作为字段初始值,请在 Register 开头先读取 Settings。
示例:设置面板
Section titled “示例:设置面板”private int _width = 3;private bool _lamps = true;private int _built;
public void Register(INpEditorHost host){ _width = host.Settings.GetInt("width", 3); // 必须先读取,字段初始值才正确 _lamps = host.Settings.GetBool("lamps", true);
host.AddContentTab(new NpContentTab("panel", "도로", () => new NpUi() .Title("도로 만들기") .Number("폭", _width, 1, 9, 1, v => { _width = (int)v; host.Settings.SetInt("width", _width); }) .Check("가로등", _lamps, v => { _lamps = v; host.Settings.SetBool("lamps", v); }) .Label(() => $"깐 도로 {_built}개 · 월드 블록 {host.World.CountBlocks():N0}") .Separator() .Button("선택 영역에 깔기", () => { if (host.World.Selection is not { } b) { host.Message("먼저 영역을 고르세요"); return; } _built++; // … 用 World.Edit 铺设 … }, "선택 상자 바닥에 도로를 깝니다")));}要查看面板,请在「窗口」菜单中打开「도로」。
提示 / 注意
Section titled “提示 / 注意”- 界面文字中不要使用表情符号 · 图形字符。面板标题(
Label字段)中的图形字符会在界面上被去除。 - 回调(
click·changed)在编辑器主线程上调用。可以在这里调用World.Edit。 - 回调中发生异常时,该插件被隔离。插件卸载时面板也随之消失。
- 目前还没有图标按钮 · 可折叠分组 · 列表 · 颜色选择器。
- 编辑器翻译表中没有的文字不会被翻译,按原样显示。若需要多语言,由插件自行选择。