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๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค.






