Modular and Scalable UI systems

๊น€์—ฌ์šธยท2025๋…„ 11์›” 12์ผ

๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

๋ชฉ๋ก ๋ณด๊ธฐ
114/139

How to create Modular and Scalable UI systems in Unreal Engine

[ ๋ชจ๋“ˆํ™” ๋ฐ ํ™•์žฅ์„ฑ ]

1. Iterate on UI Design Faster โ€“ UI ๋””์ž์ธ์„ ๋” ๋น ๋ฅด๊ฒŒ ๋ฐ˜๋ณตํ•˜๊ธฐ

๐Ÿ’ก Base Reusable Widgets(์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์œ„์ ฏ) ์ƒ์„ฑํ•˜๊ธฐ

๊ณตํ†ต์ ์œผ๋กœ ์“ฐ์ด๋Š” ์œ„์ ฏ ์ƒ์„ฑ

WBP_BaseBorder / WBP_BaseButton / WBP_BasePanel / WBP_BaseText ๋“ฑ

Instance Editable, Pre-Construct ์—ฐ๋™

  • Instance Editable : ์—๋””ํ„ฐ์—์„œ ๊ฐœ๋ณ„ ๊ฐ์ฒด๋งˆ๋‹ค ๋ณ€์ˆ˜ ๊ฐ’์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜
  • Pre Construct์—์„œ โ€œ์ดˆ๊ธฐ ๋น„์ฃผ์–ผ ์ƒํƒœโ€๋ฅผ ์ธ์Šคํ„ด์Šค๋ณ„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์„ธํŒ…
    • ๋””์ž์ธ ํƒ€์ž„: ์œ„์ ฏ ๋ทฐํฌํŠธ ๋ฏธ๋ฆฌ๋ณด๊ธฐยท๋””ํ…Œ์ผ ๋ณ€๊ฒฝ ์‹œ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ๋จ
      โ†’ ์—๋””ํ„ฐ์—์„œ ์‹ค์ œ์ฒ˜๋Ÿผ ๋ฏธ๋ฆฌ๋ณด๋Š” ์šฉ๋„
    • ๋Ÿฐํƒ€์ž„: ์œ„์ ฏ ์ƒ์„ฑ ์งํ›„, Construct ์ „์— 1ํšŒ ํ˜ธ์ถœ
      โ†’ ์• ๋‹ˆ๋ฉ”์ด์…˜/๋ ˆ์ด์•„์›ƒ ์ดˆ๊ธฐ๊ฐ’ ์„ธํŒ…

โ‡’ ์ „์ฒด ํ”„๋กœ์ ํŠธ ์ƒ‰์ƒ ๋ณ€๊ฒฝ ๋“ฑ์„ ๋‹จ์ผ ํด๋ฆญ์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

2. Avoid Duplicating Widgets โ€“ ์œ„์ ฏ ์ค‘๋ณต ์ƒ์„ฑ์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•

๐Ÿ’กํ…œํ”Œ๋ฆฟํ™”๋ฅผ ์œ„ํ•œ Named Slots ์‚ฌ์šฉํ•˜๊ธฐ

Named Slot

  • ๋ถ€๋ชจ ์œ„์ ฏ์ด ์ž์‹ ์œ„์ ฏ์ด ๋“ค์–ด์˜ฌ ์ž๋ฆฌ๋ฅผ ์ด๋ฆ„์œผ๋กœ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ตฌ์กฐ โ†’ ์ด ์œ„์ ฏ์˜ ํŠน์ • ์œ„์น˜์— ๋‚˜์ค‘์— ๋‹ค๋ฅธ ์œ„์ ฏ์„ ๊ฝ‚์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์Šฌ๋กฏ
    โ†’ ํ…œํ”Œ๋ฆฟ ์œ„์ ฏ์— โ€œ์ด ๋ถ€๋ถ„์€ ๋‚˜์ค‘์— ๋‹ค๋ฅธ ์ฝ˜ํ…์ธ ๋กœ ๊ต์ฒดํ•  ์ž๋ฆฌโ€ ํ‘œ์‹œ
  • ๋ถ€๋ชจ ์œ„์ ฏ (๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ, ์นด๋“œ, ๋ฒ„ํŠผ ๋“ฑ ์žฌ์‚ฌ์šฉ ์œ„์ ฏ)์—์„œ ์‚ฌ์šฉ

NameSlot vs UserWidget ์ƒ์† ์ฐจ์ด

๋น„๊ต ํ•ญ๋ชฉNamed Slot์ƒ์†
๊ตฌ์กฐ์Šฌ๋กฏ์œผ๋กœ ์ฑ„์›Œ๋„ฃ๊ธฐ๋ถ€๋ชจ ์ž์‹ ํด๋ž˜์Šค ๊ด€๊ณ„
๋ชฉ์ UI ์กฐ๋ฆฝ/์กฐํ•ฉ๊ธฐ๋Šฅ ํ™•์žฅ
๋Ÿฐํƒ€์ž„ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ (SetContent ๋“ฑ)๋ถˆ๊ฐ€๋Šฅ (ํด๋ž˜์Šค ๋ณ€๊ฒฝ ํ•„์š”)
์žฌ์‚ฌ์šฉ์„ฑ๋†’์Œ๋‚ฎ์Œ
์ฝ”๋“œ ์˜ํ–ฅ๊ฑฐ์˜ ์—†์Œ๋ถ€๋ชจ ํ•จ์ˆ˜ ๊ตฌ์กฐ ์˜ํ–ฅ ๋ฐ›์Œ

๋Ÿฐํƒ€์ž„ ์ค‘์— ์Šฌ๋กฏ ์•ˆ์˜ ๋‚ด์šฉ ๋ฐ”๊พธ๊ณ  ์‹ถ์œผ๋ฉด?

MyNamedSlot->SetContent(MyWidgetInstance);

๋˜๋Š”

BP์—์„œ `Set Content` ๋…ธ๋“œ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด ์ž์‹ ์œ„์ ฏ์œผ๋กœ ๊ต์ฒด ๊ฐ€๋Šฅ

3. Manage UI Panels and Popups โ€“ ํŒจ๋„๊ณผ ํŒ์—… ๊ด€๋ฆฌ

๐Ÿ’กํ™”๋ฉด ๋ฐ ํŒจ๋„ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋‹ค๋ฅธ ๋ ˆ์ด์–ด ์‚ฌ์šฉํ•˜๊ธฐ

โ†’ ์ธ๋ฒคํ† ๋ฆฌ ํ™”๋ฉด ๋‚˜์˜ค๊ณ  ํ€˜์ŠคํŠธ ํ™”๋ฉด ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์œ„์ ฏ์„ ์ˆจ๊ธฐ๊ณ  ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•ด์•ผ ํ•จ

Layer๋Š” ์œ„์ ฏ์˜ ์Šคํƒ, ์œ„์ ฏ์„ ์Šคํƒ์— Pop / Push ๊ฐ€๋Šฅ

๋ ˆ์ด์–ด ์ข…๋ฅ˜

  • Game Layer : HUD, ํ•ญ์ƒ ๋ณด์ด๋Š” ์œ„์ ฏ
  • Game Menu Layer : ์ธ๋ฒคํ† ๋ฆฌ, ํ€˜์ŠคํŠธ ๋“ฑ ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด ๋ฉ”๋‰ด
  • Menu Layer : ์ผ์‹œ์ค‘์ง€, ์„ค์ • ๋“ฑ ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด์™€ ๋ฌด๊ด€ํ•œ ๋ฉ”๋‰ด
  • Modal Layer : ํŒ์—…, ๋Œ€ํ™” ์ƒ์ž

UI Manager๊ฐ€ ๋ ˆ์ด์–ด๋ฅผ ์บก์Аํ™”ํ•˜๊ณ  ๊ธฐ๋Šฅ ๋…ธ์ถœ

Monolithic (๋‹จ์ผํ˜•) ๋งˆ์Šคํ„ฐ ์œ„์ ฏ ๋ฐฉ์ง€, ์œ„์ ฏ ๊ฐ„ ์ƒํ˜ธ ์ฐธ์กฐ ์ œ๊ฑฐ

  • ์œ„์ ฏ์ด ์„œ๋กœ ์•Œ์ง€ ๋ชปํ•ด๋„ ์œ„์ ฏ์„ ์ƒ์„ฑ / ์ œ๊ฑฐ ๊ฐ€๋Šฅ
  • ์ƒˆ ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์ด ์—†์Œ

4. Decouple Gameplay and UI Communication โ€“ ๊ฒŒ์ž„๋กœ์ง๊ณผ UI ํ†ต์‹  ๋ถ„๋ฆฌ

๐Ÿ’ก๋ฐ์ดํ„ฐ๋ฅผ ๋ณ„๋„์˜ Objects์— ๋„ฃ๊ธฐ โ†’ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด ๋ถ„๋ฆฌ (View Models)

ํ•จ์ˆ˜๋กœ ๋ฐ”์ธ๋”ฉํ•˜๋ฉด ๊ฐ„๋‹จํ•˜์ง€๋งŒ,

  1. ๋งค ํ”„๋ ˆ์ž„ ๋งˆ๋‹ค ํ•„์š”์—†์–ด๋„ ํ˜ธ์ถœ๋จ
  2. ๋ฌด๊ธฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐ๊ธˆ์”ฉ ์กฐ์ •ํ•  ๋•Œ ๋ฌด๊ธฐ ์ปดํฌ๋„ŒํŠธ์— ๊ณ„์† ์—ฐ๊ฒฐ๋œ๋‹ค

UMG Viewmodel ํ”Œ๋Ÿฌ๊ทธ์ธ

  1. View Model ์ž์‹ ํด๋ž˜์Šค ์ƒ์„ฑ ๋ฐ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
  2. ์ฝ”๋“œ์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒ โ†’ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ
  3. UI๋Š” ๋ทฐ ๋ชจ๋ธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ˆ˜์‹  โ†’ ์œ„์ ฏ์„ ์—…๋ฐ์ดํŠธํ•จ

โ†’ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ UI๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ์•„๋ฌด๊ฒƒ๋„ ์†์ƒ๋˜์ง€ ์•Š์Œ

[ UI ์ตœ์ ํ™” ]

5. Reduce UI Draw Calls โ€“ Draw Call ์ตœ์†Œํ™”ํ•˜๊ธฐ

๐Ÿ’กUI ๋ฌดํšจํ™” ํ•˜๊ธฐ

  1. Function / Property Binding ๋Œ€์‹  ์ด๋ฒคํŠธ ์‚ฌ์šฉํ•˜๊ธฐ
  2. ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์œ„์ ฏ์„ ์บ์‹ฑ
    โ†’ ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ๋ ˆ์ด์•„์›ƒ์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๋Œ€์‹  ์บ์‹ฑ๋œ ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉ
    (์˜ˆ) Health Bar๋Š” ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ๊ทธ๋ ค์งˆ ํ•„์š”๊ฐ€ ์—†์Œ 
    
    โ†’ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ํ”ผํ•ด๋ฅผ ์ž…์„ ๋•Œ๋งŒ ์—…๋ฐ์ดํŠธ
  3. ์บ์‹ฑํ•˜๊ธฐ ์œ„ํ•ด Invalidation Box๋กœ ๊ฐ์‹ธ๊ธฐ โ†’ ์œ„์ ฏ ์†์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ ˆ์ด์•„์›ƒ์„ ์บ์‹ฑํ•˜๊ณ  ์—…๋ฐ์ดํŠธ

โ†’ ํˆฌ๋ช…๋„ยท๋จธํ‹ฐ๋ฆฌ์–ผยท์ค‘์ฒฉ ์ตœ์†Œํ™”๋กœ ๋ Œ๋”๋ง ํšจ์œจ ๊ฐœ์„ 

6. Best Way for UI Animations โ€“ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ UI ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฉ์‹

๐Ÿ’ก๋จธํ‹ฐ๋ฆฌ์–ผ์„ ์‚ฌ์šฉํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‚ฌ์šฉํ•˜๊ธฐ

ํ˜ธ๋ฒ„ ์‹œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ํ•„์š”

โ†’ ์ผ๋ฐ˜์ ์œผ๋กœ ์‹œํ€€์„œ๋ฅผ ํ†ตํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋งŒ๋“ฆ

โ†’ ๋งค์šฐ ์ œํ•œ์ ์ด๊ณ  CPU์—์„œ ์‹คํ–‰๋จ

Sequencer ๋Œ€์‹  Material Instances ์‚ฌ์šฉ

  1. GPU์—์„œ ์‹คํ–‰ โ†’ ๋ณต์žกํ•œ ๊ณ„์‚ฐ ์ฒ˜๋ฆฌ
  2. ๊ณ ๊ธ‰ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฐ€๋Šฅ (์œ„์ ฏ์ด๋‚˜ ํ…์Šค์ณ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐ˜๋ณต(loop), ํŒŒํ‹ฐํด, ๊ธ€๋กœ์šฐ)
  3. Invalidation Box์˜ ๋ ˆ์ด์•„์›ƒ ๋ฌดํšจํ™” ์˜ˆ์™ธ ์ ์šฉ
    1. ๋จธํ‹ฐ๋ฆฌ์–ผ ์—†์ด ์• ๋‹ˆ๋ฉ”์ด์…˜๋œ ์œ„์ ฏ โ†’ ๋ฌดํšจํ™” โญ•
    2. ๋จธํ‹ฐ๋ฆฌ์–ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜๋œ ์œ„์ ฏ โ†’ ๋ฌดํšจํ™” โŒ

7. Create & Remove Widgets vs Hide & Show

โ€“ ์ƒ์„ฑ/์ œ๊ฑฐ vs ์ˆจ๊น€/ํ‘œ์‹œ

๐Ÿ’ก๊ตฌ์„ฑ(Construction) ๋‹จ๊ณ„์—์„œ ์œ„์ ฏ๋“ค์„ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ๋‚˜๋ˆ„๊ธฐ

โ†’ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ „๋žต ์„ ํƒํ•˜๊ธฐ

  • Create / Remove
  • Hide / Show
  1. ๋น ๋ฅธ ์‘๋‹ต์ด ํ•„์š”ํ•œ ์œ„์ ฏ (์ธ๋ฒคํ† ๋ฆฌ) : ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋กœ๋“œ๋œ ์ƒํƒœ ์œ ์ง€ํ•˜์ง€๋งŒ ์ˆจ๊น€ ์ฒ˜๋ฆฌ
  2. ์˜ค๋ž˜ ํ‘œ์‹œ๋˜์ง€ ์•Š๊ณ  ๋น ๋ฅธ ์‘๋‹ต ๋ถˆํ•„์š” : ๋Ÿฐํƒ€์ž„์— ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๊ณ  ํ•ด์ œํ•  ๋•Œ ์ œ๊ฑฐ
  3. WidgetSwithcer๋กœ ์—ฌ๋Ÿฌ ์œ„์ ฏ(์ธ๋ฒคํ† ๋ฆฌ, ํ€˜์ŠคํŠธ ๋“ฑ)์„ ํ•˜๋‚˜์˜ ์œ„์ ฏ์— ๋•Œ๋ ค๋„ฃ๊ธฐ


8. Collapsed vs Hidden โ€“ Collapsed์™€ Hidden์˜ ์ฐจ์ด

๐Ÿ’กHidden ๋Œ€์‹  Collapsed ์‚ฌ์šฉํ•˜๊ธฐ

โ†’ ์™„์ „ํžˆ ๋ฌด์‹œํ•˜๋Š” ์œ ์ผํ•œ ์˜ต์…˜

Visibility ๊ฐ’ํ™”๋ฉด ํ‘œ์‹œ์ž…๋ ฅ๋ ˆ์ด์•„์›ƒ์„ค๋ช…
Hidden์•ˆ ๋ณด์ž„๋ถˆ๊ฐ€๋Šฅ๊ณต๊ฐ„ ์ฐจ์ง€์•ˆ ๋ณด์ด์ง€๋งŒ ์ž๋ฆฌ ์œ ์ง€
Collapsed์•ˆ ๋ณด์ž„๋ถˆ๊ฐ€๋Šฅ๊ณต๊ฐ„ ์ œ๊ฑฐ์กด์žฌํ•˜์ง€๋งŒ ์™„์ „ํžˆ ์ˆจ๊น€ ์ฒ˜๋ฆฌ
**Hidden** โ†’ ๋ˆˆ์—๋Š” ์•ˆ ๋ณด์ด์ง€๋งŒ, ๊ทธ ์ž๋ฆฌ์— ๋นˆ ๊ณต๊ฐ„์ด ๋‚จ์Œ (ํˆฌ๋ช… ๋งํ† )
[ Button A ]
[          ] โ† ๊ณต๊ฐ„ ์œ ์ง€
[ Button C ]

**Collapsed** โ†’ ๊ทธ ์ž๋ฆฌ ์ž์ฒด๊ฐ€ ์‚ฌ๋ผ์ง (C๊ฐ€ ์œ„๋กœ ๋ถ™์Œ)
[ Button A ]
[ Button C ]

9. Not Hit Testable vs Visible โ€“ ํžˆํŠธํ…Œ์ŠคํŠธ ๋น„ํ™œ์„ฑ vs ํ‘œ์‹œ ์ƒํƒœ

โ†’ ํด๋ฆญ ๊ฐ์ง€ยท์ธํ„ฐ๋ž™์…˜ ์ œ์–ด ๊ตฌ๋ถ„ํ•˜๊ธฐ

๐Ÿ’กVisible ๋Œ€์‹  Not Hit Testable ์‚ฌ์šฉํ•˜๊ธฐ

Visibility ๊ฐ’ํ™”๋ฉด ํ‘œ์‹œํด๋ฆญ๋ ˆ์ด์•„์›ƒ์„ค๋ช…
Visible๋ณด์ž„๊ฐ€๋Šฅํฌํ•จ๋ณด์ด๊ณ  ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅ
Not Hit Testable๋ณด์ž„๋ถˆ๊ฐ€ํฌํ•จ๋ณด์ด์ง€๋งŒ ์ž…๋ ฅ ๋ฌด์‹œ

์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์œ„์ ฏ์— Not Hit Testable ์ ์šฉ

Not Hit Testable

  • Hit Test ๊ณ„์‚ฐ์„ ์ƒ๋žตํ•ด!
  • ๋ณด์ด๊ธด ํ•˜์ง€๋งŒ ํด๋ฆญ ๊ฐ์ง€ ์˜์—ญ์— ํฌํ•จ๋˜์ง€ ์•Š์Œ โ†’ ์ปค์„œ ๊ฐ์ง€/ํด๋ฆญ ์ฒดํฌ ์—ฐ์‚ฐ์ด ์™„์ „ํžˆ ์ƒ๋žต๋จ โ†’ ์„ฑ๋Šฅ ์ด๋“ ๋ฐœ์ƒ
  • ์žฅ์‹์šฉ UI, Text, Border, Icon, Overlay ๋“ฑ์— ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Œ

ํžˆํŠธ ํ…Œ์ŠคํŠธ (Hit Test)

๋งˆ์šฐ์Šค ์ปค์„œ(ํ„ฐ์น˜)๊ฐ€ ์–ด๋–ค ์œ„์ ฏ ์œ„์— ์žˆ๋Š”๊ฐ€?

๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ๋ชจ๋“  Visible ์œ„์ ฏ๋“ค์˜ ์‚ฌ๊ฐ ์˜์—ญ์„ ๊ฒ€์‚ฌํ•˜๊ณ 
์–ด๋–ค ์œ„์ ฏ์ด ํด๋ฆญ/ํ˜ธ๋ฒ„๋ฅผ ๋ฐ›์•„์•ผ ํ• ์ง€ Hit Test Grid๋ผ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ๊ด€๋ฆฌํ•จ

โ†’ ๋ฒ„ํŠผ ๊ฐ™์€ ํด๋ฆญ์ด ํ•„์š”ํ•œ ์œ„์ ฏ์—๋งŒ ํ•„์š”

โ†’ ์žฅ์‹์šฉ ์ด๋ฏธ์ง€๋‚˜ ํ…์ŠคํŠธ๊นŒ์ง€ ์ „๋ถ€ ๊ฒ€์‚ฌํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ ๋‚ญ๋น„ ์ƒ๊น€

Visibility

Visibility ์˜ต์…˜ํ™”๋ฉด ํ‘œ์‹œ์ž…๋ ฅ ๊ฐ์ง€์„ค๋ช…
Visible๋ณด์ž„๊ฐ์ง€ํด๋ฆญ, ํ˜ธ๋ฒ„ ๋“ฑ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅ
Self Hit Test Invisible๋ณด์ž„โŒ ๊ฐ์ง€ (๋ณธ์ธ๋งŒ)์ž์‹ ์œ„์ ฏ์€ ์ž…๋ ฅ ๊ฐ€๋Šฅ
Hit Test Invisible๋ณด์ž„โŒ ๊ฐ์ง€ (์ž๊ธฐ+์ž์‹)์ „์ฒด ์ž…๋ ฅ ๋ฌด์‹œ
Hidden / CollapsedโŒ ์•ˆ ๋ณด์ž„โŒ ๊ฐ์ง€๋ Œ๋”๋ง ๋ฐ ์ž…๋ ฅ ๋‘˜ ๋‹ค ์—†์Œ

10. Use Canvas Panels Sparingly โ€“ Canvas Panel์„ ์•„๊ปด์„œ ์‚ฌ์šฉํ•˜๊ธฐ

๐Ÿ’กCanvas Panel ๋ฐ Overlays ์กฐ๊ธˆ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ

Canvas Panel

  • ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์œ„์ ฏ ๋ฐฐ์น˜
  • ์ ˆ๋Œ€ ์ขŒํ‘œ๋กœ ๋ฐฐ์น˜ํ•˜๋Š” ์ž์œ ํ˜• UI (HUD, Overlay, Layer)
  • ์œ„์ ฏ๋“ค์„ ๊ฒน์น˜๋ฉด ๋” ๋งŽ์€ Draw Call ์‚ฌ์šฉ

Grid Panel

  • ์ž์‹ ์œ„์ ฏ๋งˆ๋‹ค Anchors (์•ต์ปค), Offsets (์œ„์น˜/ํฌ๊ธฐ) ๊ฐ’์œผ๋กœ ์œ„์น˜๋ฅผ ์ง€์ •

  • UI ์œ„์น˜๋ฅผ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ์ •ํ™•ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ

  • ์ค‘์ฒฉ ํŒจ๋„์ด๋‚˜ Layer ๊ด€๋ฆฌ์— ์ž์ฃผ ์‚ฌ์šฉ

  • ๋ฒ„ํŠผ์ด๋‚˜ HUD ์•„์ด์ฝ˜ ๋“ฑ์„ ์ขŒํ‘œ๋กœ ๋ฐฐ์น˜ํ•  ๋•Œ ๊ฐ€์žฅ ์œ ์šฉ

  • ํ–‰๊ณผ ์—ด๋กœ ์ •๋ˆ๋œ ๊ตฌ์กฐํ˜• UI (์ธ๋ฒคํ† ๋ฆฌ, ์„ค์ •, ๋ชฉ๋ก)

  • ๊ทธ๋ฆฌ๋“œ ์…€ ์•ˆ์—์„œ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ์œ„์น˜๋ฅผ ์‚ด์ง ์กฐ์ •ํ•ด์•ผํ•  ๋•Œ Nudge ์‚ฌ์šฉ
    โ†’ ๋ณ„๋„์˜ Draw Call ์—†์ด ๋žœ๋” ํŠธ๋žœ์Šคํผ๋งŒ ์ ์šฉ๋จ
    โ†’ ์„ฑ๋Šฅ ๋ฌธ์ œ ์—†์Œ

    ํ•ญ๋ชฉCanvas PanelGrid Panel
    ๋ฐฐ์น˜ ๋ฐฉ์‹์ ˆ๋Œ€ ์œ„์น˜ ๊ธฐ๋ฐ˜ (์ขŒํ‘œ + ์•ต์ปค)ํ–‰(row) / ์—ด(column) ๊ธฐ๋ฐ˜
    ์ขŒํ‘œ ๊ธฐ์ค€Pixel ๋‹จ์œ„ (X, Y)์…€ ๋‹จ์œ„ (Row, Column)
    ํฌ๊ธฐ ์กฐ์ •์ˆ˜๋™ (Anchors, Offsets)์ž๋™ (์…€ ํฌ๊ธฐ์— ๋”ฐ๋ผ)
    ์ •๋ ฌ / ์ž๋™๋ฐฐ์น˜์—†์Œ (์ง์ ‘ ๋ฐฐ์น˜)์žˆ์Œ (๊ทธ๋ฆฌ๋“œ ์ •๋ ฌ ์ž๋™)
    ์ฃผ ์šฉ๋„HUD, ์ ˆ๋Œ€์œ„์น˜ UI, ๋ ˆ์ด์–ด ๋ฐฐ์น˜ํ‘œ ํ˜•์‹ UI, ์ธ๋ฒคํ† ๋ฆฌ, ์„ค์ • ๋ฉ”๋‰ด
    ๋ฐ˜์‘ํ˜• UI์ง์ ‘ ์•ต์ปค ๊ณ„์‚ฐ ํ•„์š”๊ทธ๋ฆฌ๋“œ ๋น„์œจ๋กœ ๋น„๊ต์  ์šฉ์ด
    ์„ฑ๋Šฅ๋งค์šฐ ๊ฐ€๋ณ๊ณ  ๋‹จ์ˆœ์…€ ๊ณ„์‚ฐ์ด ์•ฝ๊ฐ„ ๋” ๋ณต์žก
    Anchor ์ง€์›์žˆ์Œ์—†์Œ (๋Œ€์‹  ์ž๋™์ •๋ ฌ)

11. Space Widgets Efficiently โ€“ ์œ„์ ฏ ๊ณต๊ฐ„ ํšจ์œจ์ ์œผ๋กœ ๋ฐฐ์น˜ํ•˜๊ธฐ

๐Ÿ’กSize Boxes ๋Œ€์‹  Spacers ์‚ฌ์šฉํ•˜๊ธฐ

Size Boxes

  • ์ž์‹์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ•์ œ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ œํ•œ
  • ๋ถ€๋ชจ ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ๊ณผ ์ž์‹ ์œ„์ ฏ์˜ ์‹ค์ œ ํฌ๊ธฐ ๊ณ„์‚ฐ์„ ๋‘ ๋ฒˆ ์ด์ƒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•จ
    • ๋ถ€๋ชจ โ†’ ์ž์‹ โ†’ ๋ถ€๋ชจ ์žฌ๊ณ„์‚ฐ
  • ์—ฌ๋Ÿฌ Layout Pass๊ฐ€ ๋ฐœ์ƒ โ†’ CPU ๋น„์šฉ ์ฆ๊ฐ€

Spacers

  • ์ž์‹ ์—†์Œ
  • ๋ณ„๋„์˜ ๋ ˆ์ด์•„์›ƒ ์žฌ๊ณ„์‚ฐ ์—†์Œ
  • ๋žœ๋”๋ง(๊ทธ๋ฆฌ๊ธฐ)๋„ ์—†์Œ โ†’ Draw Call 0
  • ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ ์ค‘ ๊ฐ€์žฅ ์‹ธ๋‹ค ๐Ÿ‘๐Ÿป

12. Avoid Hard References โ€“ ํ•˜๋“œ ๋ ˆํผ๋Ÿฐ์Šค ํ”ผํ•˜๊ธฐ

๐Ÿ’กSoft References ์‚ฌ์šฉํ•˜๊ธฐ

(์˜ˆ์‹œ) ์บ๋ฆญํ„ฐ ์„ ํƒ ํ™”๋ฉด

์บ๋ฆญํ„ฐ 10๋ช…

์บ๋ฆญํ„ฐ
- ๋ฉ”์‹œ
- ํ…์Šค์ณ
- ๋จธํ‹ฐ๋ฆฌ์–ผ
- ์‚ฌ์šด๋“œ
- ์• ๋‹ˆ๋ฉ”์ด์…˜
๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • Hard Reference๋กœ ์ด ์บ๋ฆญํ„ฐ๋“ค์„ ์ €์žฅ
    โ†’ ๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ 10๋ช… ์ „๋ถ€ ํ•œ๊บผ๋ฒˆ์— ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋จ (์„ ํƒ ์•ˆ ํ•ด๋„)
    โ†’ ๋กœ๋”ฉ ๋А๋ ค์ง€๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ ๋ฐœ์ƒ

Soft References

  • ๋ฆฌ์†Œ์Šค ์ž์ฒด๋ฅผ ๋“ค๊ณ  ์žˆ์ง€ ์•Š๊ณ  ๋ฆฌ์†Œ์Šค์˜ ๊ฒฝ๋กœ(์ฃผ์†Œ)๋งŒ ๊ธฐ์–ตํ•จ
  • ๊ทธ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ฐธ์กฐ ๋ฐฉ์‹

13. Custom Icon Fonts โ€“ ์ปค์Šคํ…€ ์•„์ด์ฝ˜ ํฐํŠธ ์‚ฌ์šฉ๋ฒ•

๐Ÿ’กTexture ๋Œ€์‹  ํฐํŠธ๋กœ ์•„์ด์ฝ˜ ๊ด€๋ฆฌํ•˜๊ธฐ

โ†’ ๋ฉ”๋ชจ๋ฆฌ์™€ Draw Call ์ ˆ์•ฝ

์ผ๋ฐ˜์ ์œผ๋กœ UI ์•„์ด์ฝ˜์€ Texture ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ์–ด์„œ ์•„์ด์ฝ˜์ด ๋งŽ์•„์งˆ์ˆ˜๋ก

๋จธํ‹ฐ๋ฆฌ์–ผ ์ˆ˜ โ†‘ / Draw Call โ†‘ / GPU ๋ฉ”๋ชจ๋ฆฌ(ํ…์Šค์ฒ˜ ๋ฉ”๋ชจ๋ฆฌ) ๋‚ญ๋น„

์•„์ด์ฝ˜์„ ํฐํŠธ๋กœ ๊ด€๋ฆฌํ•˜์ž!

  • ์ด๋ฏธ์ง€ ๋Œ€์‹  ํฐํŠธ๋กœ ์•„์ด์ฝ˜ ํ‘œ์‹œ

  • FontForge / Fontello ํˆด ์ด์šฉ

    • ๊ฐ ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€๋ฅผ ๊ธ€๋ฆฌํ”„(glyph)๋กœ ๋ณ€ํ™˜
    • ์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’์„ ๋ถ€์—ฌ
    • ํ•˜๋‚˜์˜ ์ปค์Šคํ…€ ํฐํŠธ ํŒŒ์ผ(.ttf)๋กœ ๋ฌถ๊ธฐ
  • UI ์œ„์ ฏ์— ์ด๋ฏธ์ง€ ๋Œ€์‹  ํ…์ŠคํŠธ ๋ธ”๋ก ์ถ”๊ฐ€ํ•ด์„œ ํ•ด๋‹น ์•„์ด์ฝ˜์˜ ์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’ ๋˜๋Š” ๊ธ€๋ฆฌํ”„ ๋ฌธ์ž ์ž…๋ ฅ

  • ๋ฌธ์ œ์ 
    - ์ผ๋ถ€ ๋ธ”๋ฃจํ”„๋ฆฐํŠธ์—์„œ๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’์„ ์ง์ ‘ ์ž…๋ ฅํ•  ๋•Œ ์ธ์‹๋˜์ง€ ์•Š์Œ
    - ์•„์ด์ฝ˜ ๊ธ€๋ฆฌํ”„(๋ฌธ์ž ์ž์ฒด)๋ฅผ ๋ณต๋ถ™ํ•˜๋ฉด ๊ดœ์ฐฎ์Œ!

    ํ•ญ๋ชฉ๊ธฐ์กด ๋ฐฉ์‹ (์ด๋ฏธ์ง€ ์•„์ด์ฝ˜)ํฐํŠธ ๋ฐฉ์‹ (์•„์ด์ฝ˜ ํฐํŠธ)
    ์•„์ด์ฝ˜ ์ˆ˜200๊ฐœ ์ด์ƒ200๊ฐœ ์ด์ƒ
    ๋ฆฌ์†Œ์Šค ๊ตฌ์กฐPNG + ๋จธํ‹ฐ๋ฆฌ์–ผ 200๊ฐœ๋‹จ์ผ 2048ร—2048 ํฐํŠธ ํ…์Šค์ฒ˜
    ํ…์Šค์ฒ˜ ๋ฉ”๋ชจ๋ฆฌ๋งค์šฐ ๋†’์Œํ›จ์”ฌ ์ ์Œ
    Draw Call ์ˆ˜๋งŽ์Œ์ ์Œ
    ์œ ์ง€๋ณด์ˆ˜๊ฐœ๋ณ„ ์ด๋ฏธ์ง€ ๊ด€๋ฆฌ ํ•„์š”ํฐํŠธ ํ•˜๋‚˜๋กœ ๊ด€๋ฆฌ

14. MeshWidget โ€“ ๋ฉ”์‹œ ๊ธฐ๋ฐ˜ UI ์œ„์ ฏ ์‚ฌ์šฉ๋ฒ•

โ†’ 3D Mesh์™€ Slate ๊ฒฐํ•ฉ์œผ๋กœ ๊ณ ๊ธ‰ ์‹œ๊ฐํšจ๊ณผ ๊ตฌํ˜„

๐Ÿ’ก๋™์ผ ๋‹ค์ˆ˜ ์œ„์ ฏ ์ธ์Šคํ„ด์Šค์— MeshWidget ๊ณ ๋ คํ•˜๊ธฐ

์  ์ฒด๋ ฅ๋ฐ”, ๋ฏธ๋‹ˆ๋งต ์•„์ด์ฝ˜, ์›”๋“œ ๋‚ด POI์ฒ˜๋Ÿผ ๋˜‘๊ฐ™์€ UI๊ฐ€ ์—„์ฒญ ๋งŽ์ด ํ•„์š”ํ•จ

๋ณดํ†ต Widget Component๋ฅผ ์“ฐ๋Š”๋ฐ ๋ฌธ์ œ ์žˆ์Œ

  1. Slate(UI)๋ฅผ ๋จผ์ € CPU์—์„œ ๊ทธ๋ฆฐ ํ›„
  2. ๊ทธ๊ฑธ Render Target ํ…์Šค์ฒ˜๋กœ ๋ณ€ํ™˜
  3. ๊ทธ ํ…์Šค์ฒ˜๋ฅผ ๋‹ค์‹œ 3D ๊ณต๊ฐ„์— ํ‘œ์‹œ

์œ„์ ฏ ํ•˜๋‚˜ํ•˜๋‚˜๋งˆ๋‹ค ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณต โ†’ ์—„์ฒญ ๋ฌด๊ฑฐ์›€ (Draw Call โ†‘, CPU/GPU ๋น„์šฉ โ†‘)

Mesh Widget

์—ฌ๋Ÿฌ UI ์ธ์Šคํ„ด์Šค๋ฅผ ํ•œ ๋ฒˆ์—(=๋‹จ์ผ Draw Call) ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹ (UI์šฉ Foliage System)

์ž‘๋™ ๋ฐฉ๋ฒ•

  1. ๊ธฐ๋ณธ ์„ค์ •
    • Slate Vector Art Data๋ฅผ ํ†ตํ•ด ์Šคํƒœํ‹ฑ ๋ฉ”์‹œ ๋ฐ”์ธ๋”ฉ
    • ๋ฉ”์‹œ ์œ„์ ฏ ์•ˆ์—์„œ Draw Mesh ๊ธฐ๋Šฅ๊ณผ Instance ํ™œ์„ฑํ™” ๊ธฐ๋Šฅ ์‚ฌ์šฉ
  2. ์ธ์Šคํ„ด์Šค ์ œ์–ด ๋ฐฉ๋ฒ•
    • ๊ฐ ์ธ์Šคํ„ด์Šค (๊ฐœ๋ณ„ UI)๋Š” 4D ๋ฒกํ„ฐ ํ•˜๋‚˜๋กœ ์ œ์–ด๋จ
    • X, Y : ํ™”๋ฉด ์œ„์น˜, Z : ์Šค์ผ€์ผ, W : ๊ธฐ๋ณธ ์ฃผ์†Œ
  3. ๋žœ๋”๋ง
    • UI Material์„ ๋งŒ๋“ค์–ด์„œ ๋ฉ”์‹œ ์œ„์ ฏ์— ํ• ๋‹น (Slate Vector Art Data)
    • ์ด ๋จธํ‹ฐ๋ฆฌ์–ผ์—์„œ ์œ„์˜ 4D ๋ฒกํ„ฐ ๊ฐ’๋“ค์„ ๋ฐ›์•„ ๊ฐ ์ธ์Šคํ„ด์Šค์˜ ์œ„์น˜, ํฌ๊ธฐ, ์ƒ‰์ƒ, ํ‘œ์‹œ ์—ฌ๋ถ€ ๋“ฑ์„ ์ œ์–ด

์ผ๋ฐ˜ ์œ„์ ฏ ์ปดํฌ๋„ŒํŠธ๋กœ ์ฒด๋ ฅ๋ฐ” 100๊ฐœ ๊ทธ๋ฆฌ๋ฉด 100๋ฒˆ์˜ ๋žœ๋”๋ง์ด ํ•„์š”ํ•˜์ง€๋งŒ,

๋ฉ”์‹œ ์œ„์ ฏ์€ ๋”ฑ ํ•œ ๋ฒˆ์˜ Draw Call๋กœ 100๊ฐœ๋ฅผ ๋‹ค ๊ทธ๋ ค๋ฒ„๋ฆผ

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

comment-user-thumbnail
2025๋…„ 11์›” 18์ผ

์ข‹์€๊ธ€ ์ž˜ ๋ณด๊ณ ๊ฐ‘๋‹ˆ๋‹ค! NameSlot, DrawCall ๋ถ€๋ถ„์€ ์ €๋„ ๊ณต๋ถ€ํ•ด์„œ ํ”„๋กœ์ ํŠธ์— ์จ๋จน์–ด๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€