跳转到内容

面板 UI (NpUi)

NpUi 是用于描述面板内容的小型构建器。插件只需写出行列表,编辑器会用与内置面板相同外观的控件进行绘制。无需了解 Godot。

NpUi 用在两个地方。

注册点字段显示位置
AddContentTabBuild下方区域面板(从「窗口」菜单打开)
AddModePanel处于该模式时的工具面板

所有方法都返回同一个 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。

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 铺设 …
}, "선택 상자 바닥에 도로를 깝니다")));
}

要查看面板,请在「窗口」菜单中打开「도로」。

  • 界面文字中不要使用表情符号 · 图形字符。面板标题(Label 字段)中的图形字符会在界面上被去除。
  • 回调(click · changed)在编辑器主线程上调用。可以在这里调用 World.Edit。
  • 回调中发生异常时,该插件被隔离。插件卸载时面板也随之消失。
  • 目前还没有图标按钮 · 可折叠分组 · 列表 · 颜色选择器。
  • 编辑器翻译表中没有的文字不会被翻译,按原样显示。若需要多语言,由插件自行选择。