๐Ÿ“˜TIL - Selection ๊ธฐ๋ฐ˜ ์ปค๋งจ๋“œ ์ปจํ…์ŠคํŠธ ์ •๋ฆฌ์™€ Selection Panel ์ƒ์‚ฐ UI ์—ฐ๋™

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

Unreal ๊ฐœ๋ฐœ

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

๋ฌธ์ œ

์–ด์ œ๊นŒ์ง€๋Š” UI ํ‘œํ˜„ ๊ณ„์ธต์„ ๊ทœ๊ฒฉํ™”ํ•˜๋Š” ์ž‘์—…์ด ์ค‘์‹ฌ์ด์—ˆ๋‹ค.

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

์ด ๊ธฐ์ค€์„ ์„ธ์šฐ๋ฉด์„œ
TopBar, SelectionPanel, CommandPanel, MenuPanel ๊ฐ™์€ ๊ฐ ํŒจ๋„์˜ ์—ญํ• ๊ณผ
ํ‘œํ˜„ ๊ทœ์น™์„ ์ •๋ฆฌํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ–ˆ๋‹ค.

์ฆ‰ ์–ด์ œ์˜ ํ•ต์‹ฌ์€
โ€œ๋™์ž‘ํ•˜๋Š” UI๋ฅผ ์œ ์ง€ ๊ฐ€๋Šฅํ•œ UI๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒโ€์ด์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์˜ค๋Š˜ ์ž‘์—…์œผ๋กœ ๋„˜์–ด์˜ค๋ฉด์„œ ๋ฌธ์ œ๊ฐ€ ๋‹ฌ๋ผ์กŒ๋‹ค.

์ด์ œ๋Š” ํ‘œํ˜„ ๊ณ„์ธต์ด ์•„๋‹ˆ๋ผ
์‹ค์ œ ์„ ํƒ ์ƒํƒœ์™€ ๋ช…๋ น ๊ตฌ์กฐ, ๊ทธ๋ฆฌ๊ณ  ๊ฑด๋ฌผ ์ƒ์‚ฐ ์ƒํƒœ๋ฅผ
UI์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ตฌ์กฐ์ ์ธ ์ถฉ๋Œ์ด ๋“œ๋Ÿฌ๋‚ฌ๋‹ค.

ํŠนํžˆ ์˜ค๋Š˜์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๊ฐ€ ํ•ต์‹ฌ ๋ฌธ์ œ์˜€๋‹ค.

1. ์„ ํƒ ๋Œ€์ƒ ๊ธฐ์ค€ ์ปค๋งจ๋“œ ์ปจํ…์ŠคํŠธ ์‹๋ณ„
2. Selection Panel์—์„œ ๊ฑด๋ฌผ ์ƒ์‚ฐ ์ƒํƒœ ํ‘œํ˜„

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

๊ตฌ๋ถ„๋ฌธ์ œ
์ปค๋งจ๋“œ ํ•ด์„PlayerController๊ฐ€ ๋ชจ๋“  ๋ช…๋ น์„ ์ง์ ‘ ํ•ด์„ํ•˜๋ฉด ํ•˜๋“œ์ฝ”๋”ฉ์ด ๋‹ค์‹œ ๋Š˜์–ด๋‚จ
์„ ํƒ ๋Œ€์ƒ ์ฒ˜๋ฆฌ์œ ๋‹›๊ณผ ๊ฑด๋ฌผ์ด ์„œ๋กœ ๋‹ค๋ฅธ ์ปค๋งจ๋“œ ์ง‘ํ•ฉ์„ ๊ฐ€์ง€๋Š”๋ฐ ์ด๋ฅผ ์–ด๋””์„œ ํŒ๋ณ„ํ• ์ง€ ๊ธฐ์ค€์ด ๋ชจํ˜ธํ–ˆ์Œ
์ปจํ…์ŠคํŠธ ์ „ํ™˜์„ ํƒ๋œ ๋Œ€์ƒ์— ๋”ฐ๋ผ Build, Train, Move, Attack ๊ฐ™์€ ์ปค๋งจ๋“œ ๋ฌถ์Œ์ด ๋‹ฌ๋ผ์ ธ์•ผ ํ–ˆ์Œ
์ƒ์‚ฐ UICommandPanel ์ˆซ์ž ๋ฐฐ์ง€๋งŒ์œผ๋กœ๋Š” ์›ํ•˜๋Š” โ€œ์ƒ์‚ฐ ํโ€ ๋А๋‚Œ์„ ๋งŒ๋“ค๊ธฐ ์–ด๋ ค์› ์Œ
Selection Panel๊ธฐ์กด์—๋Š” ์ด๋ฆ„/ํƒ€์ž…/HP๊นŒ์ง€๋งŒ ํ‘œ์‹œํ•˜๊ณ  ์ƒ์‚ฐ ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•  ๊ตฌ์กฐ๊ฐ€ ์—†์—ˆ์Œ
๋ฐ์ดํ„ฐ ํ๋ฆ„QueueCount, ์ง„ํ–‰๋ฅ , ํ ์•„์ด์ฝ˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋””์„œ ์กฐ๋ฆฝํ•ด UI๋กœ ๋„˜๊ธธ์ง€ ๊ธฐ์ค€์ด ๋ถˆ๋ช…ํ™•ํ–ˆ์Œ

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

์ฒ˜์Œ์—๋Š” PlayerController ์ชฝ์—์„œ ์ž…๋ ฅ๊ณผ ๋ช…๋ น ํ•ด์„์„ ๋งŽ์ด ๋“ค๊ณ  ๊ฐ€๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ •๋ฆฌ๋˜์–ด ์žˆ์—ˆ๋‹ค.

๋Œ€๋žต ํ๋ฆ„์€ ์ด๋Ÿฐ ๋А๋‚Œ์ด์—ˆ๋‹ค.

์ž…๋ ฅ ์ˆ˜์ง‘
-> PlayerController
-> CommandId ๊ฒฐ์ •
-> ์‹คํ–‰

์ด ๊ตฌ์กฐ๋Š” ๋‹จ์ˆœํ•œ ์œ ๋‹› ๋ช…๋ น์—๋Š” ๊ดœ์ฐฎ์•˜์ง€๋งŒ,
์„ ํƒ ๋Œ€์ƒ์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ํ•ด์„ ๊ธฐ์ค€์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ตฌ์กฐ์—๋Š” ์ž˜ ๋งž์ง€ ์•Š์•˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

์„ ํƒ ๋Œ€์ƒ์ด ์œ ๋‹›์ด๋ฉด
-> Move / Attack / Hold

์„ ํƒ ๋Œ€์ƒ์ด ๊ฑด๋ฌผ์ด๋ฉด
-> TrainFootman / TrainArcher / BuildSubMenu

์ด๋ ‡๊ฒŒ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š”๋ฐ๋„
PlayerController๊ฐ€ ์ด๋ฅผ ์ง์ ‘ ๋‹ค ํ’ˆ๊ณ  ์žˆ์œผ๋ฉด
๊ฒฐ๊ตญ ์„ ํƒ ๋Œ€์ƒ๋ณ„ ๋ถ„๊ธฐ์™€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ณ„์† ๋Š˜์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.

์ฆ‰ ๊ธฐ์กด ๊ตฌ์กฐ๋Š”
โ€œ์ž…๋ ฅ์€ ๋ฐ›์ง€๋งŒ, ์„ ํƒ ๋Œ€์ƒ์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๋Š” ๋ช…๋ น ๋ฌธ๋งฅ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํก์ˆ˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœโ€์˜€๋‹ค.


๋ถ„์„

์˜ค๋Š˜ ํ•ต์‹ฌ์€ ์ด๊ฑฐ์˜€๋‹ค.

์ž…๋ ฅ ์ง„์ž…์ ๊ณผ ์ปค๋งจ๋“œ ์˜๋ฏธ ํ•ด์„์€ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค

์ค‘์š”ํ–ˆ๋˜ ๊ฑด
โ€œ์–ด๋–ค ํ‚ค๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ›๋А๋ƒโ€๋ณด๋‹ค
โ€œํ˜„์žฌ ์„ ํƒ๋œ ๋Œ€์ƒ์ด ์–ด๋–ค ์ปค๋งจ๋“œ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๋Š”๊ฐ€โ€์˜€๋‹ค.

์ฆ‰ ์˜ค๋Š˜ ์ •๋ฆฌํ•ด์•ผ ํ–ˆ๋˜ ๊ตฌ์กฐ๋Š”
์ž…๋ ฅ ๊ธฐ์ˆ  ๋ฐฉ์‹ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ
์„ ํƒ ์ƒํƒœ์— ๋”ฐ๋ผ ์ปค๋งจ๋“œ ๋ฌธ๋งฅ์„ ์‹๋ณ„ํ•˜๊ณ 
๊ทธ ๋ฌธ๋งฅ ๊ธฐ์ค€์œผ๋กœ ๋ฐ”์ธ๋”ฉ๊ณผ ํ‘œ์‹œ๋ฅผ ๋งž์ถ”๋Š” ํ๋ฆ„์ด์—ˆ๋‹ค.

์—ญํ• ์„ ๋‹ค์‹œ ์ •๋ฆฌํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋œ๋‹ค.

PlayerController
-> ํ˜„์žฌ ์„ ํƒ ์ƒํƒœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ช…๋ น ๋ผ์šฐํŒ… ์ง„์ž…์  ๋‹ด๋‹น

Selected Unit / Selected Building
-> ์ž์‹ ์ด ๊ฐ€์ง„ ์ปค๋งจ๋“œ ์ปจํ…์ŠคํŠธ ์ œ๊ณต

UIBridge / Provider / Coordinator
-> ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์™€ ์ƒํƒœ๋ฅผ UI์— ๋งž๋Š” ViewModel๋กœ ์กฐ๋ฆฝ

์ฆ‰ ์˜ค๋Š˜์˜ ํ•ต์‹ฌ ํŒ๋‹จ์€ ๋‹ค์Œ์ด์—ˆ๋‹ค.

๋ช…๋ น ์‹คํ–‰ ์ง„์ž…์€ PlayerController
์ปค๋งจ๋“œ ์ปจํ…์ŠคํŠธ ์‹๋ณ„์€ ์„ ํƒ ๋Œ€์ƒ ๊ธฐ์ค€
UI ๋ฐ˜์˜์€ Bridge / Provider / Coordinator

์ด๋ ‡๊ฒŒ ๋‚˜๋ˆ ์•ผ
PlayerController๊ฐ€ ๋‹ค์‹œ ๋น„๋Œ€ํ•ด์ง€๋Š” ๊ฑธ ๋ง‰์„ ์ˆ˜ ์žˆ๊ณ ,
์„ ํƒ ๋Œ€์ƒ๋ณ„ ์ปค๋งจ๋“œ ๋ฌธ๋งฅ๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.


์–ด์ œ ์ž‘์—…๊ณผ์˜ ์—ฐ๊ฒฐ

์–ด์ œ๋Š” ํ‘œํ˜„ ๊ทœ์น™์„ ์ •๋ฆฌํ–ˆ๋‹ค๋ฉด,
์˜ค๋Š˜์€ ๊ทธ ํ‘œํ˜„ ๊ตฌ์กฐ ์œ„์—
์‹ค์ œ ์„ ํƒ ์ƒํƒœ์™€ ๋ช…๋ น ๋ฌธ๋งฅ, ์ƒ์‚ฐ ์ƒํƒœ๋ฅผ ์–น๋Š” ์ž‘์—…์ด์—ˆ๋‹ค.

ํ๋ฆ„์œผ๋กœ ๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ์ด์–ด์ง„๋‹ค.

์–ด์ œ
๋™์ž‘ํ•˜๋Š” UI
-> ๊ทœ๊ฒฉํ™”๋œ UI

์˜ค๋Š˜
๊ทœ๊ฒฉํ™”๋œ UI
-> ์‹ค์ œ ์„ ํƒ ์ƒํƒœ์™€ ์ปค๋งจ๋“œ ๋ฌธ๋งฅ์ด ๋ฐ˜์˜๋˜๋Š” UI

์ฆ‰ ์–ด์ œ์˜ ์ž‘์—…์ด
ํŒจ๋„, ์œ„์ ฏ, ์Šคํƒ€์ผ์˜ ๋ผˆ๋Œ€๋ฅผ ์„ธ์šฐ๋Š” ๋‹จ๊ณ„์˜€๋‹ค๋ฉด,
์˜ค๋Š˜์€ ๊ทธ ๋ผˆ๋Œ€ ์•ˆ์—
์„ ํƒ ๋Œ€์ƒ๋ณ„ ์ƒํƒœ์™€ ์ƒ์‚ฐ ํ ๊ฐ™์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜๋ ค ๋„ฃ๋Š” ๋‹จ๊ณ„์˜€๋‹ค.


ํ•ด๊ฒฐ

1. ์„ ํƒ ๋Œ€์ƒ ๊ธฐ์ค€ ์ปค๋งจ๋“œ ์ปจํ…์ŠคํŠธ ์‹๋ณ„ ๊ตฌ์กฐ ์ •๋ฆฌ

๊ฐ€์žฅ ๋จผ์ € ์ •๋ฆฌํ•œ ๊ฑด
๋ช…๋ น์„ ๋ˆ„๊ฐ€ ํ•ด์„ํ•  ๊ฒƒ์ธ๊ฐ€์˜€๋‹ค.

์˜ค๋Š˜ ๊ธฐ์ค€์œผ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ํ๋ฆ„์€ ์ด๊ฑฐ๋‹ค.

ํ˜„์žฌ ์„ ํƒ ๋Œ€์ƒ ์‹๋ณ„
-> ์„ ํƒ ๋Œ€์ƒ์ด ๊ฐ€์ง„ ์ปค๋งจ๋“œ ์ปจํ…์ŠคํŠธ ์กฐํšŒ
-> ๊ทธ ์ปจํ…์ŠคํŠธ ๊ธฐ์ค€์œผ๋กœ ์ปค๋งจ๋“œ ๋ฐ”์ธ๋”ฉ/ํ‘œ์‹œ

์ฆ‰ ์ค‘์š”ํ•œ ๊ฑด
PlayerController๊ฐ€ TrainFootman, TrainArcher, BuildBarracks ๊ฐ™์€ ๊ฐœ๋ณ„ ๋ช…๋ น์„ ์ง์ ‘ ์•„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,
ํ˜„์žฌ ์„ ํƒ๋œ ์œ ๋‹› ๋˜๋Š” ๊ฑด๋ฌผ์ด
์–ด๋–ค ์ปค๋งจ๋“œ ๊ทธ๋ฃน์„ ๊ฐ€์ง€๋Š”์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ
๋ช…๋ น ์ง‘ํ•ฉ์„ ์–ป์–ด์˜ค๋Š” ๊ตฌ์กฐ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด:

์„ ํƒ๋œ ๋Œ€์ƒ์ด ๋ฐ”๋€œ
-> ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ฐ”๋€œ
-> CommandPanel ํ‘œ์‹œ๊ฐ€ ๋ฐ”๋€œ
-> ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น๋„ ๊ฐ™์ด ๋ฐ”๋€œ

์ด ํ๋ฆ„์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด์–ด์ง„๋‹ค.


2. PlayerController๋Š” ํ•ด์„์ž๊ฐ€ ์•„๋‹ˆ๋ผ ๋ผ์šฐํ„ฐ์— ๊ฐ€๊น๊ฒŒ ์ •๋ฆฌ

์˜ค๋Š˜ ๊ตฌ์กฐ์—์„œ PlayerController๋Š”
๋ชจ๋“  ๋ช…๋ น์˜ ์˜๋ฏธ๋ฅผ ์ง์ ‘ ๋“ค๊ณ  ์žˆ๋Š” ์ฃผ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ
ํ˜„์žฌ ์„ ํƒ ์ƒํƒœ๋ฅผ ๋ณด๊ณ  ์ ์ ˆํ•œ ์ชฝ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ์ง„์ž…์ ์— ๊ฐ€๊น๋‹ค.

์ •๋ฆฌํ•˜๋ฉด ์ด๋Ÿฐ ๋А๋‚Œ์ด๋‹ค.

PlayerController
-> ํ˜„์žฌ ์„ ํƒ ๋Œ€์ƒ ํ™•์ธ
-> ๋Œ€์ƒ์˜ ์ปค๋งจ๋“œ ์ปจํ…์ŠคํŠธ ํ™•์ธ
-> ํ•ด๋‹น ์ปจํ…์ŠคํŠธ ๊ธฐ์ค€์œผ๋กœ ๋ช…๋ น ์š”์ฒญ ์ „๋‹ฌ

์ด ๊ตฌ์กฐ๊ฐ€ ์ข‹์€ ์ด์œ ๋Š” ๋‘ ๊ฐ€์ง€๋‹ค.

์ฒซ ๋ฒˆ์งธ๋Š”
์„ ํƒ ๋Œ€์ƒ๋ณ„ ๋ช…๋ น ๋ถ„๊ธฐ๊ฐ€ PlayerController ๋‚ด๋ถ€ ํ•˜๋“œ์ฝ”๋”ฉ์œผ๋กœ ์Œ“์ด์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด๋‹ค.

๋‘ ๋ฒˆ์งธ๋Š”
์œ ๋‹›, ๊ฑด๋ฌผ, ํ•˜์œ„ ๋นŒ๋“œ ๋ฉ”๋‰ด, ์ƒ์‚ฐ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฌผ ๊ฐ™์€ ๋ฌธ๋งฅ ์ฐจ์ด๋ฅผ
์„ ํƒ ๋Œ€์ƒ์ด ๊ฐ€์ง„ ์ปจํ…์ŠคํŠธ ์ •๋ณด๋กœ ํก์ˆ˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

์ฆ‰ ์ปจํŠธ๋กค๋Ÿฌ๋Š”
์ ์  ๋” โ€œ๋ช…๋ น ์ „๋‹ฌ์žโ€์— ๊ฐ€๊นŒ์›Œ์ง€๊ณ ,
์‹ค์ œ ์˜๋ฏธ ์ฒด๊ณ„๋Š” ์„ ํƒ ๋Œ€์ƒ ์ชฝ์— ๋‚จ๊ฒŒ ๋œ๋‹ค.


3. CommandPanel์€ โ€œํ˜„์žฌ ์ปจํ…์ŠคํŠธ์˜ ๋ช…๋ นโ€, SelectionPanel์€ โ€œํ˜„์žฌ ๋Œ€์ƒ์˜ ์ƒํƒœโ€๋กœ ์—ญํ•  ์žฌ์ •๋ฆฌ

์ฒ˜์Œ์—๋Š” QueueCount๋ฅผ CommandPanel ์ˆซ์ž ๋ฐฐ์ง€๋กœ๋งŒ ๋ณด์—ฌ์ฃผ๋ ค ํ–ˆ๋Š”๋ฐ
์›ํ•˜๋Š” ๋А๋‚Œ๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ์žˆ์—ˆ๋‹ค.

์›ํ•˜๋Š” ํ™”๋ฉด์€ ์˜คํžˆ๋ ค ์ด๋Ÿฐ ๊ตฌ์กฐ์˜€๋‹ค.

Selection Panel
โ”œ Portrait / ์ด๋ฆ„ / ํƒ€์ž… / HP
โ”” Production Strip
   โ”œ ์ƒ์‚ฐ ์ค‘ ํƒ€์ดํ‹€
   โ”œ Progress Bar
   โ”” ํ ์•„์ด์ฝ˜ ๋ชฉ๋ก

์ฆ‰ CommandPanel์€
ํ˜„์žฌ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น ์ง‘ํ•ฉ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ณณ์ด๊ณ ,

SelectionPanel์€
ํ˜„์žฌ ์„ ํƒํ•œ ๋Œ€์ƒ์˜ ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ณณ์ด์–ด์•ผ ํ–ˆ๋‹ค.

์ด ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ ๋ณด๋ฉด ์—ญํ• ์€ ์ด๋ ‡๊ฒŒ ์ •๋ฆฌ๋œ๋‹ค.

CommandPanel
-> ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น ํ‘œ์‹œ

SelectionPanel
-> ํ˜„์žฌ ์„ ํƒ ๋Œ€์ƒ ์ƒํƒœ ํ‘œ์‹œ
-> ๊ฑด๋ฌผ์ด๋ผ๋ฉด ์ƒ์‚ฐ ์ƒํƒœ๊นŒ์ง€ ํฌํ•จ

์ด๋ ‡๊ฒŒ ๋‚˜๋ˆ„๋‹ˆ
์ƒ์‚ฐ ํ UI ์œ„์น˜๋„ ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฌ์›Œ์กŒ๋‹ค.


4. SelectionViewModel์— ์ƒ์‚ฐ ์ƒํƒœ ํ™•์žฅ

๊ธฐ์กด FSelectionViewModel์€
์ด๋ฆ„, ํƒ€์ž…, HP, Portrait, Multi Selection ์š”์•ฝ ์ •๋„๋ฅผ ๋‹ด๊ณ  ์žˆ์—ˆ๋‹ค.

์˜ค๋Š˜์€ ์—ฌ๊ธฐ์—
๊ฑด๋ฌผ ์ƒ์‚ฐ ์ƒํƒœ๋ฅผ ์–น์„ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์กฐ๋ฅผ ํ™•์žฅํ•˜๋Š” ๋ฐฉํ–ฅ์ด ์ •๋ฆฌ๋๋‹ค.

ํ•ต์‹ฌ์€ ๋‹ค์Œ ์„ธ ์ธต์ด๋‹ค.

FProductionQueueItemViewModel
-> ํ ์Šฌ๋กฏ ํ•˜๋‚˜

FBuildingProductionViewModel
-> ์ƒ์‚ฐ ํŒจ๋„ ์ „์ฒด

FSelectionViewModel
-> bShowProductionPanel
-> Production

์ด ๊ตฌ์กฐ๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ ๋Š”
Selection Panel ์œ„์ ฏ์ด ์ƒ์‚ฐ ๋กœ์ง์„ ์ง์ ‘ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์œ„์ ฏ์€ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋งŒ ๊ทธ๋ฆฌ๊ณ ,
์‹ค์ œ ์ƒ์‚ฐ ์ƒํƒœ ์กฐ๋ฆฝ์€ ๋ธŒ๋ฆฌ์ง€ ์ชฝ์—์„œ ๋‹ด๋‹นํ•œ๋‹ค.

์ฆ‰ ํ‘œํ˜„ ๊ณ„์ธต๊ณผ ์ƒํƒœ ์กฐ๋ฆฝ ๊ณ„์ธต์ด ๋‹ค์‹œ ๋ถ„๋ฆฌ๋๋‹ค.


5. Production Queue Item ์œ„์ ฏ ๋ถ„๋ฆฌ

์ƒ์‚ฐ ํ๋Š” ๊ฐœ์ˆ˜๊ฐ€ ๊ณ ์ •์ด ์•„๋‹ˆ๋ผ
์ƒํ™ฉ์— ๋”ฐ๋ผ 0๊ฐœ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ Queue UI๋Š”
์ •์ ์ธ BindWidget ํ•˜๋‚˜๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ตฌ์กฐ๋ณด๋‹ค
๋Ÿฐํƒ€์ž„ ์ƒ์„ฑํ˜• ๊ตฌ์กฐ๊ฐ€ ๋” ์ž์—ฐ์Šค๋Ÿฌ์› ๋‹ค.

ํ˜•ํƒœ๋Š” ์ด๋ ‡๋‹ค.

SelectionPanel
-> ProductionQueueBox

QueueItemWidget
-> ํ ์•„์ด์ฝ˜ ํ•œ ์นธ

์ฆ‰ SelectionPanel์€
ํ ์•„์ดํ…œ ์ž์ฒด๋ฅผ ๊ณ ์ •์œผ๋กœ ๋“ค๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,
ํ•„์š”ํ•œ ๊ฐœ์ˆ˜๋งŒํผ ์ƒ์„ฑํ•ด์„œ HorizontalBox์— ๋ถ™์ด๋Š” ์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ๋งก๋Š”๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด
์ƒ์‚ฐ ํ ์ˆ˜๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ UI ๊ตฌ์กฐ๋ฅผ ์–ต์ง€๋กœ ๊ณ ์ •ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.


6. ์ƒ์‚ฐ ์ƒํƒœ ์กฐ๋ฆฝ์€ UIBridge์—์„œ ๋‹ด๋‹น

Selection Panel์ด ์ง์ ‘ ์ƒ์‚ฐ ์ •๋ณด๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด
ํ‘œํ˜„ ๊ณ„์ธต์ด ๋‹ค์‹œ ๋น„๋Œ€ํ•ด์ง„๋‹ค.

๊ทธ๋ž˜์„œ ์˜ค๋Š˜ ๋ฐฉํ–ฅ์€
์ƒ์‚ฐ ์ƒํƒœ ์กฐ๋ฆฝ์„ TWPlayerUIBridge์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์ชฝ์œผ๋กœ ์ •๋ฆฌ๋๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ ์„ ํƒ ๋Œ€์ƒ์ด ๋ณ‘์˜์ด๋ฉด
๋ธŒ๋ฆฌ์ง€์—์„œ ์ด๋Ÿฐ ์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ ๋‹ค.

- SelectionType = Building
- ViewMode = Single
- ProductionPanel = Visible
- QueueCount ์ฝ๊ธฐ
- Queue ์•„์ด์ฝ˜ ๋ชฉ๋ก ์ƒ์„ฑ
- ProgressBar ๊ฐ’ ์ฑ„์šฐ๊ธฐ

๊ทธ๋ฆฌ๊ณ  ์ด ๊ฒฐ๊ณผ๋ฅผ
SelectionProvider๋ฅผ ํ†ตํ•ด HUDCoordinator๋กœ ๋„˜๊ธฐ๊ฒŒ ๋œ๋‹ค.

์ด ๊ตฌ์กฐ๊ฐ€ ์ข‹์€ ์ด์œ ๋Š”
๋‚˜์ค‘์— ๋ณ‘์˜ ์™ธ์˜ ์ƒ์‚ฐ ๊ฑด๋ฌผ, ์—ฐ๊ตฌ ๊ฑด๋ฌผ, ํŠน์ˆ˜ ๊ตฌ์กฐ๋ฌผ๋กœ ํ™•์žฅํ•˜๋”๋ผ๋„
์œ„์ ฏ์„ ๋œฏ์ง€ ์•Š๊ณ  ์กฐ๋ฆฝ ๋กœ์ง๋งŒ ํ™•์žฅํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


7. CommandPanel์˜ QueueCount๋Š” ๋ณด์กฐ ์ •๋ณด๋กœ ์œ ์ง€

Selection Panel ์ชฝ ์ƒ์‚ฐ UI๊ฐ€ ๋ฉ”์ธ์ด ๋˜๋”๋ผ๋„
๊ธฐ์กด CommandPanel์˜ QueueCount ์ •๋ณด๋Š” ์™„์ „ํžˆ ๋ฒ„๋ฆด ํ•„์š”๋Š” ์—†์—ˆ๋‹ค.

๋Œ€์‹  ์ด๊ฑด ๋ฉ”์ธ ํ‘œํ˜„์ด ์•„๋‹ˆ๋ผ
๋ณด์กฐ ์ง€ํ‘œ ์ •๋„๋กœ ๋‘๋Š” ๊ฒŒ ๋งž์•˜๋‹ค.

ํ๋ฆ„์€ ์ด๋ ‡๊ฒŒ ์ •๋ฆฌ๋œ๋‹ค.

Bridge
-> RuntimeCommandQueueCount ์„ค์ •

SelectionProvider
-> RuntimeCommandQueueCountMap ์ €์žฅ

HUDCoordinator
-> CommandSlotViewModel ์ƒ์„ฑ ์‹œ QueueCount ์ฃผ์ž…

์ฆ‰ ๋ฉ”์ธ ์ƒ์‚ฐ ์ƒํƒœ๋Š” Selection Panel์ด ๋‹ด๋‹นํ•˜๊ณ ,
CommandPanel์€ ํ˜„์žฌ ๋ช…๋ น ์Šฌ๋กฏ์— ๋Œ€ํ•œ ๋ณด์กฐ ์ƒํƒœ๋งŒ ๊ฐ€๋ณ๊ฒŒ ๋ฐ˜์˜ํ•˜๋Š” ๊ตฌ์กฐ๋‹ค.


8. ์˜ค๋Š˜ ์ž‘์—…์—์„œ ๋“œ๋Ÿฌ๋‚œ ํ•ต์‹ฌ ํฌ์ธํŠธ

์˜ค๋Š˜์€ ๋‹จ์ˆœํžˆ ์œ„์ ฏ์„ ์ถ”๊ฐ€ํ•œ ๋‚ ์ด ์•„๋‹ˆ์—ˆ๋‹ค.

์‹ค์ œ๋กœ๋Š” ์•„๋ž˜ ์„ธ ๊ฐ€์ง€๋ฅผ ๋งž์ถ”๋Š” ์ž‘์—…์— ๊ฐ€๊นŒ์› ๋‹ค.

1) ์„ ํƒ ์ƒํƒœ์™€ ๋ช…๋ น ๋ฌธ๋งฅ ์—ฐ๊ฒฐ

๋ฌด์—‡์ด ์„ ํƒ๋˜์—ˆ๋Š”๊ฐ€
-> ์–ด๋–ค ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๋Š”๊ฐ€
-> ์–ด๋–ค ๋ช…๋ น์„ ๋ณด์—ฌ์ค„ ๊ฒƒ์ธ๊ฐ€

2) ์„ ํƒ ๋Œ€์ƒ ์ƒํƒœ์™€ UI ์—ฐ๊ฒฐ

๊ฑด๋ฌผ์ด ์„ ํƒ๋˜์—ˆ๋Š”๊ฐ€
-> ์ƒ์‚ฐ ์ƒํƒœ๊ฐ€ ์žˆ๋Š”๊ฐ€
-> Selection Panel์— ์–ด๋–ป๊ฒŒ ๋ณด์ผ ๊ฒƒ์ธ๊ฐ€

3) ViewModel ์กฐ๋ฆฝ ๊ฒฝ๋กœ ์ •๋ฆฌ

์„ ํƒ ๋Œ€์ƒ ์ƒํƒœ
-> Bridge
-> Provider
-> Coordinator
-> Widget

์ฆ‰ ์˜ค๋Š˜์˜ ํ•ต์‹ฌ์€
์ž…๋ ฅ ๊ธฐ์ˆ  ์ž์ฒด๋ณด๋‹ค๋„
โ€œ์„ ํƒ ์ƒํƒœ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปค๋งจ๋“œ์™€ UI๋ฅผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐํ•  ๊ฒƒ์ธ๊ฐ€โ€๋ฅผ ๊ตฌ์กฐํ™”ํ•œ ๋ฐ ์žˆ์—ˆ๋‹ค.


๊ฒฐ๊ณผ

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

์ •๋ฆฌํ•˜๋ฉด:

์„ ํƒ ๋Œ€์ƒ ์‹๋ณ„
-> ์ปค๋งจ๋“œ ์ปจํ…์ŠคํŠธ ๊ฒฐ์ •

์ปค๋งจ๋“œ ์ปจํ…์ŠคํŠธ
-> CommandPanel ๋ช…๋ น ๊ตฌ์„ฑ

๊ฑด๋ฌผ ์ƒํƒœ
-> Production ์ •๋ณด ์ƒ์„ฑ

UIBridge
-> SelectionViewModel์— ์ƒ์‚ฐ ์ƒํƒœ ์กฐ๋ฆฝ

SelectionPanel
-> ProgressBar + Queue ์•„์ด์ฝ˜ ํ‘œ์‹œ

์ฆ‰ ์ง€๊ธˆ์€ ์ ์–ด๋„
โ€œ๋ฌด์—‡์„ ์„ ํƒํ–ˆ๋Š”๊ฐ€์— ๋”ฐ๋ผ ์–ด๋–ค ๋ช…๋ น์ด ๋ณด์ด๊ณ ,
๊ฑด๋ฌผ์ด๋ผ๋ฉด ํ˜„์žฌ ์ƒ์‚ฐ ์ƒํƒœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ผ ๊ฒƒ์ธ๊ฐ€โ€๋ฅผ
๊ฐ™์€ ๊ตฌ์กฐ ์•ˆ์—์„œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€๊นŒ์ง€๋Š” ์™”๋‹ค.


Before

๋ช…๋ น ํ•ด์„ ๊ธฐ์ค€์ด PlayerController ์ชฝ์œผ๋กœ ๋งŽ์ด ์ ๋ ค ์žˆ์—ˆ์Œ
Selection Panel์€ ๊ธฐ๋ณธ ์ •๋ณด๋งŒ ํ‘œ์‹œ
์ƒ์‚ฐ ํ๋Š” CommandPanel ์ˆซ์ž ๋ฐฐ์ง€ ์ˆ˜์ค€
์„ ํƒ ๋Œ€์ƒ๊ณผ UI ๋ช…๋ น ๋ฌธ๋งฅ ์—ฐ๊ฒฐ์ด ์•ฝํ–ˆ์Œ

After

์„ ํƒ ๋Œ€์ƒ ๊ธฐ์ค€ ์ปค๋งจ๋“œ ์ปจํ…์ŠคํŠธ ์‹๋ณ„ ๊ตฌ์กฐ ์ •๋ฆฌ
PlayerController๋Š” ๋ผ์šฐํ„ฐ์— ๊ฐ€๊น๊ฒŒ ์—ญํ•  ์ •๋ฆฌ
Selection Panel ๋‚ด๋ถ€ ์ƒ์‚ฐ UI ์ถ”๊ฐ€
Queue / ์ง„ํ–‰๋„ / ํ ์•„์ด์ฝ˜ ํ‘œ์‹œ ๊ตฌ์กฐ ํ™•๋ณด
Bridge / Provider / Coordinator ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ณด๊ฐ•

๋น„๊ต

ํ•ญ๋ชฉ์ด์ „์ดํ›„
๋ช…๋ น ํ•ด์„ ๊ธฐ์ค€PlayerController ์ค‘์‹ฌ์„ ํƒ ๋Œ€์ƒ ์ปจํ…์ŠคํŠธ ์ค‘์‹ฌ
CommandPanel ์—ญํ• ๋ช…๋ น + ์ƒํƒœ ์ผ๋ถ€ ํ˜ผ์žฌํ˜„์žฌ ์ปจํ…์ŠคํŠธ์˜ ๋ช…๋ น ํ‘œ์‹œ
SelectionPanel ์—ญํ• ๊ธฐ๋ณธ ์ •๋ณด ํ‘œ์‹œ๋Œ€์ƒ ์ƒํƒœ + ์ƒ์‚ฐ ์ƒํƒœ ํ‘œ์‹œ
ํ ํ‘œํ˜„QueueCount ์ˆซ์ž์ง„ํ–‰๋ฐ” + ํ ์•„์ด์ฝ˜
๊ตฌ์กฐ ์•ˆ์ •์„ฑ์ปจํ…์ŠคํŠธ ์—ฐ๊ฒฐ ๊ธฐ์ค€์ด ์•ฝํ•จ์„ ํƒ ์ƒํƒœ ๊ธฐ์ค€ ํ๋ฆ„ ์ •๋ฆฌ

1. ํ•ต์‹ฌ์€ ์ž…๋ ฅ ๋ฐฉ์‹๋ณด๋‹ค ์„ ํƒ ๋Œ€์ƒ์˜ ์ปค๋งจ๋“œ ๋ฌธ๋งฅ์ด์—ˆ๋‹ค

์˜ค๋Š˜ ๋‹ค์‹œ ์ •๋ฆฌํ•ด ๋ณด๋‹ˆ
์ค‘์š”ํ–ˆ๋˜ ๊ฑด ํŠน์ • ์ž…๋ ฅ ๊ธฐ์ˆ ์„ ํ™•์ •ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ
ํ˜„์žฌ ์„ ํƒ๋œ ๋Œ€์ƒ์ด ์–ด๋–ค ๋ช…๋ น ๋ฌธ๋งฅ์„ ๊ฐ€์ง€๋Š”์ง€๋ฅผ ๋จผ์ € ๊ตฌ์กฐํ™”ํ•˜๋Š” ์ผ์ด์—ˆ๋‹ค.

์ฆ‰ ๊ธฐ์ค€์€ ์ด๊ฑฐ๋‹ค.

์„ ํƒ ๋Œ€์ƒ์ด ๋ฌด์—‡์ธ๊ฐ€
-> ์–ด๋–ค ์ปค๋งจ๋“œ ์ง‘ํ•ฉ์„ ๊ฐ€์ง€๋Š”๊ฐ€
-> UI์™€ ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ ์–ด๋–ป๊ฒŒ ๋งž์ถœ ๊ฒƒ์ธ๊ฐ€

์ด ๊ธฐ์ค€์ด ๋จผ์ € ์„œ์•ผ
๋‚˜์ค‘์— ์ž…๋ ฅ ์ง„์ž…์ ์„ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋“ 
์ „์ฒด ๊ตฌ์กฐ๊ฐ€ ํ”๋“ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.


2. ์ƒ์‚ฐ ํ๋Š” Selection Panel ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฒŒ ๋งž์•˜๋‹ค

CommandPanel = ๋ช…๋ น
SelectionPanel = ํ˜„์žฌ ๋Œ€์ƒ ์ƒํƒœ

์ด ๊ธฐ์ค€์œผ๋กœ ๋ณด๋‹ˆ๊นŒ
์ƒ์‚ฐ ํ๋Š” CommandPanel ์ˆซ์ž ๋ฐฐ์ง€๋กœ ๋ฒ„ํ‹ฐ๋Š” ๊ฒƒ๋ณด๋‹ค
Selection Panel ์•ˆ์—์„œ ํ˜„์žฌ ๊ฑด๋ฌผ ์ƒํƒœ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒŒ ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฌ์› ๋‹ค.


3. UI๋Š” ๊ฒฐ๊ตญ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋จผ์ € ์ •๋ฆฌ๋ผ์•ผ ํ–ˆ๋‹ค

์˜ค๋Š˜๋„ ๋‹ค์‹œ ๋А๋‚€ ๊ฑด
์œ„์ ฏ๋งŒ ์†๋ณธ๋‹ค๊ณ  ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์ด์—ˆ๋‹ค.

๊ฒฐ๊ตญ ๊ฐ™์ด ๋งž์ถฐ์•ผ ํ–ˆ๋˜ ๊ฑด:

SelectionViewModel
ProductionViewModel
Provider runtime data
Coordinator ์กฐ๋ฆฝ ๊ตฌ์กฐ

์ฆ‰ ์˜ค๋Š˜ ์ž‘์—…์˜ ํ•ต์‹ฌ์€
์œ„์ ฏ ์ถ”๊ฐ€๋ณด๋‹ค๋„
๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””์„œ ๋งŒ๋“ค์–ด์ง€๊ณ  ์–ด๋””๋กœ ํ˜๋Ÿฌ๊ฐ€๋Š”์ง€๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ฐ ๋” ๊ฐ€๊นŒ์› ๋‹ค.


์ „์ฒด ํ๋ฆ„

์„ ํƒ ๋Œ€์ƒ ๋ณ€๊ฒฝ
-> ์ปค๋งจ๋“œ ์ปจํ…์ŠคํŠธ ์‹๋ณ„
-> CommandPanel ๋ช…๋ น ๊ฐฑ์‹ 

๊ฑด๋ฌผ ์„ ํƒ ์ƒํƒœ
-> ์ƒ์‚ฐ ์ƒํƒœ ์กฐํšŒ
-> UIBridge
-> SelectionProvider
-> HUDCoordinator
-> SelectionPanel ๊ฐฑ์‹ 

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

  • ์–ด์ œ๋Š” UI๋ฅผ ๊ทœ๊ฒฉํ™”ํ•˜๊ณ  ํ‘œํ˜„ ๊ณ„์ธต์„ ์ •๋ฆฌํ•˜๋Š” ๋‹จ๊ณ„์˜€๋‹ค.
  • ์˜ค๋Š˜์€ ๊ทธ ๊ตฌ์กฐ ์œ„์— ์„ ํƒ ์ƒํƒœ, ์ปค๋งจ๋“œ ๋ฌธ๋งฅ, ์ƒ์‚ฐ ํ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋‹จ๊ณ„์˜€๋‹ค.
  • ํŠนํžˆ ์„ ํƒ๋œ ์œ ๋‹›/๊ฑด๋ฌผ ๊ธฐ์ค€์œผ๋กœ ์ปค๋งจ๋“œ ์ปจํ…์ŠคํŠธ๋ฅผ ์‹๋ณ„ํ•˜๊ณ , Selection Panel์— ์ƒ์‚ฐ UI๋ฅผ ๋ถ™์ด๋ฉด์„œ, โ€œํ˜„์žฌ ์„ ํƒ ๋Œ€์ƒ์— ๋”ฐ๋ผ ๋ช…๋ น๊ณผ ์ƒํƒœ๊ฐ€ ํ•จ๊ป˜ ๋ฐ”๋€Œ๋Š” ๊ตฌ์กฐโ€๋ฅผ ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.
profile
๊ฐœ๋ฐœํ•ฉ์‹œ๋‹ค!

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