์„œ๋น„์Šค
๊ต์œก ์ฒ ํ•™

UI Manager

Abstract

๐Ÿ“Œ
UI Manager ๊ฐ€ ํ‘ธ๋Š” ๋ฌธ์ œ๋Š” "์ฐฝ์ด ์—ฌ๋Ÿฌ ๊ฐœ ๊ฒน์ณค์„ ๋•Œ ๋ˆ„๊ฐ€ ๋งจ ์œ„์ด๊ณ , ์•„๋ž˜ ๊น”๋ฆฐ ์ฐฝ์€ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€"์ž…๋‹ˆ๋‹ค. ํผ์„ ๊ทธ๋ฃน(์ธต)์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ทธ๋ฃน ์•ˆ์—์„œ๋Š” ์—ฌ๋Š” ์ˆœ์„œ๋Œ€๋กœ ์Œ“์œผ๋ฉฐ, ์œ„์— ์ƒˆ ํผ์ด ์˜ฌ๋ผ์˜ค๋ฉด ์•„๋ž˜ ํผ์—๊ฒŒ "๊ฐ€๋ ค์กŒ๋‹ค"๊ณ  ์•Œ๋ ค ์ค๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€๋Š” ๊ทธ ๋‚ด๋ถ€ ๊ทœ์น™์„, Unity ์ชฝ UI ์‹œ์Šคํ…œ ํŽ˜์ด์ง€๋Š” ๊ฒŒ์ž„ ์ฝ”๋“œ์—์„œ์˜ ์‚ฌ์šฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
ํผ์ด ๋ฐ›๋Š” ์ฝœ๋ฐฑ โ€” ์–ธ์ œ ๋ฌด์—‡์ด ๋ถˆ๋ฆฌ๋‚˜
์ธ๋ฒคํ† ๋ฆฌ ์œ„์— ํ™•์ธ ํŒ์—…์ด ๋œจ๊ณ  ๋‹ซํžˆ๋Š” ์ƒํ™ฉ์œผ๋กœ ๋ณด๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค.
์‚ฌ๊ฑด
์ธ๋ฒคํ† ๋ฆฌ (์•„๋ž˜)
ํ™•์ธ ํŒ์—… (์œ„)
์ธ๋ฒคํ† ๋ฆฌ๋ฅผ ์—ฐ๋‹ค
OnInit(์ฒ˜์Œ ํ•œ ๋ฒˆ) โ†’ OnOpen
ํŒ์—…์„ ์—ฐ๋‹ค
OnCover โ€” "๊ฐ€๋ ค์กŒ๋‹ค" (pauseCoveredUIForm ์ด true ์˜€๋‹ค๋ฉด OnPause ๋„)
OnInit โ†’ OnOpen
๋งค ํ”„๋ ˆ์ž„
OnUpdate โ€” ์ผ์‹œ์ •์ง€๋๋‹ค๋ฉด ๋ถˆ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค
OnUpdate
ํŒ์—…์„ ๋‹ซ๋Š”๋‹ค
OnReveal โ€” "๋‹ค์‹œ ๋“œ๋Ÿฌ๋‚ฌ๋‹ค" (์ผ์‹œ์ •์ง€์˜€๋‹ค๋ฉด OnResume)
OnClose โ†’ ํ’€๋กœ โ†’ OnRecycle
OpenUIForm ์˜ ๋„ค ๋ฒˆ์งธ ์ธ์ž pauseCoveredUIForm ์ด "์ด ํผ์ด ๋–  ์žˆ๋Š” ๋™์•ˆ ์•„๋ž˜ ํผ๋“ค์„ ๋ฉˆ์ถœ ๊ฒƒ์ธ๊ฐ€"์ž…๋‹ˆ๋‹ค. ์ „์ฒด ํ™”๋ฉด์„ ๋ฎ๋Š” ์ฐฝ์ด๋ฉด true ๋กœ ์ค˜์„œ ์•„๋ž˜ ํผ์˜ ๊ฐฑ์‹ ์„ ์•„๋ผ๊ณ , ๋ฐ˜ํˆฌ๋ช… ํŒ์—…์ด๋ฉด false ๋กœ ๋‘ก๋‹ˆ๋‹ค.
ToyboxNightmare ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ
HUDForm ๊ณผ PauseMenuForm ์€ ๋‘˜ ๋‹ค Default ๊ทธ๋ฃน์— ์žˆ๊ณ , HUD ๊ฐ€ ๋จผ์ € ์—ด๋ฆฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณดํ†ต ์ผ์‹œ์ •์ง€ ํผ์ด HUD ์œ„์— ์Œ“์ด๊ณ , HUD ๋Š” ๊ฒŒ์ž„ ์‹œ์ž‘ ์งํ›„๋ถ€ํ„ฐ "Covered" ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. (์ •ํ™•ํžˆ๋Š” "์—ฌ๋Š” ์ˆœ์„œ"๊ฐ€ ์•„๋‹ˆ๋ผ ๋กœ๋“œ๊ฐ€ ๋๋‚œ ์ˆœ์„œ๋กœ ์Œ“์ž…๋‹ˆ๋‹ค. ๋‘ ํผ ๋ชจ๋‘ ๋น„๋™๊ธฐ๋กœ ๋กœ๋“œ๋˜๋ฏ€๋กœ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ํผ์€ ๊ทธ๋ฃน์„ ๋‚˜๋ˆ„๊ฑฐ๋‚˜ ์•ž ํผ์˜ ์„ฑ๊ณต ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›๊ณ  ๋‹ค์Œ ํผ์„ ์—ฝ๋‹ˆ๋‹ค.) pauseCoveredUIForm ์„ ์ฃผ์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ(๊ธฐ๋ณธ false) HUD ์˜ OnUpdate ๋Š” ๊ณ„์† ๋•๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ๋ˆˆ์—ฌ๊ฒจ๋ณผ ์„ค๊ณ„๊ฐ€ ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ์ •์ง€ ๋ฉ”๋‰ด๋Š” ESC ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ ์—ด๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ•œ ํŒ ๋‚ด๋‚ด ์—ด๋ ค ์žˆ๊ณ  ์•ˆ์˜ ํŒจ๋„๋งŒ ์ผœ๊ณ  ๋•๋‹ˆ๋‹ค.
// PauseMenuForm protected override void OnUpdate(float elapseSeconds, float realElapseSeconds) { base.OnUpdate(elapseSeconds, realElapseSeconds); if (!IsCancelPressed()) return; Toggle(); // GamePause ์ „ํ™˜ + ํŒจ๋„ SetActive }
C#
๋ณต์‚ฌ
ESC ์ž…๋ ฅ์„ ํผ ์ž์‹ ์˜ OnUpdate ์—์„œ ๋ฐ›์œผ๋ ค๋ฉด ํผ์ด ์‚ด์•„ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. "๋‹ซํ˜€ ์žˆ๋Š” ํผ์€ ์•„๋ฌด ์ฝœ๋ฐฑ๋„ ๋ฐ›์ง€ ๋ชปํ•œ๋‹ค"๋Š” ๊ทœ์น™์—์„œ ๋‚˜์˜จ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์ž…๋ ฅ์„ Procedure ๋‚˜ ๋ณ„๋„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ›์•„ ๊ทธ๋•Œ OpenUIForm ํ•˜๋Š” ๊ฒƒ์ด๊ณ , ํผ์ด ๋ฌด๊ฒ๋‹ค๋ฉด ๊ทธ์ชฝ์ด ๋‚ซ์Šต๋‹ˆ๋‹ค.
ํ™•์žฅํ•  ๋•Œ ์“ฐ๊ฒŒ ๋˜๋Š” ๊ฒƒ๋“ค
โ€ข
userData ๋กœ ํผ์— ์ธ์ž ๋„˜๊ธฐ๊ธฐ. OpenUIForm("ConfirmForm", "Popup", new ConfirmParams("์ •๋ง ๋‚˜๊ฐˆ๊นŒ์š”?", onYes)) โ†’ ํผ์˜ OnOpen(object userData) ๋กœ ๋„์ฐฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ํ”„๋ฆฌํŒน ํ•˜๋‚˜๋กœ ๋‚ด์šฉ์ด ๋‹ค๋ฅธ ํŒ์—…์„ ๋„์šฐ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
โ€ข
์ค‘๋ณต ์—ด๊ธฐ๋Š” ์ง์ ‘ ๋ง‰์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ฐ™์€ ์ฃผ์†Œ์˜ ํผ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์—ฌ๋Š” ๊ฒƒ์„ ๋ง‰์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ๋‘ ๋ฒˆ ๋ถ€๋ฅด๋ฉด ๋‘ ๊ฐœ๊ฐ€ ๋œน๋‹ˆ๋‹ค. ์•Œ๋ฆผ ํŒ์—…์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋– ์•ผ ํ•˜๋Š” ํผ์—๋Š” ๊ทธ๋Œ€๋กœ ์“ฐ๋ฉด ๋˜๊ณ , ํ•˜๋‚˜๋งŒ ๋– ์•ผ ํ•˜๋Š” ํผ์€ HasUIForm(์ฃผ์†Œ) / IsLoadingUIForm(์ฃผ์†Œ) ๋กœ ๋จผ์ € ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ProcedureMain.OpenOnce ๊ฐ€ ๊ทธ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
RefocusUIForm. ์ด๋ฏธ ์—ด๋ ค ์žˆ๋Š” ํผ์„ ๋‹ค์‹œ ๋งจ ์œ„๋กœ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ํƒญ ์ „ํ™˜์‹ UI ์—์„œ ์”๋‹ˆ๋‹ค.
โ€ข
๊ทธ๋ฃน ๋‹จ์œ„ ์ผ์‹œ์ •์ง€. uiGroup.Pause = true ๋กœ ๊ทธ๋ฃน ์ „์ฒด ํผ์„ ํ•œ ๋ฒˆ์— ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ์ปท์‹  ๋™์•ˆ ๊ฒŒ์ž„ UI ๋ฅผ ์–ผ๋ฆฌ๋Š” ์šฉ๋„์ž…๋‹ˆ๋‹ค.
โš ๏ธ
์ด ์—๋””์…˜์—์„œ ๋‹ค๋ฅธ ์  ยท ๋ณธ๋ฌธ์„ ์ฝ์„ ๋•Œ ์ฃผ์˜ํ•  ์ 
โ€ข
๋ณธ๋ฌธ์€ "Depth ๊ฐ’์œผ๋กœ ๋ Œ๋” ์ˆœ์„œ ๊ฒฐ์ •"์ด๋ผ๊ณ  ํ•˜์ง€๋งŒ, ์ฝ”์–ด๊ฐ€ ๊ณ„์‚ฐํ•œ depth ๋Š” ํ—ฌํผ์˜ SetDepth ์™€ ํผ์˜ OnDepthChanged ๋กœ ์ „๋‹ฌ๋  ๋ฟ ์‹ค์ œ ๊ทธ๋ฆฌ๊ธฐ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ Unity ์ชฝ ๊ตฌํ˜„์˜ ๋ชซ์ž…๋‹ˆ๋‹ค. ์ด ์—๋””์…˜์˜ ๊ธฐ๋ณธ ํ—ฌํผ๋Š” ๊ทธ ๊ตฌํ˜„์ด ๋น„์–ด ์žˆ์–ด์„œ, ์˜ˆ์ œ๋Š” ํผ Canvas ์˜ Sorting Order ๋ฅผ ์ง์ ‘ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(HUD 0, ์ผ์‹œ์ •์ง€ 100). ํผ์ด ๋งŽ์•„์ง€๋ฉด OnDepthChanged(uiGroupDepth, depthInUIGroup) ์—์„œ Sorting Order ๋ฅผ ๊ณ„์‚ฐํ•ด ๋„ฃ๋Š” ๊ณตํ†ต ๋ฒ ์ด์Šค ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ •์„์ž…๋‹ˆ๋‹ค.
โ€ข
๋ณธ๋ฌธ์˜ uiManager.AddUIGroup(...), uiManager.OpenUIForm(...) ์€ ์ฝ”์–ด API ์ž…๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ฝ”๋“œ๋Š” GameEntry.GetComponent<UIComponent>() ๋กœ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ€๋ฅด๊ณ , ๊ทธ๋ฃน์€ ์ธ์ŠคํŽ™ํ„ฐ์—์„œ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
โ€ข
OpenUIFormUpdate / OpenUIFormDependencyAsset ์ด๋ฒคํŠธ๋Š” ์ด ์—๋””์…˜์—์„œ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
โ€ข
ํผ ๋กœ์ง์˜ ํ›…์€ protected override ๋กœ ์“ฐ๊ณ , UI ํผ ํ”„๋ฆฌํŒน ๋ฃจํŠธ์—๋Š” UIFormLogic ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ถ™์—ฌ ๋‘ก๋‹ˆ๋‹ค.

UI ๋งค๋‹ˆ์ € ๊ฐœ์š”

UI Manager๋Š” GameFramework์˜ ํ•ต์‹ฌ ์‹œ์Šคํ…œ์œผ๋กœ, ๊ฒŒ์ž„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ **UI ํผ(ํ™”๋ฉด, ์ฐฝ, ํŒจ๋„)**์˜ ๊ด€๋ฆฌยท๋กœ๋”ฉยทํ‘œ์‹œ ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
์ด ์‹œ์Šคํ…œ์€ UI ์š”์†Œ๋ฅผ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ•˜๊ณ , ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, UI ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๊ด„์ ์ธ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
โ€ข
Entity ๊ด€๋ฆฌ โ†’ Entity Manager ์ฐธ๊ณ 
โ€ข
์˜ค๋””์˜ค ์ธํ„ฐํŽ˜์ด์Šค ๊ด€๋ฆฌ โ†’ Sound Manager ์ฐธ๊ณ 

์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”

1. UIManager

UIManager ํด๋ž˜์Šค๋Š” ๋ชจ๋“  UI ์ž‘์—…์„ ์ด๊ด„ํ•˜๋Š” ๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค.
๊ธฐ๋Šฅ:
โ€ข
UI ๊ทธ๋ฃน ์ปฌ๋ ‰์…˜ ์œ ์ง€
โ€ข
UI ํผ ์—ด๊ธฐยท๋‹ซ๊ธฐ ์ฒ˜๋ฆฌ
โ€ข
๊ฐ์ฒด ํ’€(Object Pool)๋กœ UI ํผ ์ธ์Šคํ„ด์Šค ๊ด€๋ฆฌ
โ€ข
๋ฆฌ์†Œ์Šค ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด UI ํผ ์—์…‹ ๋กœ๋“œ
โ€ข
UI ํผ ์ƒ๋ช…์ฃผ๊ธฐ ์ด๋ฒคํŠธ ์ œ๊ณต

2. UI ๊ทธ๋ฃน

UI ๊ทธ๋ฃน์€ ๋™์ผํ•œ ๊นŠ์ด(Depth) ์„ค์ •์„ ๊ณต์œ ํ•˜๋Š” UI ํผ ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด UI๋ฅผ ๋…ผ๋ฆฌ์  ๋ ˆ์ด์–ด(๋ฐฐ๊ฒฝ, ๊ฒŒ์ž„ UI, ํŒ์—…์ฐฝ ๋“ฑ)๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ.
ํŠน์ง•:
โ€ข
๊ณ ์œ  ์ด๋ฆ„๊ณผ Depth ๊ฐ’ ๋ณด์œ 
โ€ข
์šฐ์„ ์ˆœ์œ„ ๊ธฐ๋ฐ˜ UI ํผ ๋ฆฌ์ŠคํŠธ
โ€ข
ํ‘œ์‹œ/๊ฐ€๋ฆผ/์ผ์‹œ์ •์ง€ ์ œ์–ด
โ€ข
๊ทธ๋ฃน ๋‚ด UI ํผ์˜ ์Œ“์ด๋Š” ์ˆœ์„œ ๊ด€๋ฆฌ

3. UI ํผ

UI ํผ์€ ๊ฐœ๋ณ„ UI ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ƒํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
โ€ข
Active: ํ‘œ์‹œ๋˜๊ณ  ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅ
โ€ข
Covered: ํ‘œ์‹œ๋˜์ง€๋งŒ ์œ„์— ๋‹ค๋ฅธ ํผ์ด ์žˆ์Œ
โ€ข
Paused: ์ผ์‹œ ๋น„ํ™œ์„ฑ (๋Œ€๊ฐœ ๋‹ค๋ฅธ ํผ์— ๊ฐ€๋ ค์งˆ ๋•Œ)
โ€ข
Hidden: ํ‘œ์‹œ๋˜์ง€ ์•Š์Œ

UI ํผ ์ƒ๋ช…์ฃผ๊ธฐ

1.
Loading โ€“ ๋ฆฌ์†Œ์Šค์—์„œ UI ํผ ์—์…‹ ๋กœ๋“œ
2.
Initializing โ€“ ์ธ์Šคํ„ด์Šคํ™” ๋ฐ ์ดˆ๊ธฐํ™”
3.
Opening โ€“ ํ‘œ์‹œ๋˜๋ฉฐ Active ์ƒํƒœ๋กœ ์ „ํ™˜
4.
Cover/Reveal โ€“ ๋‹ค๋ฅธ ํผ์ด ์œ„์— ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ์‚ฌ๋ผ์ง
5.
Pause/Resume โ€“ ์ผ์‹œ ๋น„ํ™œ์„ฑ/์žฌํ™œ์„ฑ
6.
Closing โ€“ ํ‘œ์‹œ์—์„œ ์ œ๊ฑฐ ์ค‘
7.
Recycling โ€“ ๊ฐ์ฒด ํ’€๋กœ ๋ฐ˜ํ™˜

UI ๊ทธ๋ฃน ๊ด€๋ฆฌ

UI ๊ทธ๋ฃน ์‚ฌ์šฉ ์žฅ์ :
โ€ข
๋ ˆ์ด์–ด ์ œ์–ด โ€“ Depth ๊ฐ’์œผ๋กœ ๋ Œ๋” ์ˆœ์„œ ๊ฒฐ์ •
โ€ข
์ผ๊ด„ ์ž‘์—… โ€“ ๊ทธ๋ฃน ๋‹จ์œ„๋กœ ์ผ์‹œ์ •์ง€/์žฌ๊ฐœ ๊ฐ€๋Šฅ
โ€ข
๋…๋ฆฝ ์Šคํƒ ๊ด€๋ฆฌ โ€“ ๊ฐ ๊ทธ๋ฃน์€ ์ž์ฒด UI ํผ ์Šคํƒ ์œ ์ง€

UI ํผ ์—ด๊ธฐยท๋‹ซ๊ธฐ ๊ณผ์ •

์—ด๊ธฐ

1.
์š”์ฒญํ•œ UI ํผ์ด ์ด๋ฏธ ๋กœ๋“œ ์ค‘์ธ์ง€ ํ™•์ธ
2.
๊ฐ์ฒด ํ’€์—์„œ UI ํผ ์ธ์Šคํ„ด์Šค ๊ฒ€์ƒ‰
3.
์—†์œผ๋ฉด Resource Manager๋ฅผ ํ†ตํ•ด ๋กœ๋“œ
4.
๋กœ๋“œ ์™„๋ฃŒ ์‹œ ์ธ์Šคํ„ด์Šคํ™” โ†’ ํ•ด๋‹น ๊ทธ๋ฃน์— ์ถ”๊ฐ€
5.
์ดˆ๊ธฐํ™” ๋ฐ ์—ด๊ธฐ ์ฝœ๋ฐฑ ํ˜ธ์ถœ
6.
UI ๊ทธ๋ฃน ์ƒˆ๋กœ๊ณ ์นจ(์ƒํƒœ ์—…๋ฐ์ดํŠธ)

๋‹ซ๊ธฐ

1.
ํ•ด๋‹น UI ํผ์„ ๊ทธ๋ฃน์—์„œ ์ œ๊ฑฐ
2.
๋‹ซ๊ธฐ ์ฝœ๋ฐฑ ํ˜ธ์ถœ
3.
๊ทธ๋ฃน ์ƒˆ๋กœ๊ณ ์นจ
4.
๊ฐ์ฒด ํ’€๋กœ ๋ฐ˜ํ™˜
5.
CloseUIFormComplete ์ด๋ฒคํŠธ ๋ฐœ์ƒ

๊ฐ์ฒด ํ’€ ๋ฐ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

โ€ข
๊ฐ์ฒด ํ’€: UI ํผ ์ธ์Šคํ„ด์Šค ์žฌ์‚ฌ์šฉ
โ€ข
๋ฆฌ์†Œ์Šค ๋งค๋‹ˆ์ € ์—ฐ๋™ (์›์ž‘ ๊ธฐ์ค€. ์ด ์—๋””์…˜์˜ Addressables ๊ตฌํ˜„์€ ์šฐ์„ ์ˆœ์œ„ยท์ง„ํ–‰๋ฅ ยท์ข…์† ์—์…‹ ํ†ต์ง€๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค):
โ—ฆ
์šฐ์„ ์ˆœ์œ„ ๊ธฐ๋ฐ˜ ๋กœ๋“œ
โ—ฆ
์ง„ํ–‰๋ฅ  ๋ณด๊ณ 
โ—ฆ
์ข…์† ์—์…‹ ๋กœ๋“œ
โ—ฆ
๋กœ๋“œ ์ค‘์ธ ํผ ๋‹ซ๊ธฐ (๋กœ๋“œ๊ฐ€ ๋๋‚˜๋ฉด ๋ฐ”๋กœ ๋ฒ„๋ฆฐ๋‹ค)

์ด๋ฒคํŠธ ์‹œ์Šคํ…œ

UI Manager๋Š” ๋‹ค์Œ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ณต:
โ€ข
OpenUIFormSuccess โ€“ ์„ฑ๊ณต์ ์œผ๋กœ ์—ด๋ ธ์„ ๋•Œ
โ€ข
OpenUIFormFailure โ€“ ์—ด๊ธฐ ์‹คํŒจ ์‹œ
โ€ข
OpenUIFormUpdate โ€“ ๋กœ๋”ฉ ์ง„ํ–‰๋ฅ  ๋ณด๊ณ 
โ€ข
OpenUIFormDependencyAsset โ€“ ์ข…์† ์—์…‹ ๋กœ๋“œ ์‹œ
โ€ข
CloseUIFormComplete โ€“ ์™„์ „ํžˆ ๋‹ซํ˜”์„ ๋•Œ

UI ํผ ์ƒํƒœ ๊ด€๋ฆฌ

์ƒํƒœ ๋ณ€ํ™” ์‹œ:
โ€ข
์ƒํƒœ ์—…๋ฐ์ดํŠธ
โ€ข
ํ•ด๋‹น ์ƒํƒœ ์ฝœ๋ฐฑ ํ˜ธ์ถœ (OnCover, OnPause ๋“ฑ)
โ€ข
Depth ๊ฐ’ ์žฌ์กฐ์ •
โ€ข
PauseCoveredUIForm ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๊ฐ€๋ ค์ง„ ํผ ์ผ์‹œ์ •์ง€ ์—ฌ๋ถ€ ๊ฒฐ์ •
โ€ข
UIGroup.Refresh()๊ฐ€ ์Šคํƒ ์œ„์น˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒํƒœ ๊ฐฑ์‹ 

ํ”„๋ ˆ์ž„์›Œํฌ ํ†ตํ•ฉ

UI Manager๋Š” GameFramework ์ „๋ฐ˜๊ณผ ๋™์ผํ•œ ํŒจํ„ด ์‚ฌ์šฉ:
โ€ข
GameFrameworkModule ์ƒ์†
โ€ข
ObjectPoolManagerยทResourceManager ์˜์กด์„ฑ ์ฃผ์ž…
โ€ข
ํ”Œ๋žซํผ๋ณ„ ๊ตฌํ˜„์„ ์œ„ํ•œ Helper ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ
โ€ข
ํ‘œ์ค€ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ ํ™œ์šฉ
โ€ข
๊ฐ์ฒด ํ’€ ๊ธฐ๋ฐ˜ ํšจ์œจ์  ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

์‚ฌ์šฉ ์˜ˆ์‹œ

UI ๊ทธ๋ฃน ์ถ”๊ฐ€

uiManager.AddUIGroup("MainMenuGroup", 10, uiGroupHelper); uiManager.AddUIGroup("PopupGroup", 20, uiGroupHelper);
C#
๋ณต์‚ฌ

UI ํผ ์—ด๊ธฐ

int serialId = uiManager.OpenUIForm("MainMenu", "MainMenuGroup"); // ์šฐ์„ ์ˆœ์œ„ + ๊ฐ€๋ ค์ง„ ํผ ์ผ์‹œ์ •์ง€ int serialId = uiManager.OpenUIForm("SettingsPanel", "PopupGroup", 100, true, userData);
C#
๋ณต์‚ฌ

UI ํผ ๋‹ซ๊ธฐ

uiManager.CloseUIForm(serialId); uiManager.CloseUIForm(uiForm);
C#
๋ณต์‚ฌ

ํฌ์ปค์Šค ์žฌ์„ค์ •

uiManager.RefocusUIForm(uiForm);
C#
๋ณต์‚ฌ

์š”์•ฝ

UI Manager๋Š” ๊ทธ๋ฃน ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜, ๊ฐ์ฒด ํ’€, ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๊ฒฐํ•ฉํ•ด ๋ณต์žกํ•œ UI๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.
Resource Manager์™€ ๊ฒฐํ•ฉํ•ด ์œ ์—ฐ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์ผ๊ด€๋œ API๋กœ UI๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.