๐Ÿ“˜ TIL - UI ๊ทœ๊ฒฉํ™” ๋ฐ Common UI ๊ธฐ๋ฐ˜ ํ‘œํ˜„ ๊ณ„์ธต ์ •๋ฆฌ

HappyCircleยท2026๋…„ 4์›” 8์ผ

Unreal ๊ฐœ๋ฐœ

๋ชฉ๋ก ๋ณด๊ธฐ
103/163

๋ฌธ์ œ

์–ด์ œ๊นŒ์ง€๋Š” ๋‹ค์Œ ํ๋ฆ„๊นŒ์ง€ ์—ฐ๊ฒฐ๋œ ์ƒํƒœ์˜€๋‹ค.

Actor
โ†’ CommandIds ์ œ๊ณต
โ†’ PlayerController
โ†’ ์‹คํ–‰
โ†’ ์ƒํƒœ ๋ณ€๊ฒฝ
โ†’ Provider
โ†’ Coordinator
โ†’ UI

์ด ๊ตฌ์กฐ๊ฐ€ ๋ถ™์œผ๋ฉด์„œ
์„ ํƒ, ๋ช…๋ น, Context ์ „ํ™˜, Queue ๋ฐ˜์˜๊นŒ์ง€๋Š” ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ์ƒํƒœ๊ฐ€ ๋๋‹ค.

์ฆ‰,

์„ ํƒ โ†’ ๋ช…๋ น โ†’ ์‹คํ–‰ โ†’ ์ƒํƒœ ๋ณ€๊ฒฝ โ†’ UI ๊ฐฑ์‹ 

์ด ํ๋ฆ„์€ ์™„์ „ํžˆ ์‚ด์•„์žˆ๋Š” ์ƒํƒœ์˜€๋‹ค.


ํ•˜์ง€๋งŒ ์‹ค์ œ ํ”Œ๋ ˆ์ด ๊ธฐ์ค€์œผ๋กœ ๋ณด๋ฉด ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ๋“œ๋Ÿฌ๋‚ฌ๋‹ค.


๊ตฌ์กฐ์  ๋ฌธ์ œ

๊ตฌ๋ถ„๋ฌธ์ œ
UI ๊ทœ๊ฒฉํŒจ๋„๋งˆ๋‹ค ํฌ๊ธฐ/๊ฐ„๊ฒฉ/์ •๋ ฌ ๊ธฐ์ค€์ด ๋‹ค๋ฆ„
ํ…์ŠคํŠธํฐํŠธ ํฌ๊ธฐ, ์ •๋ ฌ, ์—ญํ•  ๊ตฌ๋ถ„์ด ํ†ต์ผ๋˜์ง€ ์•Š์Œ
๋ฒ„ํŠผMenu / Command ๋ฒ„ํŠผ ๊ตฌ์กฐ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฆ„
๋ ˆ์ด์•„์›ƒSpacer, Canvas, Overlay ์‚ฌ์šฉ ๊ธฐ์ค€์ด ์„ž์—ฌ ์žˆ์Œ
์œ ์ง€๋ณด์ˆ˜๋™์ผ ์Šคํƒ€์ผ์„ ์œ„์ ฏ๋งˆ๋‹ค ๋ฐ˜๋ณต ์„ค์ •
ํ™•์žฅ์„ฑQueue / MultiSelection ํ™•์žฅ ์‹œ ๊ตฌ์กฐ ๊นจ์งˆ ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ

๊ธฐ์กด ์ƒํƒœ

๊ธฐ๋Šฅ์€ ๋™์ž‘ํ•˜์ง€๋งŒ ํ‘œํ˜„ ๊ณ„์ธต์€ ์ •๋ฆฌ๋˜์ง€ ์•Š์€ ์ƒํƒœ์˜€๋‹ค.

WBP_TopBar
โ†’ ๋ธ”๋ก๋ณ„ ํญ / ์ •๋ ฌ ๊ธฐ์ค€ ์—†์Œ

WBP_SelectionPanel
โ†’ Single / Multi ๊ตฌ์กฐ๋Š” ์žˆ์œผ๋‚˜ ํ‘œํ˜„ ๊ธฐ์ค€ ๋ถˆ๋ช…ํ™•

WBP_CommandPanel
โ†’ ์Šฌ๋กฏ๋งŒ ์กด์žฌ, ํŒจ๋„ ๊ทœ๊ฒฉ ์—†์Œ

WBP_MenuPanel
โ†’ ๋ฒ„ํŠผ ๊ฐœ๋ณ„ ์ˆ˜์ž‘์—… ๊ตฌ์„ฑ

WBP_NotificationPanel
โ†’ ๋ถˆํ•„์š”ํ•œ Canvas ๊ตฌ์กฐ

๋ถ„์„

๋ฌธ์ œ๋Š” ๋ช…ํ™•ํ–ˆ๋‹ค.

๊ธฐ๋Šฅ์€ ์™„์„ฑ๋์ง€๋งŒ
UI๊ฐ€ โ€œ๊ทœ์น™ ์—†์ด ๋ถ™์€ ์ƒํƒœโ€

์–ด์ œ๊นŒ์ง€์˜ ๋ชฉํ‘œ๊ฐ€

UI โ†’ ๊ฒŒ์ž„ ํ๋ฆ„ ์—ฐ๊ฒฐ

์ด์—ˆ๋‹ค๋ฉด

์˜ค๋Š˜ ๋ชฉํ‘œ๋Š”

๋™์ž‘ํ•˜๋Š” UI
โ†’ ์œ ์ง€ ๊ฐ€๋Šฅํ•œ UI
โ†’ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ UI

๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋‹จ๊ณ„์˜€๋‹ค.


๊ตฌ์กฐ vs ๋ชฉํ‘œ

[์ด์ „]
๊ธฐ๋Šฅ ๋™์ž‘ โœ”
ํ‘œํ˜„ ๊ทœ์น™ โœ–
ํ™•์žฅ์„ฑ โ–ณ

[๋ชฉํ‘œ]
๊ธฐ๋Šฅ ๋™์ž‘ โœ”
ํ‘œํ˜„ ๊ทœ์น™ โœ”
ํ™•์žฅ์„ฑ โœ”

ํ•ด๊ฒฐ


1. UI ์—ญํ•  ๊ณ„์ธต ๋ถ„๋ฆฌ

๊ฐ€์žฅ ๋จผ์ € ์ •๋ฆฌํ•œ ๊ฑด ์ฑ…์ž„ ๋ถ„๋ฆฌ์˜€๋‹ค.


๊ธฐ์ค€

HUDRoot
โ†’ ์œ„์น˜ / ์•ต์ปค / ํ™”๋ฉด ๋ฐฐ์น˜

Panel (WBP)
โ†’ ๋‚ด๋ถ€ ๋ ˆ์ด์•„์›ƒ / ํฌ๊ธฐ ๊ทœ๊ฒฉ

Widget
โ†’ ์‹ค์ œ ํ‘œ์‹œ / ์Šคํƒ€์ผ

์˜๋ฏธ

๋ถ€๋ชจ๊ฐ€ ๋ชจ๋“  ๊ฑธ ์ œ์–ด
โ†’ ํ”๋“ค๋ฆผ ๋ฐœ์ƒ

๋ถ€๋ชจ = ์œ„์น˜
์ž์‹ = ํฌ๊ธฐ
โ†’ ์•ˆ์ •์ ์ธ ๊ตฌ์กฐ

2. Common UI ๋„์ž… ๋ฒ”์œ„ ์ œํ•œ

์ „์ฒด๋ฅผ ๊ฐˆ์•„์—Ž๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๊ฐ€์ ธ์™”๋‹ค.


์ ์šฉ

UMG
โ†’ ๋ ˆ์ด์•„์›ƒ / ๊ตฌ์กฐ ์œ ์ง€

Common UI
โ†’ Text Style
โ†’ Button Style

๊ฒฐ๊ณผ

๋ ˆ์ด์•„์›ƒ ์œ ์ง€
+ ์Šคํƒ€์ผ๋งŒ ํ†ต์ผ

3. ํ…์ŠคํŠธ ์Šคํƒ€์ผ ๊ทœ๊ฒฉํ™”

๊ธฐ์กด์—๋Š” ์œ„์ ฏ๋งˆ๋‹ค ํฐํŠธ๋ฅผ ์ง์ ‘ ์„ค์ •ํ–ˆ๋‹ค.

์ด๊ฑธ ์—ญํ•  ๊ธฐ์ค€์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค.


์Šคํƒ€์ผ ์ •์˜

TS_Header
TS_PanelTitle
TS_Label
TS_Value
TS_Button
TS_Caption
TS_Notification

๋ณ€ํ™”

์ง์ ‘ ์Šคํƒ€์ผ ์„ค์ •
โ†’ ์—ญํ•  ๊ธฐ๋ฐ˜ ์Šคํƒ€์ผ ์ ์šฉ

4. SizeBox ๊ธฐ๋ฐ˜ ํฌ๊ธฐ ๊ทœ๊ฒฉํ™”

์ด๋ฒˆ ์ž‘์—… ํ•ต์‹ฌ ์ค‘ ํ•˜๋‚˜์˜€๋‹ค.


๊ทœ์น™

64 / 96 / 128 ๋ฐฐ์ˆ˜ ์‚ฌ์šฉ
1920x1080 ๊ธฐ์ค€

์ ์šฉ

์š”์†Œํฌ๊ธฐ
CommandSlot96 x 96
Portrait96 x 96
Tile Entry96 x 96
Minimap256 x 256

์˜๋ฏธ

๊ฐ€๋ณ€ UI
โ†’ ํ”๋“ค๋ฆผ ๋ฐœ์ƒ

๊ณ ์ • SizeBox
โ†’ ์•ˆ์ •์  UI

5. Overlay / Switcher ์‚ฌ์šฉ ๊ธฐ์ค€ ์ •๋ฆฌ

์ด์ „์—๋Š” ์„ž์—ฌ ์žˆ์—ˆ๋˜ ๋ถ€๋ถ„์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ–ˆ๋‹ค.


๊ธฐ์ค€

Overlay โ†’ ๊ฒน์นจ ํ‘œํ˜„
Switcher โ†’ ์ƒํƒœ ์ „ํ™˜
Box โ†’ ์ •๋ ฌ

์ ์šฉ

์•„์ด์ฝ˜ ์œ„ ํ…์ŠคํŠธ โ†’ Overlay
์ƒํƒœ ์ „ํ™˜ โ†’ Switcher
๋ฆฌ์ŠคํŠธ ์ •๋ ฌ โ†’ Vertical/HorizontalBox

๊ฒฐ๊ณผ

๋ ˆ์ด์•„์›ƒ๊ณผ ์ƒํƒœ ๋กœ์ง ๋ถ„๋ฆฌ

6. CommandSlot ์ƒํƒœ ๊ตฌ์กฐ ์ •๋ฆฌ

์ƒํƒœ ํ‘œํ˜„์„ ๋‹จ์ˆœํ™”ํ–ˆ๋‹ค.


๊ธฐ์กด

Overlay
โ†’ DisabledOverlay ํ•˜๋‚˜

๋ณ€๊ฒฝ

BaseVisual
+ StateSwitcher

๊ตฌ์กฐ

Overlay
 โ”œ BaseVisual
 โ”” StateSwitcher
     โ”œ Enabled
     โ”œ Disabled
     โ”” Pending

์˜๋ฏธ

Visibility ๋ถ„๊ธฐ
โ†’ Switcher ๋‹จ์ผ ์ง„์ž…

7. SelectionPanel ๊ตฌ์กฐ ๋ช…ํ™•ํ™”

Single / Multi ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ–ˆ๋‹ค.


๋ณ€๊ฒฝ

ContentBox
โ†’ SingleStateBox

๊ตฌ์กฐ

StateSwitcher
โ”œ Empty
โ”œ Single
โ”” Multi

์˜๋ฏธ

Single โ†’ ์ƒ์„ธ ์ •๋ณด
Multi โ†’ ์š”์•ฝ + ๋ฆฌ์ŠคํŠธ

8. TileView ๊ธฐ๋ฐ˜ Multi Selection ์ „ํ™˜

๊ธฐ์กด ๊ตฌ์กฐ๋Š” ์ˆ˜๋™ AddChild์˜€๋‹ค.


๋ณ€๊ฒฝ

TileView ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ

ํšจ๊ณผ

ํ•ญ๋ชฉ๊ฐœ์„ 
์„ฑ๋ŠฅVirtualized
๊ตฌ์กฐ๋‹จ์ˆœํ™”
ํ™•์žฅ์„ฑ์ฆ๊ฐ€

9. MenuPanel ๊ตฌ์กฐ ํ†ต์ผ

CommandSlot๊ณผ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์œผ๋กœ ๋งž์ท„๋‹ค.


๊ตฌ์กฐ

DataTable
โ†’ ViewModel
โ†’ Widget

๋ณ€ํ™”

UI ์ง์ ‘ ์„ค์ •
โ†’ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ UI

10. ์ž๋™ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ ํ™•๋ฆฝ

ํŒจ๋„ ํฌ๊ธฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋งž์ถ”๋˜ ๊ตฌ์กฐ ์ œ๊ฑฐ


๋ณ€๊ฒฝ

ํŒจ๋„ ํฌ๊ธฐ = ๋ฒ„ํŠผ ์ดํ•ฉ + Padding

๊ฒฐ๊ณผ

์ˆ˜๋™ Width ์ œ๊ฑฐ
โ†’ ์ž๋™ ์ •๋ ฌ

11. HUDRoot ์•ต์ปค ๊ธฐ์ค€ ์ •๋ฆฌ

์œ„์น˜ ๊ธฐ์ค€์„ ๋ช…ํ™•ํžˆ ์žก์•˜๋‹ค.


์˜ˆ์‹œ

TopBar โ†’ Top Stretch
Selection โ†’ Bottom Left
Command โ†’ Bottom Right
Menu โ†’ Center Left

ํ•ต์‹ฌ

Anchor โ†’ ๊ธฐ์ค€ ์œ„์น˜
Alignment โ†’ ๊ธฐ์ค€์ 
Position โ†’ ์˜คํ”„์…‹

๊ฒฐ๊ณผ

์ด๋ฒˆ ์ž‘์—…์€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๊ฐ€ ์•„๋‹ˆ๋ผ ๊ตฌ์กฐ ์ •๋ฆฌ์˜€๋‹ค.


Before

๊ธฐ๋Šฅ ๋™์ž‘
UI ๊ตฌ์กฐ ๋ถˆ์•ˆ์ •

After

๊ธฐ๋Šฅ ์œ ์ง€
+ ์Šคํƒ€์ผ ํ†ต์ผ
+ ๊ตฌ์กฐ ๊ทœ๊ฒฉํ™”
+ ํ™•์žฅ ๊ธฐ๋ฐ˜ ํ™•๋ณด

๋น„๊ต

ํ•ญ๋ชฉ์ด์ „์ดํ›„
์Šคํƒ€์ผ๊ฐœ๋ณ„ ์„ค์ •๊ณตํ†ต ์Šคํƒ€์ผ
ํฌ๊ธฐ๊ฐ€๋ณ€SizeBox ๊ณ ์ •
์ƒํƒœ ํ‘œํ˜„VisibilitySwitcher
๋ ˆ์ด์•„์›ƒํ˜ผํ•ฉ ์‚ฌ์šฉ๊ทœ์น™ ๊ธฐ๋ฐ˜
ํ™•์žฅ์„ฑ๋‚ฎ์Œ๋†’์Œ

1. ๊ธฐ๋Šฅ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ํ‘œํ˜„ ์ •๋ฆฌ์˜€๋‹ค

๋™์ž‘ โ†’ ์œ ์ง€ ๊ฐ€๋Šฅ

2. Common UI๋Š” ๋ถ€๋ถ„ ๋„์ž…์ด ๋งž์•˜๋‹ค

์ „์ฒด ๊ต์ฒด X
์Šคํƒ€์ผ๋งŒ ์ ์šฉ

3. ์ฑ…์ž„ ๋ถ„๋ฆฌ๊ฐ€ ํ•ต์‹ฌ์ด์—ˆ๋‹ค

HUDRoot = ์œ„์น˜
Panel = ๊ตฌ์กฐ
Widget = ํ‘œํ˜„

4. ๊ทœ์น™์ด ์ƒ๊ธฐ๋ฉด์„œ ํ™•์žฅ์ด ์‰ฌ์›Œ์กŒ๋‹ค

์ถ”๊ฐ€ ๊ธฐ๋Šฅ
โ†’ ๊ธฐ์กด ๊ทœ์น™ ์œ„์— ์–น๊ธฐ ๊ฐ€๋Šฅ

์ „์ฒด ๊ตฌ์กฐ

Actor
โ†’ PlayerController
โ†’ Provider
โ†’ Coordinator
โ†’ ViewModel
โ†’ UI (๊ทœ๊ฒฉํ™”๋œ ๊ตฌ์กฐ)

์˜ค๋Š˜์˜ ์ •๋ฆฌ

  • ์–ด์ œ๋Š” UI๋ฅผ ์‹ค์ œ ๊ฒŒ์ž„ ํ๋ฆ„์— ์—ฐ๊ฒฐํ•˜๋Š” ๋‹จ๊ณ„์˜€๋‹ค.
  • ์˜ค๋Š˜์€ ๊ทธ UI๋ฅผ ๊ทœ๊ฒฉํ™”ํ•˜๊ณ  ํ‘œํ˜„ ๊ณ„์ธต์„ ์ •๋ฆฌํ•˜๋Š” ๋‹จ๊ณ„์˜€๋‹ค.
  • ์Šคํƒ€์ผ, ํฌ๊ธฐ, ์ƒํƒœ ํ‘œํ˜„ ๊ธฐ์ค€์„ ํ†ต์ผํ•˜๋ฉด์„œ ์ดํ›„ ํ™•์žฅ์„ ์œ„ํ•œ ๊ธฐ๋ฐ˜์„ ๋งŒ๋“ค์—ˆ๋‹ค.
profile
๊ฐœ๋ฐœํ•ฉ์‹œ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€