๐Ÿ“˜TIL-RTS ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด UI ๊ด€๋ จ ๊ณต๋ถ€ ๋ฐ ์„ค๊ณ„

HappyCircleยท2026๋…„ 3์›” 27์ผ

Unreal ๊ฐœ๋ฐœ

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

๋ฌธ์ œ

RTS ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด ํ”„๋กœ์ ํŠธ์—์„œ UI๋ฅผ ์ „๋‹ดํ•˜๊ฒŒ ๋˜๋ฉด์„œ ๋‹จ์ˆœํžˆ ํ™”๋ฉด์„ ๋งŒ๋“œ๋Š” ์ž‘์—…์ด ์•„๋‹ˆ๋ผ
๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ์ ์ธ ๊ณ ๋ฏผ์ด ํ•„์š”ํ–ˆ๋‹ค.

  • UI๋Š” ์–ด๋””๊นŒ์ง€ ์ฑ…์ž„์ ธ์•ผ ํ•˜๋Š”๊ฐ€
  • ์„œ๋ฒ„ ๊ถŒํ•œ ๊ตฌ์กฐ์—์„œ UI๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”๊ฐ€
  • ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€
  • Command Panel, Selection UI, ๋‹จ์ถ•ํ‚ค๋ฅผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋Š”๊ฐ€
  • ์ž…๋ ฅ ๋”œ๋ ˆ์ด๋ฅผ UX์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š”๊ฐ€

ํŠนํžˆ RTS๋Š”
์„ ํƒ โ†’ ๋ช…๋ น โ†’ ์ƒํƒœ ๋ณ€ํ™” โ†’ UI ๊ฐฑ์‹ 
์ด ํ๋ฆ„์ด ๋ฐ˜๋ณต๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ตฌ์กฐ๋ฅผ ์ž˜๋ชป ์žก์œผ๋ฉด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋งค์šฐ ์–ด๋ ค์›Œ์ง„๋‹ค.


๋ถ„์„

์ด๋ฒˆ ์ •๋ฆฌ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ๋А๋‚€ ์ ์€
UI๋ฅผ ๋‹จ์ˆœํ•œ โ€œํ‘œํ˜„ ๊ณ„์ธตโ€์ด ์•„๋‹ˆ๋ผ ์ƒํƒœ ํ‘œํ˜„ ์‹œ์Šคํ…œ์œผ๋กœ ๋ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค.


1. UI์˜ ์ฑ…์ž„ ๋ฒ”์œ„

UI๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๊ตฌ๋ถ„์—ญํ• 
์ž…๋ ฅ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ „๋‹ฌ
ํ‘œ์‹œ์ƒํƒœ๋ฅผ ํ™”๋ฉด์— ํ‘œํ˜„
๋ฐ˜์‘์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ ๊ฐฑ์‹ 

๋ฐ˜๋Œ€๋กœ UI๊ฐ€ ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ธˆ์ง€ ์—ญํ• ์ด์œ 
์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์ˆ˜์ •๊ถŒํ•œ ๋ฌธ์ œ (Server Authority)
๊ฒŒ์ž„ ๋กœ์ง ์‹คํ–‰์ฑ…์ž„ ๋ถ„๋ฆฌ ์œ„๋ฐ˜
์ƒํƒœ ์›๋ณธ ์ €์žฅ๋™๊ธฐํ™” ๊นจ์ง

์ •๋ฆฌํ•˜๋ฉด

UI๋Š” ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค.
UI๋Š” ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

2. ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ ํ๋ฆ„

๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด ํ™˜๊ฒฝ์—์„œ UI๋Š” ํ•ญ์ƒ ๊ฐ„์ ‘์ ์œผ๋กœ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค.

[UI]
 โ†’ PlayerController
 โ†’ Server RPC
 โ†’ GameState / PlayerState
 โ†’ Replication
 โ†’ UI ๊ฐฑ์‹ 

์ด ๊ตฌ์กฐ์—์„œ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • UI๋Š” ์„œ๋ฒ„๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค
  • PlayerController๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ์ „๋‹ฌํ•œ๋‹ค
  • ์ƒํƒœ ๋ณ€๊ฒฝ์€ ์„œ๋ฒ„์—์„œ๋งŒ ์ผ์–ด๋‚œ๋‹ค
  • UI๋Š” ๋ณต์ œ๋œ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐฑ์‹ ๋œ๋‹ค

3. ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์„ค๊ณ„ (3๊ณ„์ธต)

RTS UI๋Š” ๋ฐ˜๋“œ์‹œ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.
๊ตฌ์กฐ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ 3๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์•ˆ์ •์ ์ด๋‹ค.

๊ตฌ์กฐ ๊ฐœ์š”

Gameplay Data โ†’ UI Meta Data โ†’ ViewModel โ†’ UI

1) Gameplay Data (์›๋ณธ ๋ฐ์ดํ„ฐ)

ํ•ญ๋ชฉ์„ค๋ช…
UnitId์œ ๋‹› ์‹๋ณ„
CommandId๋ช…๋ น ์‹๋ณ„
Cost์‹ค์ œ ๋น„์šฉ
Cooldown์‹ค์ œ ์ฟจ๋‹ค์šด
Condition์‹คํ–‰ ์กฐ๊ฑด

โ†’ ๊ฒŒ์ž„์˜ ์‹ค์ œ ๊ทœ์น™์ด ๋‹ด๊ธด ๋ฐ์ดํ„ฐ


2) UI Meta Data (ํ‘œ์‹œ ๋ฐ์ดํ„ฐ)

ํ•ญ๋ชฉ์„ค๋ช…
Icon์•„์ด์ฝ˜
DisplayNameํ‘œ์‹œ ์ด๋ฆ„
Tooltip์„ค๋ช…
SlotIndex์Šฌ๋กฏ ์œ„์น˜
HotkeyLabel๋‹จ์ถ•ํ‚ค ํ‘œ์‹œ

โ†’ UI ํ‘œํ˜„์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ


3) ViewModel (UI ์ „๋‹ฌ ๋ฐ์ดํ„ฐ)

ํ•ญ๋ชฉ์„ค๋ช…
SlotIndex์Šฌ๋กฏ ์œ„์น˜
Iconํ‘œ์‹œ ์•„์ด์ฝ˜
bEnabledํ™œ์„ฑ ์—ฌ๋ถ€
CooldownRatio์ฟจ๋‹ค์šด ์ƒํƒœ
bPending์˜ˆ์ธก ์ƒํƒœ

โ†’ UI์— ์‹ค์ œ๋กœ ์ „๋‹ฌ๋˜๋Š” ์ตœ์ข… ๋ฐ์ดํ„ฐ


4. Command Panel ์„ค๊ณ„

RTS UI์˜ ํ•ต์‹ฌ์€ CommandId ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋‹ค.

ํ๋ฆ„

์ž…๋ ฅ(๋ฒ„ํŠผ/ํ‚ค)
 โ†’ CommandId ์ƒ์„ฑ
 โ†’ ์„œ๋ฒ„ ์š”์ฒญ
 โ†’ ์ƒํƒœ ๋ณ€๊ฒฝ
 โ†’ UI ๊ฐฑ์‹ 

ํŠน์ง•

  • ๋ฒ„ํŠผ ํด๋ฆญ๊ณผ ํ‚ค ์ž…๋ ฅ์€ ๋™์ผํ•œ CommandId๋กœ ์ฒ˜๋ฆฌ
  • UI๋Š” CommandId๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ‘œ์‹œ๋งŒ ์ˆ˜ํ–‰
  • ์‹คํ–‰์€ ์„œ๋ฒ„์—์„œ ๋‹ด๋‹น

5. ๋‹จ์ถ•ํ‚ค ์ฒ˜๋ฆฌ ๊ตฌ์กฐ

๋‹จ์ถ•ํ‚ค๋Š” UI๊ฐ€ ์•„๋‹ˆ๋ผ ์ž…๋ ฅ ์‹œ์Šคํ…œ์ด ๋‹ด๋‹นํ•œ๋‹ค.

๊ตฌ์กฐ

Input System โ†’ CommandId โ†’ Server โ†’ UI ํ‘œ์‹œ

์—ญํ•  ๋ถ„๋ฆฌ

์˜์—ญ์—ญํ• 
Inputํ‚ค ์ž…๋ ฅ ๊ฐ์ง€
Command System์‹คํ–‰ ์ฒ˜๋ฆฌ
UI๋‹จ์ถ•ํ‚ค ํ‘œ์‹œ

UI๋Š” ๋‹จ์ˆœํžˆ

  • ๋‹จ์ถ•ํ‚ค ํ…์ŠคํŠธ ํ‘œ์‹œ
  • ํ™œ์„ฑ/๋น„ํ™œ์„ฑ ์ƒํƒœ ๋ฐ˜์˜

๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค.


6. Client Prediction (์ž…๋ ฅ ์ง€์—ฐ ์ฒ˜๋ฆฌ)

๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์—์„œ๋Š” ์ž…๋ ฅ๊ณผ ๊ฒฐ๊ณผ ์‚ฌ์ด์— ์ง€์—ฐ์ด ๋ฐœ์ƒํ•œ๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด UI๋Š” โ€œ์˜ˆ์ธก ์ƒํƒœโ€๋ฅผ ๋จผ์ € ๋ณด์—ฌ์ค€๋‹ค.

์ƒํƒœ ํ๋ฆ„

Predicted โ†’ Confirmed โ†’ Rejected

์˜ˆ์‹œ (์ƒ์‚ฐ ๋ฒ„ํŠผ)

๋‹จ๊ณ„UI ์ƒํƒœ
ํด๋ฆญ์ž„์‹œ ํ ์ถ”๊ฐ€
๋Œ€๊ธฐPending ์ƒํƒœ
์Šน์ธํ™•์ • ์ƒํƒœ
์‹คํŒจ๋กค๋ฐฑ + ์•Œ๋ฆผ

์ƒํƒœ ํ‘œํ˜„ ์ •๋ฆฌ

์ƒํƒœ์˜๋ฏธUI ํ‘œํ˜„
Predicted์ž…๋ ฅ ์งํ›„์ฆ‰์‹œ ๋ฐ˜์‘
Pending์„œ๋ฒ„ ๋Œ€๊ธฐ๋ฐ˜ํˆฌ๋ช…/๋Œ€๊ธฐ ํ‘œ์‹œ
Confirmed์Šน์ธ์ •์ƒ ์ƒํƒœ
Rejected์‹คํŒจ๋กค๋ฐฑ + ๊ฒฝ๊ณ 

ํ•ต์‹ฌ์€
โ€œ์ง€์—ฐ์„ ์—†์• ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ง€์—ฐ์„ ๋А๋ผ์ง€ ์•Š๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒโ€์ด๋‹ค.


7. Delegate ๊ธฐ๋ฐ˜ UI ๊ฐฑ์‹ 

UI๋Š” ๋งค ํ”„๋ ˆ์ž„ ๊ฐฑ์‹ ์ด ์•„๋‹ˆ๋ผ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค.

์ด๋ฒคํŠธ ๊ตฌ์กฐ

OnResourceChanged
OnSelectionChanged
OnCommandChanged
OnNotification

๋น„๊ต

๋ฐฉ์‹ํŠน์ง•
Tick ๊ธฐ๋ฐ˜๋น„ํšจ์œจ, ์ƒํƒœ ๊ผฌ์ž„
์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์ •ํ™•, ์„ฑ๋Šฅ ์•ˆ์ •

8. ๊ณต์šฉ UI ๊ตฌ์กฐ

RTS UI๋Š” ์œ ๋‹›๋ณ„ UI๊ฐ€ ์•„๋‹ˆ๋ผ ๊ณต์šฉ ํŒจ๋„ ๊ตฌ์กฐ๋‹ค.

๊ตฌ์„ฑ

TopBar
SelectionPanel
CommandPanel
NotificationPanel
MinimapPanel

ํŠน์ง•

  • UI๋Š” ๊ณ ์ •
  • ๋ฐ์ดํ„ฐ๋งŒ ๋ณ€๊ฒฝ
  • ์žฌ์‚ฌ์šฉ์„ฑ ํ™•๋ณด

9. ์Šค์ผˆ๋ ˆํ†ค ํ”„๋กœ์ ํŠธ ์ „๋žต

์ด๋ฒˆ ์ž‘์—…์—์„œ ์ค‘์š”ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋‹จ๊ณ„

1. ์—์…‹ ์—†์ด ๊ตฌ์กฐ ๊ตฌํ˜„
2. Mock ๋ฐ์ดํ„ฐ๋กœ ํ…Œ์ŠคํŠธ
3. ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๊ฒ€์ฆ
4. ๋ฉ”์ธ ํ”„๋กœ์ ํŠธ ์ด์‹

๋ชฉ์ 

  • ๊ตฌ์กฐ ์•ˆ์ •ํ™”
  • ์˜์กด์„ฑ ์ œ๊ฑฐ
  • ๋น ๋ฅธ ๋ฐ˜๋ณต ํ…Œ์ŠคํŠธ

10. UI ๊ตฌ์กฐ vs ์Šคํƒ€์ผ ๋ถ„๋ฆฌ

UI๋Š” ๋ฐ˜๋“œ์‹œ ๊ตฌ์กฐ์™€ ์Šคํƒ€์ผ์„ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

๊ตฌ์กฐ ๋ ˆ์ด์–ด

  • ์œ„์ ฏ ๊ตฌ์„ฑ
  • ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
  • ์ƒํƒœ ์ „ํ™˜

์Šคํƒ€์ผ ๋ ˆ์ด์–ด

  • ๋ฐฐ๊ฒฝ
  • ์•„์ด์ฝ˜
  • ์ƒ‰์ƒ
  • ํฐํŠธ

๊ตฌ์กฐ

UI Widget
 โ†’ ApplyStyle()
 โ†’ Style Data ์ฃผ์ž…

11. ๋ฏธ๋‹ˆ๋งต ๊ตฌ์กฐ

๋ฏธ๋‹ˆ๋งต์€ UI๊ฐ€ ์ง์ ‘ ๊ทธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

๊ตฌ์กฐ

RenderTarget / Texture
 โ†’ UMG Image
 โ†’ Overlay (์•„์ด์ฝ˜, ์นด๋ฉ”๋ผ)

์—ญํ•  ๋ถ„๋ฆฌ

๋‹ด๋‹น์—ญํ• 
๋ฏธ๋‹ˆ๋งต ์‹œ์Šคํ…œ์ง€๋„ ์ƒ์„ฑ
UIํ‘œ์‹œ + ์ž…๋ ฅ

12. ํ˜„์—… ๊ฐœ๋ฐœ ํ๋ฆ„

์‹ค์ œ ๊ฐœ๋ฐœ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ „์ฒด ํ”„๋กœ์„ธ์Šค

๊ธฐํš โ†’ ๊ธฐ๋Šฅ ์ •์˜
UI/ํด๋ผ โ†’ ๊ตฌ์กฐ ์„ค๊ณ„
UI ๊ฐœ๋ฐœ โ†’ ์‹œ์Šคํ…œ ๊ตฌํ˜„
๋””์ž์ธ โ†’ ๋น„์ฃผ์–ผ ์ ์šฉ

์—ญํ•  ๋ถ„๋ฆฌ

์—ญํ• ์ฑ…์ž„
๊ธฐํš๊ธฐ๋Šฅ ์ •์˜
UI ๊ฐœ๋ฐœ๊ตฌ์กฐ ์„ค๊ณ„ + ๊ตฌํ˜„
ํด๋ผ๋ฐ์ดํ„ฐ ์ œ๊ณต
UI ๋””์ž์ด๋„ˆ์‹œ๊ฐ ๋””์ž์ธ

UI ๊ฐœ๋ฐœ์ž๋Š” ๋‹จ์ˆœ ๊ตฌํ˜„์ž๊ฐ€ ์•„๋‹ˆ๋ผ
๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ์—ญํ• ์— ๊ฐ€๊น๋‹ค.


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

RTS UI๋Š” ๋ฐ์ดํ„ฐ ํ๋ฆ„, ์ƒํƒœ ํ‘œํ˜„, ์ž…๋ ฅ ์—ฐ๊ฒฐ์„ ๋‹ด๋‹นํ•˜๋Š” ์‹œ์Šคํ…œ์ด๋‹ค.
UI๋Š” ์„œ๋ฒ„ ๋กœ์ง์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ 
UI ๋ฉ”ํƒ€ ID ๊ธฐ๋ฐ˜์œผ๋กœ ์ž…๋ ฅ์„ ์ „๋‹ฌํ•˜๋ฉฐ,
ViewModel์„ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ ,
Client Prediction์œผ๋กœ ์ž…๋ ฅ ์ง€์—ฐ์„ ์™„ํ™”ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์„ค๊ณ„ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

profile
๊ฐœ๋ฐœํ•ฉ์‹œ๋‹ค!

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