๐Ÿ“˜TIL-UI ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๊ตฌ์กฐ ์ •๋ฆฌ ๋ฐ DataTable ๊ธฐ๋ฐ˜ UI ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์ถ•

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

Unreal ๊ฐœ๋ฐœ

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

๋ฌธ์ œ

UI ์Šค์ผˆ๋ ˆํ†ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์ œ ๋™์ž‘๊นŒ์ง€ ์—ฐ๊ฒฐํ•œ ์ดํ›„,
๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” UI๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ์ง€๋งŒ ๊ตฌ์กฐ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•œ๊ณ„๊ฐ€ ๋“œ๋Ÿฌ๋‚ฌ๋‹ค.


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

๊ตฌ๋ถ„๋ฌธ์ œ
CommandPanel์ปค๋งจ๋“œ ์ •๋ณด๊ฐ€ ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Œ
Selectionํ‘œ์‹œ ์ •๋ณด(DisplayName, TypeLabel)๊ฐ€ Provider ๋‚ด๋ถ€์— ํฌํ•จ๋จ
UI ๊ตฌ์กฐ๋ฐ์ดํ„ฐ์™€ ํ‘œํ˜„์ด ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์Œ
ํ™•์žฅ์„ฑ์‹ค์ œ ๊ฒŒ์ž„ ์‹œ์Šคํ…œ ์—ฐ๊ฒฐ ์‹œ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์ด ํ•„์š”
์œ ์ง€๋ณด์ˆ˜UI ๋ณ€๊ฒฝ ์‹œ ์ฝ”๋“œ ์ˆ˜์ •์ด ํ•„์ˆ˜

๊ธฐ์กด ๊ตฌ์กฐ

Provider โ†’ Coordinator โ†’ ViewModel โ†’ UI

์ด ๊ตฌ์กฐ๋Š” ๋™์ž‘ ์ž์ฒด๋Š” ๊ฐ€๋Šฅํ–ˆ์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ–ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ƒ์„ฑ + ํ‘œํ˜„ ๊ฒฐ์ • + UI ์ถœ๋ ฅ ์ฑ…์ž„์ด ํ•˜๋‚˜์˜ ํ๋ฆ„์— ์„ž์—ฌ ์žˆ๋Š” ์ƒํƒœ

๋ถ„์„

๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ UI์˜ ๋™์ž‘ ์—ฌ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ
๋ฐ์ดํ„ฐ์™€ ํ‘œํ˜„, ๊ทธ๋ฆฌ๊ณ  UI์˜ ์—ญํ• ์ด ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค.


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

Provider
โ†’ Selection ์ƒํƒœ + DisplayName + TypeLabel๊นŒ์ง€ ์ง์ ‘ ์ƒ์„ฑ
โ†’ Coordinator ์ „๋‹ฌ
โ†’ UI ์ถœ๋ ฅ

์ด ๊ตฌ์กฐ์—์„œ๋Š” Provider๊ฐ€ ๋‹จ์ˆœ ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž๊ฐ€ ์•„๋‹ˆ๋ผ
UI ํ‘œํ˜„๊นŒ์ง€ ์ฑ…์ž„์ง€๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.


๋ฌธ์ œ์  ์ •๋ฆฌ

1. Provider๊ฐ€ UI ํ‘œํ˜„๊นŒ์ง€ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค
2. UI ๋ณ€๊ฒฝ ์‹œ Provider ์ฝ”๋“œ ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋‹ค
3. ์‹ค์ œ ๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์‹œ UI๊นŒ์ง€ ์˜ํ–ฅ์ด ๊ฐ„๋‹ค

์ฆ‰,

๋ฐ์ดํ„ฐ(๋ฌด์—‡) + ํ‘œํ˜„(์–ด๋–ป๊ฒŒ) + ์ถœ๋ ฅ(UI)์ด ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ๊ตฌ์กฐ

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

CommandPanel
โ†’ CommandId + DisplayName + Hotkey
โ†’ ์ฝ”๋“œ์—์„œ ์ง์ ‘ ์ •์˜

์ด ๊ตฌ์กฐ์—์„œ๋Š”:

  • ์ปค๋งจ๋“œ ์ถ”๊ฐ€ ์‹œ ์ฝ”๋“œ ์ˆ˜์ • ํ•„์š”
  • Hotkey ๋ณ€๊ฒฝ ์‹œ ์ฝ”๋“œ ์ˆ˜์ • ํ•„์š”
  • ๋””์ž์ด๋„ˆ๊ฐ€ ๋ฐ์ดํ„ฐ๋งŒ์œผ๋กœ UI ์กฐ์ • ๋ถˆ๊ฐ€๋Šฅ

UI ๋ ˆ์ด์•„์›ƒ ๋ฌธ์ œ

CommandPanel์—์„œ ์Šฌ๋กฏ์ด ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ค„์–ด๋“œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

SetVisibility(ESlateVisibility::Collapsed);

์ด๋กœ ์ธํ•ด:

์Šฌ๋กฏ ์œ„์ ฏ ์ž์ฒด๊ฐ€ ์ œ๊ฑฐ โ†’ ๊ทธ๋ฆฌ๋“œ ๊ตฌ์กฐ ๋ถ•๊ดด

ํ•ด๊ฒฐ

ํ•ต์‹ฌ ๋ฐฉํ–ฅ์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.

1. ๋ฐ์ดํ„ฐ์™€ ํ‘œํ˜„์„ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•œ๋‹ค
2. UI๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์†Œ๋น„๋งŒ ํ•œ๋‹ค

1. CommandPanel โ†’ DataTable ๊ธฐ๋ฐ˜ ์ „ํ™˜

์ปค๋งจ๋“œ ์ •๋ณด๋ฅผ ์ฝ”๋“œ์—์„œ ์ œ๊ฑฐํ•˜๊ณ  DataTable๋กœ ์ด๋™ํ–ˆ๋‹ค.


๋ณ€๊ฒฝ ์ „

Command ์ •๋ณด โ†’ ์ฝ”๋“œ ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ์ •์˜

๋ณ€๊ฒฝ ํ›„

CommandId
โ†’ DT_CommandMeta ์กฐํšŒ
โ†’ ViewModel ์ƒ์„ฑ
โ†’ UI ์ถœ๋ ฅ

๋™์ž‘ ํ๋ฆ„

SelectionSource
โ†’ CommandId ๋ชฉ๋ก ์ „๋‹ฌ
โ†’ Coordinator
โ†’ DataTable์—์„œ ๋ฉ”ํƒ€ ์กฐํšŒ
โ†’ ViewModel ๊ตฌ์„ฑ
โ†’ CommandPanel ์ถœ๋ ฅ

์—ญํ•  ๋ถ„๋ฆฌ

์˜์—ญ์—ญํ• 
ProviderCommandId ์ œ๊ณต
DataTableํ‘œ์‹œ ์ •๋ณด (์ด๋ฆ„, Hotkey, Icon ๋“ฑ)
Coordinator๋ฐ์ดํ„ฐ + ๋ฉ”ํƒ€๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ViewModel ์ƒ์„ฑ
UIViewModel ์ถœ๋ ฅ

2. Selection โ†’ ID ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝ

Selection๋„ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ๋ถ„๋ฆฌํ–ˆ๋‹ค.


๋ณ€๊ฒฝ ์ „

Provider โ†’ DisplayName / TypeLabel ์ง์ ‘ ์ƒ์„ฑ

๋ณ€๊ฒฝ ํ›„

SelectionSource โ†’ SelectionId ์ „๋‹ฌ
โ†’ Coordinator
โ†’ DT_SelectionPresentation ์กฐํšŒ
โ†’ DisplayName / TypeLabel / Icon ๋ณด์™„

๊ตฌ์กฐ ์˜๋ฏธ

Provider โ†’ "๋ฌด์—‡์ด ์„ ํƒ๋˜์—ˆ๋Š”๊ฐ€"
DataTable โ†’ "์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ค„ ๊ฒƒ์ธ๊ฐ€"

์žฅ์ 

  • UI ๋ณ€๊ฒฝ ์‹œ DataTable๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋จ
  • Provider๋Š” ์ˆœ์ˆ˜ ๋ฐ์ดํ„ฐ ์—ญํ• ๋งŒ ์ˆ˜ํ–‰
  • ์‹ค์ œ ๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์—๋„ UI ์˜ํ–ฅ ์ตœ์†Œํ™”

3. UI๋ฅผ ๋ฐ์ดํ„ฐ ์†Œ๋น„ ๊ตฌ์กฐ๋กœ ์ „ํ™˜

UI๋Š” ๋” ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋„๋ก ๊ตฌ์กฐ๋ฅผ ์ •๋ฆฌํ–ˆ๋‹ค.


์ตœ์ข… ๋ฐ์ดํ„ฐ ํ๋ฆ„

SelectionSource / ResourceSource
โ†’ Coordinator
โ†’ ViewModel ์ƒ์„ฑ
โ†’ HUDRoot
โ†’ Panel Widget

์ถ”๊ฐ€์ ์œผ๋กœ:

Coordinator
โ†‘
DataTable (CommandMeta / SelectionPresentation)

๊ตฌ์กฐ ํŠน์ง•

Provider = ์ƒํƒœ ์ œ๊ณต
DataTable = ํ‘œํ˜„ ์ •์˜
Coordinator = ์กฐํ•ฉ ๋ฐ ๋ณ€ํ™˜
UI = ์ถœ๋ ฅ

4. CommandPanel ๊ตฌ์กฐ ์•ˆ์ •ํ™” (9์นธ ๊ณ ์ •)

CommandPanel์€ ํ•ญ์ƒ ๋™์ผํ•œ ๋ ˆ์ด์•„์›ƒ์„ ์œ ์ง€ํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค.


๊ธฐ์กด ๋ฌธ์ œ

์Šฌ๋กฏ Collapse โ†’ ๊ทธ๋ฆฌ๋“œ ์ถ•์†Œ

์ˆ˜์ • ํ›„

ํ•ญ์ƒ 9์นธ ์œ ์ง€
โ†’ ์Šฌ๋กฏ์€ ์œ ์ง€ํ•˜๊ณ  ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ ๋ณ€๊ฒฝ

๋™์ž‘ ๋ฐฉ์‹

1. ๋ชจ๋“  ์Šฌ๋กฏ์„ ๋นˆ ์ƒํƒœ๋กœ ์ดˆ๊ธฐํ™”
2. CommandId์˜ SlotIndex ๊ธฐ์ค€์œผ๋กœ ํ•ด๋‹น ์œ„์น˜์— ๋ฐฐ์น˜
3. ๋นˆ ์Šฌ๋กฏ์€ ํ…์ŠคํŠธ/์•„์ด์ฝ˜๋งŒ ์ œ๊ฑฐ

UI ๊ฒฐ๊ณผ

[Move] [Stop] [Attack]
[    ] [    ] [     ]
[    ] [    ] [     ]

5. Provider ๊ณ„์•ฝ ํ™•์žฅ

ํ–ฅํ›„ ๊ธฐ๋Šฅ ํ™•์žฅ์„ ๊ณ ๋ คํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ–ˆ๋‹ค.


์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ

ํ•จ์ˆ˜์—ญํ• 
GetSelectionViewModeSingle / Multi ๊ตฌ๋ถ„
GetPrimaryEntityId๋Œ€ํ‘œ ์„ ํƒ ๋Œ€์ƒ
GetTotalSelectedCount์„ ํƒ ๊ฐœ์ˆ˜
GetSelectionSummaryMulti ์„ ํƒ ์ •๋ณด

์„ค๊ณ„ ์˜๋„

ํ˜„์žฌ๋Š” Mock ๊ธฐ๋ฐ˜์ด์ง€๋งŒ
์‹ค์ œ ๊ฒŒ์ž„ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๊ฒฐํ•ด๋„ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์—†์ด ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ค€๋น„

๊ฒฐ๊ณผ

ํ•ญ๋ชฉ๊ฒฐ๊ณผ
CommandPanelDataTable ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘
SelectionPanelID ๊ธฐ๋ฐ˜ + ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ
UI ๊ตฌ์กฐ๋ฐ์ดํ„ฐ / ํ‘œํ˜„ / ์ถœ๋ ฅ ์™„์ „ ๋ถ„๋ฆฌ
๋ ˆ์ด์•„์›ƒํ•ญ์ƒ ์•ˆ์ •์ ์ธ 9์นธ ๊ตฌ์กฐ ์œ ์ง€
ํ™•์žฅ์„ฑ์‹ค์ œ ๊ฒŒ์ž„ ์‹œ์Šคํ…œ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ ํ™•๋ณด
์œ ์ง€๋ณด์ˆ˜UI ๋ณ€๊ฒฝ ์‹œ ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ๋ฐ์ดํ„ฐ๋งŒ์œผ๋กœ ๋Œ€์‘ ๊ฐ€๋Šฅ

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

  • ์ด๋ฒˆ ์ž‘์—…์€ UI๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
    UI๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ๋™์ž‘ํ•˜๋Š” ๊ตฌ์กฐ ์ž์ฒด๋ฅผ ์ •๋ฆฌ
  • UI๋Š” ๋” ์ด์ƒ ์ƒํƒœ๋ฅผ ์ง์ ‘ ๊ฐ€์ง€์ง€ ์•Š๊ณ ,
    Provider์™€ DataTable์„ ์กฐํ•ฉํ•ด ์ถœ๋ ฅํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ „ํ™˜
profile
๊ฐœ๋ฐœํ•ฉ์‹œ๋‹ค!

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