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