๐Ÿ“˜TIL-RTS ๊ธฐ๋ณธ UI ๋ฐ์ดํ„ฐ ์—ฐ๋™ ํ…Œ์ŠคํŠธ ๋ฐ ๋ฒ„๊ทธ ์ˆ˜์ •

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

Unreal ๊ฐœ๋ฐœ

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

๋ฌธ์ œ

UI ์Šค์ผˆ๋ ˆํ†ค ๊ตฌ์กฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ WBP์™€ C++์„ ์—ฐ๊ฒฐํ•œ ๋’ค ์‹ค์ œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ,
๋‹จ์ˆœ ํ‘œ์‹œ ์ˆ˜์ค€์—์„œ๋Š” ์ •์ƒ์ฒ˜๋Ÿผ ๋ณด์˜€์ง€๋งŒ, ์‹ค์ œ ์ž…๋ ฅ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ”๋ณด๋ฉด UI๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๊ฐฑ์‹ ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.


๋ฐœ์ƒํ•œ ์ฆ์ƒ ์ •๋ฆฌ

๊ตฌ๋ถ„์ฆ์ƒ
์ž…๋ ฅ ์ฒ˜๋ฆฌํ‚ค ์ž…๋ ฅ ๋กœ๊ทธ๋Š” ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ๋จ
SelectionPanel์ƒํƒœ ๋ณ€๊ฒฝ ํ›„ ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ผ๋ถ€๋งŒ ๋ฐ˜์˜
CommandPanelSelection ๋ณ€๊ฒฝ๊ณผ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์Œ
TopBar์ž์› ๊ฐ’ ๋ณ€๊ฒฝ ์‹œ UI ๊ฐฑ์‹  ์•ˆ๋จ
Notificationํ˜ธ์ถœ์€ ๋˜์ง€๋งŒ ํ๋ฆ„๊ณผ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Œ
์ „์ฒด ํ๋ฆ„์ž…๋ ฅ โ†’ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ โ†’ UI ๋ฐ˜์˜๊นŒ์ง€ ์ด์–ด์ง€์ง€ ์•Š์Œ

๋ฌธ์ œ ์ƒํ™ฉ ํ๋ฆ„

์‹ค์ œ ๋‚ด๋ถ€ ํ๋ฆ„์„ ๋ณด๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋Š๊ฒจ ์žˆ์—ˆ๋‹ค.

์ž…๋ ฅ (PlayerController)
โ†’ Mock ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ
โ†’ (UI ๊ฐฑ์‹  ์—†์Œ)

์ฆ‰ ๊ตฌ์กฐ๋Š” ์žˆ์—ˆ์ง€๋งŒ ์‹คํ–‰ ๋ฃจํ”„๊ฐ€ ์™„์„ฑ๋˜์ง€ ์•Š์€ ์ƒํƒœ์˜€๋‹ค.


๋ถ„์„

๋ฌธ์ œ๋ฅผ ๊ตฌ์กฐ ๊ธฐ์ค€์œผ๋กœ ๋ถ„ํ•ดํ•ด๋ณด๋ฉด, ์›์ธ์€ ๋ช…ํ™•ํ•˜๊ฒŒ 4๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์—ˆ๋‹ค.


1. UI ๊ฐฑ์‹  ํŠธ๋ฆฌ๊ฑฐ ๋ถ€์žฌ

ํ˜„์žฌ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค๊ณ„๋˜์–ด ์žˆ์—ˆ๋‹ค.

Provider โ†’ Coordinator โ†’ ViewModel โ†’ HUDRoot โ†’ Panel

์ด ๊ตฌ์กฐ ์ž์ฒด๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์ง€๋งŒ,
ํ•ต์‹ฌ ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ Coordinator๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.


์‹ค์ œ ์ƒํƒœ

MockSelection ์ƒํƒœ ๋ณ€๊ฒฝ๋จ
โ†’ Provider ๊ฐ’์€ ๋ฐ”๋€œ
โ†’ Coordinator๋Š” ๋‹ค์‹œ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ
โ†’ UI ๊ทธ๋Œ€๋กœ ์œ ์ง€

์ฆ‰ ๊ตฌ์กฐ๋Š” ๋งž๋Š”๋ฐ โ€œ์–ธ์ œ ๊ฐฑ์‹ ํ• ์ง€โ€๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ์ƒํƒœ์˜€๋‹ค.


2. PlayerController์—์„œ ๊ฐฑ์‹  ํ˜ธ์ถœ ๋ˆ„๋ฝ

์ž…๋ ฅ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ๋ณด๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋˜์–ด ์žˆ์—ˆ๋‹ค.

Input โ†’ Mock ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ โ†’ ๋

์—ฌ๊ธฐ์„œ ๋น ์ง„ ํ•ต์‹ฌ ๋‹จ๊ณ„๋Š” ์ด๊ฒƒ์ด๋‹ค.

โ†’ Coordinator Refresh ํ˜ธ์ถœ

์ •์ƒ์ ์ธ ํ๋ฆ„ (์˜๋„)

์ž…๋ ฅ
โ†’ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ
โ†’ Coordinator.RefreshXXX()
โ†’ HUDRoot ์ „๋‹ฌ
โ†’ Panel ๊ฐฑ์‹ 

์ด ํ•œ ์ค„์ด ๋น ์ ธ์„œ UI๊ฐ€ ์ •์ง€ ์ƒํƒœ์ฒ˜๋Ÿผ ๋ณด์˜€๋˜ ๊ฒƒ์ด๋‹ค.


3. Selection๊ณผ CommandPanel ๊ฐฑ์‹  ๋ถ„๋ฆฌ ๋ฌธ์ œ

Selection ์ƒํƒœ์™€ CommandPanel์€ ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ ๊ตฌํ˜„์—์„œ๋Š”

  • SelectionPanel์€ ๊ฐฑ์‹ ๋˜๊ฑฐ๋‚˜
  • CommandPanel์€ ๊ฐฑ์‹  ์•ˆ ๋˜๋Š”

๋น„๋™๊ธฐ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.


๋ฌธ์ œ ๊ตฌ์กฐ

Selection ๋ณ€๊ฒฝ
โ†’ SelectionPanel๋งŒ ๊ฐฑ์‹ 
โ†’ CommandPanel ๊ทธ๋Œ€๋กœ ์œ ์ง€

๊ธฐ๋Œ€ ๊ตฌ์กฐ

Selection ๋ณ€๊ฒฝ
โ†’ SelectionPanel ๊ฐฑ์‹ 
โ†’ CommandPanel ๊ฐฑ์‹  (ํ•ญ์ƒ ๊ฐ™์ด)

4. WBP ๋ฐ”์ธ๋”ฉ ๋ฐ ์œ„์ ฏ ์—ฐ๊ฒฐ ๋ฌธ์ œ

์ผ๋ถ€ UI๊ฐ€ ์•„์˜ˆ ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ์ผ€์ด์Šค๋Š”
์ฝ”๋“œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ WBP ์„ค์ • ๋ฌธ์ œ์˜€๋‹ค.


์ฃผ์š” ์›์ธ

ํ•ญ๋ชฉ๋ฌธ์ œ
BindWidget ์ด๋ฆ„C++๊ณผ ๋ถˆ์ผ์น˜
๋ถ€๋ชจ ํด๋ž˜์Šค์ž˜๋ชป๋œ Widget ํด๋ž˜์Šค ์‚ฌ์šฉ
IsVariable์ฒดํฌ ์•ˆ๋จ
์œ„์ ฏ ํŠธ๋ฆฌ์ฐธ์กฐ ๋Š๊น€

ํ•ด๊ฒฐ

๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉํ–ฅ์€ ๋‹จ์ˆœํ•˜๊ฒŒ ์žก์•˜๋‹ค.

โ€œ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ดํ›„ ๋ฐ˜๋“œ์‹œ UI ๊ฐฑ์‹  ํ•จ์ˆ˜๊นŒ์ง€ ์—ฐ๊ฒฐํ•œ๋‹คโ€


1. PlayerController ์ค‘์‹ฌ ๊ฐฑ์‹  ํ๋ฆ„ ์ •๋ฆฌ

์ž…๋ ฅ ์ฒ˜๋ฆฌ ์ดํ›„ ํ๋ฆ„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์—ฐ๊ฒฐํ–ˆ๋‹ค.


์ˆ˜์ •๋œ ํ๋ฆ„

์ž…๋ ฅ
โ†’ Mock ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ
โ†’ Coordinator.Refresh ํ˜ธ์ถœ
โ†’ HUDRoot ์ „๋‹ฌ
โ†’ Panel ๊ฐฑ์‹ 

์‹ค์ œ ์ ์šฉ ๊ตฌ์กฐ

์ž…๋ ฅ์ฒ˜๋ฆฌ
F1/F2/F3Selection ์ƒํƒœ ๋ณ€๊ฒฝ + Selection/Command Refresh
1/2/3Resource ๊ฐ’ ๋ณ€๊ฒฝ + TopBar Refresh
F8Notification ํ˜ธ์ถœ

2. Selection โ†’ CommandPanel ๊ฐ•์ œ ๋™๊ธฐํ™”

Selection ๋ณ€๊ฒฝ ์‹œ ํ•ญ์ƒ ์•„๋ž˜ ๋‘ ๊ฐœ๋ฅผ ๊ฐ™์ด ํ˜ธ์ถœํ•˜๋„๋ก ๊ณ ์ •ํ–ˆ๋‹ค.

RefreshSelectionPanel()
RefreshCommandPanel()

๊ฒฐ๊ณผ

์ƒํƒœ๋ณ€๊ฒฝ ์ „๋ณ€๊ฒฝ ํ›„
Selection ๋ณ€๊ฒฝUI ๋ถˆ์ผ์น˜ ๋ฐœ์ƒํ•ญ์ƒ ๋™๊ธฐํ™”
CommandPanel๊ฐฑ์‹  ๋ˆ„๋ฝํ•ญ์ƒ ๊ฐฑ์‹ 

3. ์ดˆ๊ธฐํ™” ํ๋ฆ„ ๋ถ„๋ฆฌ

์ดˆ๊ธฐ ์ง„์ž… ์‹œ์—๋Š” ์ „์ฒด ๊ฐฑ์‹ ์„ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ตฌ์กฐ๋ฅผ ์ •๋ฆฌํ–ˆ๋‹ค.


์ดˆ๊ธฐํ™” ํ๋ฆ„

BeginPlay
โ†’ Coordinator.Initialize
โ†’ RefreshAll (1ํšŒ)

์ดํ›„ ํ๋ฆ„

๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‹œ
โ†’ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ Refresh

4. Mock Provider ์—ญํ•  ๊ฐ•ํ™”

Mock ๊ฐ์ฒด๋ฅผ ๋‹จ์ˆœ ๋ฐ์ดํ„ฐ ์ €์žฅ์ด ์•„๋‹ˆ๋ผ
ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ๋จธ์‹ ์œผ๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค.


MockSelection ๊ฐœ์„ 

๊ธฐ๋Šฅ๋‚ด์šฉ
์ƒํƒœ ๊ด€๋ฆฌNone / Unit / Building
ViewModel ๋ฐ˜ํ™˜์ƒํƒœ๋ณ„ ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ
CommandId ๋ฐ˜ํ™˜์ƒํƒœ๋ณ„ ๋‹ค๋ฅธ Command ๋ฆฌ์ŠคํŠธ

MockResource ๊ฐœ์„ 

๊ธฐ๋Šฅ๋‚ด์šฉ
๋‚ด๋ถ€ ๊ฐ’Wood / Gas / Population
๋ณ€๊ฒฝ ํ•จ์ˆ˜AddWood / AddGas / AddPopulation
ViewModel ๋ฐ˜ํ™˜TopBar ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ

5. WBP ๋ฐ”์ธ๋”ฉ ๋ฌธ์ œ ํ•ด๊ฒฐ

์•„๋ž˜ ๊ธฐ์ค€์œผ๋กœ ์ „๋ถ€ ์žฌ์ ๊ฒ€ํ–ˆ๋‹ค.


์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉํ™•์ธ
BindWidget ์ด๋ฆ„์ •ํ™•ํžˆ ์ผ์น˜
๋ถ€๋ชจ ํด๋ž˜์Šค์˜ฌ๋ฐ”๋ฅธ Widget ํด๋ž˜์Šค
IsVariableํ•„์š”ํ•œ ์š”์†Œ ์ฒดํฌ
Layout์‹ค์ œ ํ™”๋ฉด ํ‘œ์‹œ ํ™•์ธ

๊ฒฐ๊ณผ

์ˆ˜์ • ์ดํ›„ ์ „์ฒด ํ๋ฆ„์ด ์ •์ƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ๋‹ค.


์ตœ์ข… ๋™์ž‘ ํ๋ฆ„

์ž…๋ ฅ
โ†’ Mock ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ
โ†’ Coordinator.RefreshXXX()
โ†’ ViewModel ์ƒ์„ฑ
โ†’ HUDRoot ์ „๋‹ฌ
โ†’ Panel UI ๊ฐฑ์‹ 

๊ธฐ๋Šฅ๋ณ„ ์ •์ƒ ๋™์ž‘

๊ธฐ๋Šฅ๊ฒฐ๊ณผ
Selection ๋ณ€๊ฒฝSelectionPanel ์ฆ‰์‹œ ๋ฐ˜์˜
Command ๋ณ€๊ฒฝCommandPanel ์ฆ‰์‹œ ๋ฐ˜์˜
Resource ๋ณ€๊ฒฝTopBar ์ฆ‰์‹œ ๋ฐ˜์˜
Notification๋ฉ”์‹œ์ง€ + ์ƒ‰์ƒ ์ •์ƒ ์ถœ๋ ฅ
์ „์ฒด HUD์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์ •์ƒ ์œ ์ง€

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

  1. UI๋Š” ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ๋˜์ง€ ์•Š๋Š”๋‹ค
  2. ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ดํ›„ ๋ฐ˜๋“œ์‹œ Refresh๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค
  3. Selection๊ณผ Command๋Š” ํ•ญ์ƒ ๊ฐ™์ด ์›€์ง์—ฌ์•ผ ํ•œ๋‹ค
  4. ๊ตฌ์กฐ๋ณด๋‹ค โ€œ๊ฐฑ์‹  ํƒ€์ด๋ฐโ€์ด ๋” ์ค‘์š”ํ•˜๋‹ค

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

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