パネル UI (NpUi)
NpUi はパネルの内容を記述する小さなビルダーです。プラグインは行の一覧を書くだけで、エディターが内蔵パネルと同じ見た目のコントロールで描画します。Godot を知る必要はありません。
NpUi を使う場所は 2 つです。
| 登録ポイント | 項目 | 表示される場所 |
|---|---|---|
AddContentTab | Build | 下部エリアのパネル (ウィンドウメニューから開く) |
AddMode | Panel | そのモードのときのツールパネル |
ビルダーメソッド
Section titled “ビルダーメソッド”すべてのメソッドは同じ NpUi を返します。そのため . でつなげて書きます。行は書いた順に上から下へ並びます。
| メソッド | 描画されるもの | 変更時 |
|---|---|---|
Title(string text) | 太字のグループ見出し | — |
Label(string text) | 文字列 1 行 (折り返しあり) | — |
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() | 横の区切り線 | — |
ライブテキスト
Section titled “ライブテキスト”Label(() => …) は、パネルが表示されている間 0.5 秒ごとに関数を呼び直して文字列を更新します。
- パネルが再表示されたときと、ボタンを押した直後にもすぐ読み直します。
- 関数は 0.5 秒ごとに呼ばれます。軽い処理にしてください。ワールド全体をスキャンする計算 (
Bounds・Blocks()) は入れないでください。 CountBlocks()のような軽い値や、自分のフィールドに保持しておいた値を表示します。- 関数で例外が発生すると、そのプラグインは隔離されます。
作成されるタイミング
Section titled “作成されるタイミング”| 登録ポイント | いつ作成されるか |
|---|---|
AddContentTab の Build | プラグインを有効にするときに 1 回 |
AddMode の Panel | そのモードのパネルが初めて表示されるときに 1 回 |
一度作成したパネルは作り直しません。そのため 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を呼び出してもかまいません。 - コールバックで例外が発生すると、そのプラグインは隔離されます。プラグインがアンロードされると、パネルも消えます。
- アイコンボタン・折りたたみグループ・リスト・カラーピッカーはまだありません。
- エディターの翻訳表にない文字列は翻訳されず、そのまま表示されます。複数言語が必要な場合は、プラグインが自分で選択します。