How to create Modular and Scalable UI systems in Unreal Engine
๐ก Base Reusable Widgets(์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์์ ฏ) ์์ฑํ๊ธฐ
WBP_BaseBorder / WBP_BaseButton / WBP_BasePanel / WBP_BaseText ๋ฑ


โ ์ ์ฒด ํ๋ก์ ํธ ์์ ๋ณ๊ฒฝ ๋ฑ์ ๋จ์ผ ํด๋ฆญ์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ
๐กํ ํ๋ฆฟํ๋ฅผ ์ํ Named Slots ์ฌ์ฉํ๊ธฐ
| ๋น๊ต ํญ๋ชฉ | Named Slot | ์์ |
|---|---|---|
| ๊ตฌ์กฐ | ์ฌ๋กฏ์ผ๋ก ์ฑ์๋ฃ๊ธฐ | ๋ถ๋ชจ ์์ ํด๋์ค ๊ด๊ณ |
| ๋ชฉ์ | UI ์กฐ๋ฆฝ/์กฐํฉ | ๊ธฐ๋ฅ ํ์ฅ |
| ๋ฐํ์ ๋ณ๊ฒฝ | ๊ฐ๋ฅ (SetContent ๋ฑ) | ๋ถ๊ฐ๋ฅ (ํด๋์ค ๋ณ๊ฒฝ ํ์) |
| ์ฌ์ฌ์ฉ์ฑ | ๋์ | ๋ฎ์ |
| ์ฝ๋ ์ํฅ | ๊ฑฐ์ ์์ | ๋ถ๋ชจ ํจ์ ๊ตฌ์กฐ ์ํฅ ๋ฐ์ |
MyNamedSlot->SetContent(MyWidgetInstance);
๋๋
BP์์ `Set Content` ๋
ธ๋ ์ฌ์ฉํด ์๋ก์ด ์์ ์์ ฏ์ผ๋ก ๊ต์ฒด ๊ฐ๋ฅ
๐กํ๋ฉด ๋ฐ ํจ๋ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ค๋ฅธ ๋ ์ด์ด ์ฌ์ฉํ๊ธฐ
โ ์ธ๋ฒคํ ๋ฆฌ ํ๋ฉด ๋์ค๊ณ ํ์คํธ ํ๋ฉด ๋ํ๋๊ฒ ํ๊ณ ์ถ์ผ๋ฉด ์์ ฏ์ ์จ๊ธฐ๊ณ ๋ํ๋๊ฒ ํด์ผ ํจ




๐ก๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ Objects์ ๋ฃ๊ธฐ โ ๋ฐ์ดํฐ ๊ฐ์ฒด ๋ถ๋ฆฌ (View Models)
ํจ์๋ก ๋ฐ์ธ๋ฉํ๋ฉด ๊ฐ๋จํ์ง๋ง,

โ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ UI๋ฅผ ๋ณ๊ฒฝํด๋ ์๋ฌด๊ฒ๋ ์์๋์ง ์์
๐กUI ๋ฌดํจํ ํ๊ธฐ
(์) Health Bar๋ ๋งค ํ๋ ์๋ง๋ค ๋ณ๊ฒฝ๋๊ฑฐ๋ ๋ค์ ๊ทธ๋ ค์ง ํ์๊ฐ ์์
โ ํ๋ ์ด์ด๊ฐ ํผํด๋ฅผ ์
์ ๋๋ง ์
๋ฐ์ดํธโ ํฌ๋ช
๋ยท๋จธํฐ๋ฆฌ์ผยท์ค์ฒฉ ์ต์ํ๋ก ๋ ๋๋ง ํจ์จ ๊ฐ์
๐ก๋จธํฐ๋ฆฌ์ผ์ ์ฌ์ฉํ ์ ๋๋ฉ์ด์ ์ฌ์ฉํ๊ธฐ
ํธ๋ฒ ์ ์ ๋๋ฉ์ด์ ์ด ํ์
โ ์ผ๋ฐ์ ์ผ๋ก ์ํ์๋ฅผ ํตํด ์ ๋๋ฉ์ด์ ๋ง๋ฆ
โ ๋งค์ฐ ์ ํ์ ์ด๊ณ CPU์์ ์คํ๋จ
โ ์์ฑ/์ ๊ฑฐ vs ์จ๊น/ํ์
๐ก๊ตฌ์ฑ(Construction) ๋จ๊ณ์์ ์์ ฏ๋ค์ ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ๋๋๊ธฐ
โ ์ํฉ์ ๋ง๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต ์ ํํ๊ธฐ

๐กHidden ๋์ Collapsed ์ฌ์ฉํ๊ธฐ
โ ์์ ํ ๋ฌด์ํ๋ ์ ์ผํ ์ต์
| Visibility ๊ฐ | ํ๋ฉด ํ์ | ์ ๋ ฅ | ๋ ์ด์์ | ์ค๋ช |
|---|---|---|---|---|
| Hidden | ์ ๋ณด์ | ๋ถ๊ฐ๋ฅ | ๊ณต๊ฐ ์ฐจ์ง | ์ ๋ณด์ด์ง๋ง ์๋ฆฌ ์ ์ง |
| Collapsed | ์ ๋ณด์ | ๋ถ๊ฐ๋ฅ | ๊ณต๊ฐ ์ ๊ฑฐ | ์กด์ฌํ์ง๋ง ์์ ํ ์จ๊น ์ฒ๋ฆฌ |
**Hidden** โ ๋์๋ ์ ๋ณด์ด์ง๋ง, ๊ทธ ์๋ฆฌ์ ๋น ๊ณต๊ฐ์ด ๋จ์ (ํฌ๋ช
๋งํ )
[ Button A ]
[ ] โ ๊ณต๊ฐ ์ ์ง
[ Button C ]
**Collapsed** โ ๊ทธ ์๋ฆฌ ์์ฒด๊ฐ ์ฌ๋ผ์ง (C๊ฐ ์๋ก ๋ถ์)
[ Button A ]
[ Button C ]
โ ํด๋ฆญ ๊ฐ์งยท์ธํฐ๋์ ์ ์ด ๊ตฌ๋ถํ๊ธฐ
๐กVisible ๋์ Not Hit Testable ์ฌ์ฉํ๊ธฐ
| Visibility ๊ฐ | ํ๋ฉด ํ์ | ํด๋ฆญ | ๋ ์ด์์ | ์ค๋ช |
|---|---|---|---|---|
| Visible | ๋ณด์ | ๊ฐ๋ฅ | ํฌํจ | ๋ณด์ด๊ณ ์ํธ์์ฉ ๊ฐ๋ฅ |
| Not Hit Testable | ๋ณด์ | ๋ถ๊ฐ | ํฌํจ | ๋ณด์ด์ง๋ง ์ ๋ ฅ ๋ฌด์ |

์๋ก ์ํธ์์ฉ์ด ํ์ํ์ง ์์ ์์ ฏ์ Not Hit Testable ์ ์ฉ
Not Hit Testable
๋ง์ฐ์ค ์ปค์(ํฐ์น)๊ฐ ์ด๋ค ์์ ฏ ์์ ์๋๊ฐ?
๋งค ํ๋ ์๋ง๋ค ๋ชจ๋ Visible ์์ ฏ๋ค์ ์ฌ๊ฐ ์์ญ์ ๊ฒ์ฌํ๊ณ
์ด๋ค ์์ ฏ์ด ํด๋ฆญ/ํธ๋ฒ๋ฅผ ๋ฐ์์ผ ํ ์ง Hit Test Grid๋ผ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๊ด๋ฆฌํจ
โ ๋ฒํผ ๊ฐ์ ํด๋ฆญ์ด ํ์ํ ์์ ฏ์๋ง ํ์
โ ์ฅ์์ฉ ์ด๋ฏธ์ง๋ ํ ์คํธ๊น์ง ์ ๋ถ ๊ฒ์ฌํ๋ฉด ๋ถํ์ํ ์ฐ์ฐ ๋ญ๋น ์๊น
| Visibility ์ต์ | ํ๋ฉด ํ์ | ์ ๋ ฅ ๊ฐ์ง | ์ค๋ช |
|---|---|---|---|
| Visible | ๋ณด์ | ๊ฐ์ง | ํด๋ฆญ, ํธ๋ฒ ๋ฑ ์ํธ์์ฉ ๊ฐ๋ฅ |
| Self Hit Test Invisible | ๋ณด์ | โ ๊ฐ์ง (๋ณธ์ธ๋ง) | ์์ ์์ ฏ์ ์ ๋ ฅ ๊ฐ๋ฅ |
| Hit Test Invisible | ๋ณด์ | โ ๊ฐ์ง (์๊ธฐ+์์) | ์ ์ฒด ์ ๋ ฅ ๋ฌด์ |
| Hidden / Collapsed | โ ์ ๋ณด์ | โ ๊ฐ์ง | ๋ ๋๋ง ๋ฐ ์ ๋ ฅ ๋ ๋ค ์์ |
๐กCanvas Panel ๋ฐ Overlays ์กฐ๊ธ๋ง ์ฌ์ฉํ๊ธฐ
Canvas Panel
Grid Panel
์์ ์์ ฏ๋ง๋ค Anchors (์ต์ปค), Offsets (์์น/ํฌ๊ธฐ) ๊ฐ์ผ๋ก ์์น๋ฅผ ์ง์
UI ์์น๋ฅผ ํฝ์ ๋จ์๋ก ์ ํํ ์ ์ดํ ์ ์์
์ค์ฒฉ ํจ๋์ด๋ Layer ๊ด๋ฆฌ์ ์์ฃผ ์ฌ์ฉ
๋ฒํผ์ด๋ HUD ์์ด์ฝ ๋ฑ์ ์ขํ๋ก ๋ฐฐ์นํ ๋ ๊ฐ์ฅ ์ ์ฉ
ํ๊ณผ ์ด๋ก ์ ๋๋ ๊ตฌ์กฐํ UI (์ธ๋ฒคํ ๋ฆฌ, ์ค์ , ๋ชฉ๋ก)
๊ทธ๋ฆฌ๋ ์
์์์ ํฝ์
๋จ์๋ก ์์น๋ฅผ ์ด์ง ์กฐ์ ํด์ผํ ๋ Nudge ์ฌ์ฉ
โ ๋ณ๋์ Draw Call ์์ด ๋๋ ํธ๋์คํผ๋ง ์ ์ฉ๋จ
โ ์ฑ๋ฅ ๋ฌธ์ ์์

| ํญ๋ชฉ | Canvas Panel | Grid Panel |
|---|---|---|
| ๋ฐฐ์น ๋ฐฉ์ | ์ ๋ ์์น ๊ธฐ๋ฐ (์ขํ + ์ต์ปค) | ํ(row) / ์ด(column) ๊ธฐ๋ฐ |
| ์ขํ ๊ธฐ์ค | Pixel ๋จ์ (X, Y) | ์ ๋จ์ (Row, Column) |
| ํฌ๊ธฐ ์กฐ์ | ์๋ (Anchors, Offsets) | ์๋ (์ ํฌ๊ธฐ์ ๋ฐ๋ผ) |
| ์ ๋ ฌ / ์๋๋ฐฐ์น | ์์ (์ง์ ๋ฐฐ์น) | ์์ (๊ทธ๋ฆฌ๋ ์ ๋ ฌ ์๋) |
| ์ฃผ ์ฉ๋ | HUD, ์ ๋์์น UI, ๋ ์ด์ด ๋ฐฐ์น | ํ ํ์ UI, ์ธ๋ฒคํ ๋ฆฌ, ์ค์ ๋ฉ๋ด |
| ๋ฐ์ํ UI | ์ง์ ์ต์ปค ๊ณ์ฐ ํ์ | ๊ทธ๋ฆฌ๋ ๋น์จ๋ก ๋น๊ต์ ์ฉ์ด |
| ์ฑ๋ฅ | ๋งค์ฐ ๊ฐ๋ณ๊ณ ๋จ์ | ์ ๊ณ์ฐ์ด ์ฝ๊ฐ ๋ ๋ณต์ก |
| Anchor ์ง์ | ์์ | ์์ (๋์ ์๋์ ๋ ฌ) |
๐กSize Boxes ๋์ Spacers ์ฌ์ฉํ๊ธฐ
๐กSoft References ์ฌ์ฉํ๊ธฐ
(์์) ์บ๋ฆญํฐ ์ ํ ํ๋ฉด
์บ๋ฆญํฐ 10๋ช
์บ๋ฆญํฐ
- ๋ฉ์
- ํ
์ค์ณ
- ๋จธํฐ๋ฆฌ์ผ
- ์ฌ์ด๋
- ์ ๋๋ฉ์ด์
๊ฐ์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ง๊ณ ์์
๐กTexture ๋์ ํฐํธ๋ก ์์ด์ฝ ๊ด๋ฆฌํ๊ธฐ
โ ๋ฉ๋ชจ๋ฆฌ์ Draw Call ์ ์ฝ
์ผ๋ฐ์ ์ผ๋ก UI ์์ด์ฝ์ Texture ์ด๋ฏธ์ง๋ก ๋ง๋ค์ด์ ธ ์์ด์ ์์ด์ฝ์ด ๋ง์์ง์๋ก
๋จธํฐ๋ฆฌ์ผ ์ โ / Draw Call โ / GPU ๋ฉ๋ชจ๋ฆฌ(ํ ์ค์ฒ ๋ฉ๋ชจ๋ฆฌ) ๋ญ๋น
์ด๋ฏธ์ง ๋์ ํฐํธ๋ก ์์ด์ฝ ํ์
FontForge / Fontello ํด ์ด์ฉ
.ttf)๋ก ๋ฌถ๊ธฐUI ์์ ฏ์ ์ด๋ฏธ์ง ๋์ ํ ์คํธ ๋ธ๋ก ์ถ๊ฐํด์ ํด๋น ์์ด์ฝ์ ์ ๋์ฝ๋ ๊ฐ ๋๋ ๊ธ๋ฆฌํ ๋ฌธ์ ์ ๋ ฅ
๋ฌธ์ ์
- ์ผ๋ถ ๋ธ๋ฃจํ๋ฆฐํธ์์๋ ์ ๋์ฝ๋ ๊ฐ์ ์ง์ ์
๋ ฅํ ๋ ์ธ์๋์ง ์์
- ์์ด์ฝ ๊ธ๋ฆฌํ(๋ฌธ์ ์์ฒด)๋ฅผ ๋ณต๋ถํ๋ฉด ๊ด์ฐฎ์!

| ํญ๋ชฉ | ๊ธฐ์กด ๋ฐฉ์ (์ด๋ฏธ์ง ์์ด์ฝ) | ํฐํธ ๋ฐฉ์ (์์ด์ฝ ํฐํธ) |
|---|---|---|
| ์์ด์ฝ ์ | 200๊ฐ ์ด์ | 200๊ฐ ์ด์ |
| ๋ฆฌ์์ค ๊ตฌ์กฐ | PNG + ๋จธํฐ๋ฆฌ์ผ 200๊ฐ | ๋จ์ผ 2048ร2048 ํฐํธ ํ ์ค์ฒ |
| ํ ์ค์ฒ ๋ฉ๋ชจ๋ฆฌ | ๋งค์ฐ ๋์ | ํจ์ฌ ์ ์ |
| Draw Call ์ | ๋ง์ | ์ ์ |
| ์ ์ง๋ณด์ | ๊ฐ๋ณ ์ด๋ฏธ์ง ๊ด๋ฆฌ ํ์ | ํฐํธ ํ๋๋ก ๊ด๋ฆฌ |
โ 3D Mesh์ Slate ๊ฒฐํฉ์ผ๋ก ๊ณ ๊ธ ์๊ฐํจ๊ณผ ๊ตฌํ
๐ก๋์ผ ๋ค์ ์์ ฏ ์ธ์คํด์ค์ MeshWidget ๊ณ ๋ คํ๊ธฐ
์ ์ฒด๋ ฅ๋ฐ, ๋ฏธ๋๋งต ์์ด์ฝ, ์๋ ๋ด POI์ฒ๋ผ ๋๊ฐ์ UI๊ฐ ์์ฒญ ๋ง์ด ํ์ํจ
๋ณดํต Widget Component๋ฅผ ์ฐ๋๋ฐ ๋ฌธ์ ์์
์์ ฏ ํ๋ํ๋๋ง๋ค ์ด ๊ณผ์ ์ ๋ฐ๋ณต โ ์์ฒญ ๋ฌด๊ฑฐ์ (Draw Call โ, CPU/GPU ๋น์ฉ โ)
์ฌ๋ฌ UI ์ธ์คํด์ค๋ฅผ ํ ๋ฒ์(=๋จ์ผ Draw Call) ๊ทธ๋ฆด ์ ์๋ ๋ฐฉ์ (UI์ฉ Foliage System)
์๋ ๋ฐฉ๋ฒ
X, Y : ํ๋ฉด ์์น, Z : ์ค์ผ์ผ, W : ๊ธฐ๋ณธ ์ฃผ์ 
์ผ๋ฐ ์์ ฏ ์ปดํฌ๋ํธ๋ก ์ฒด๋ ฅ๋ฐ 100๊ฐ ๊ทธ๋ฆฌ๋ฉด 100๋ฒ์ ๋๋๋ง์ด ํ์ํ์ง๋ง,
๋ฉ์ ์์ ฏ์ ๋ฑ ํ ๋ฒ์ Draw Call๋ก 100๊ฐ๋ฅผ ๋ค ๊ทธ๋ ค๋ฒ๋ฆผ
์ข์๊ธ ์ ๋ณด๊ณ ๊ฐ๋๋ค! NameSlot, DrawCall ๋ถ๋ถ์ ์ ๋ ๊ณต๋ถํด์ ํ๋ก์ ํธ์ ์จ๋จน์ด๋ด์ผ๊ฒ ์ต๋๋ค.