콘텐츠로 이동

패널 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 를 불러도 됩니다.
  • 콜백에서 예외가 나면 그 플러그인이 격리됩니다. 플러그인이 내려가면서 패널도 사라집니다.
  • 아이콘 단추 · 접는 묶음 · 목록 · 색 고르기는 아직 없습니다.
  • 에디터 번역표에 없는 글은 번역되지 않고 그대로 보입니다. 여러 언어가 필요하면 플러그인이 직접 고릅니다.