Abstract
๋ฆฌ์์ค ์์คํ
์ "์ด๋ฆ์ ์ฃผ๋ฉด ์์
์ ๋น๋๊ธฐ๋ก ๊ฐ์ ธ๋ค ์ฃผ๋" ์ฐฝ๊ตฌ์
๋๋ค. ์ํฐํฐยทUIยท์ฌ์ด๋ยท์ฌ ๋ชจ๋์ด ์ ๋ถ ์ด ์ฐฝ๊ตฌ๋ฅผ ํตํด ์์
์ ์ป์ต๋๋ค. ๊ทธ๋์ ๊ฒ์ ์ฝ๋๊ฐ ์ง์ ๋ถ๋ฅผ ์ผ์ ๊ฑฐ์ ์์ต๋๋ค โ ShowEntity("Girl", โฆ) ์ ๋ถ๋ฅด๋ฉด ๊ทธ ์์์ ๋ฆฌ์์ค ์์คํ
์ด ๋๋๋ค. ์ด ์๋์
์์ ๊ทธ ์ฐฝ๊ตฌ ๋ค์ ์๋ ๊ฒ์ Unity ์ Addressables ์
๋๋ค.
์ค๋ฌด์์ ํ์ํ ์๊ฐ
โข
์ ํ๋ฆฌํนยท์ฌ์ด๋ยทUI ๋ฅผ ๊ฒ์์ ์ถ๊ฐํ ๋ โ ๋ฑ๋ก ๋ฐฉ๋ฒ๊ณผ ์ฃผ์ ๊ท์น์ ์์์ผ ํ๋ค
โข
์ํฐํฐ๋ UI ๊ฐ ์๋ ์์
(ScriptableObject, ํ
์ค์ฒ, ํ
์คํธ)์ ์ฝ๋๋ก ๋ถ๋ฌ์์ผ ํ ๋
โข
"์๋ฌด๊ฒ๋ ์ ๋ฌ๋ค"๋ฅผ ๋๋ฒ๊น
ํ ๋
ToyboxNightmare ์์๋
ResourceComponent ๋ฅผ ์ง์ ๋ถ๋ฅด๋ ์ฝ๋๊ฐ ํ ์ค๋ ์์ต๋๋ค. ์์
25๊ฐ๊ฐ ์ ๋ถ ShowEntity / OpenUIForm / PlaySound ๋ฅผ ํตํด ๋ก๋๋ฉ๋๋ค.
ํ์ฅํ๋ ค๋ฉด
โข
์๊ฒฉ ๋ฐฐํฌยทํจ์น โ
Resource Updating(๋ฆฌ์์ค ์
๋ฐ์ดํธ)-Addressable
โข
๋ด๋ถ ๊ตฌ์กฐ, ๋ค๋ฅธ ๋ก๋๋ก ๊ต์ฒด โ
Resource Management(๋ฆฌ์์ค ๊ด๋ฆฌ)-Addressable
๋ก๋ฉ ๊ฒฝ๋ก
graph LR
A["ShowEntity / OpenUIForm / PlaySound"] --> B["์ฝ์ด ๋งค๋์ <br>(EntityManager ๋ฑ)"]
B --> C["IResourceManager"]
C --> D["ResourceManager"]
D --> E["Addressables.LoadAssetAsync"]Mermaid
๋ณต์ฌ
๊ฒ์ ์ฝ๋๋ ๋งจ ์ผ์ชฝ๋ง ์๋๋ค. ๋๋จธ์ง๋ ํ๋ ์์ํฌ๊ฐ ์ฐ๊ฒฐํด ๋ ๋ฐฐ๊ด์
๋๋ค.
๊ธฐ์ตํ ๊ท์น์ ํ๋ โ ์์ ์ด๋ฆ = Addressables ์ฃผ์
ํธ์ถ | ๋๊ธฐ๋ ๋ฌธ์์ด | Addressables ์ ๋ฑ๋ก๋ ๊ฒ |
ShowEntity(id, typeof(Enemy), "Zombunny", "Enemy", data) | "Zombunny" | Zombunny.prefab ์ ์ฃผ์ Zombunny |
OpenUIForm("HUDForm", "Default") | "HUDForm" | HUDForm.prefab ์ ์ฃผ์ HUDForm |
PlaySound("PlayerHurt", "Soundeffects", position) | "PlayerHurt" | Player Hurt.wav ์ ์ฃผ์ PlayerHurt |
SceneComponent.LoadScene("Assets/Scenes/Stage01.unity") | ์ ์ฒด ๊ฒฝ๋ก | ์ฌ์ ์ฃผ์ (์ฌ๋ง์ Assets/ ๋ก ์์ํ๊ณ .unity ๋ก ๋๋์ผ ํ๋ค) |
์ฃผ์๊ฐ ํ ๊ธ์๋ผ๋ ๋ค๋ฅด๋ฉด(๋์๋ฌธ์ ํฌํจ) ๋ก๋๊ฐ ์คํจํฉ๋๋ค. ์คํจ๋ ์์ธ๊ฐ ์๋๋ผ ์คํจ ์ด๋ฒคํธ๋ก๋ง ์ค๊ณ , ํ๋ฉด์๋ ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค.
์ฃผ์ ๋ฌธ์์ด์ ์ฝ๋ ๊ณณ๊ณณ์ ์ง์ ์ ์ง ๋ง๊ณ ์์ ํด๋์ค์ ๋ชจ์ผ์ธ์. ์์ ๋ UITable, SoundTable, EnemyTable ์ ๋ชจ์ ๋์์ต๋๋ค.
์ ์์ ์ ๊ฒ์์ ์ถ๊ฐํ๋ ์ ์ฐจ
1.
Window โ Asset Management โ Addressables โ Groups ๋ฅผ ์ฐ๋ค.
2.
์์
์ ๊ทธ๋ฃน์ผ๋ก ๋์ด๋ค ๋๋๋ค.
3.
์ฃผ์๋ฅผ ์งง์ ํค๋ก ๋ฐ๊พผ๋ค. (์ฌ๋ฌ ๊ฐ ์ ํ โ ์ฐํด๋ฆญ โ Simplify Addressable Names)
4.
์์ ํด๋์ค์ ๊ทธ ๋ฌธ์์ด์ ์ถ๊ฐํ๊ณ , ์ฝ๋์์ ShowEntity / OpenUIForm / PlaySound ์ ๋๊ธด๋ค.
์ํฐํฐ ํ๋ฆฌํน์ด๋ผ๋ฉด ๋ก์ง ์คํฌ๋ฆฝํธ๋ฅผ ๋ถ์ด์ง ์์ ์ํ๋ก, UI ํผ ํ๋ฆฌํน์ด๋ผ๋ฉด ๋ฃจํธ์ UIFormLogic ์ ๋ถ์ธ ์ํ๋ก ๋ฑ๋กํฉ๋๋ค.
์ง์ ์์ ์ ๋ก๋ํด์ผ ํ ๋
์ํฐํฐยทUIยท์ฌ์ด๋๊ฐ ์๋ ์์
์ ResourceComponent ๋ฅผ ์ง์ ์๋๋ค.
ResourceComponent resource = GameEntry.GetComponent<ResourceComponent>();
resource.LoadAsset("EnemyStats", new LoadAssetCallbacks(
(assetName, asset, duration, userData) => { mStats = (EnemyStatsAsset)asset; },
(assetName, status, errorMessage, userData) => { Log.Error("๋ก๋ ์คํจ: {0}", errorMessage); }));
// ๋ค ์ผ์ผ๋ฉด ๋ฐ๋์ ๋๋ ค์ค๋ค. ๋ก๋ 1ํ๋น ์ ํํ 1ํ
resource.UnloadAsset(mStats);
C#
๋ณต์ฌ
๊ท์น | ์ด์ |
๊ฒฐ๊ณผ๋ ์ฝ๋ฐฑ์์ ๋ฐ๋๋ค | ๋ก๋๋ ๋น๋๊ธฐ๋ค. ํธ์ถ ๋ค์ ์ค์์๋ ์์ง ์๋ค |
LoadAsset ํ ๋ฒ์ UnloadAsset ํ ๋ฒ | ์ง์ด ์ ๋ง์ผ๋ฉด ์์
์ด ๋ฉ๋ชจ๋ฆฌ์์ ๋ด๋ ค๊ฐ์ง ์๋๋ค |
์คํจ ์ฝ๋ฐฑ์ ๋น์ ๋์ง ์๋๋ค | ์ฃผ์ ์คํ๋ฅผ ์ฐพ์ ์ ์ผํ ๋จ์๋ค |
ResourceComponent ์ API
๋ฉ์๋ | ์ฉ๋ |
LoadAsset(์ฃผ์, callbacks[, userData]) | ์์
ํ๋๋ฅผ ๋น๋๊ธฐ๋ก ๋ก๋ |
UnloadAsset(asset) | ๋ก๋ํ ์์
์ ๋๋ ค์ค๋ค |
LoadScene / UnloadScene | ์ฌ ๋ก๋ยท์ธ๋ก๋. ๋ณดํต SceneComponent ๋ฅผ ํตํด ์ด๋ค |
UnloadUnusedAssets(performGCCollect) | ์๋ฌด๋ ์ฐธ์กฐํ์ง ์๋ ์์
์ ๋ฆฌ๋ฅผ ์์ฝํ๋ค. ์คํ
์ด์ง ์ ํ ์งํ์ ๋ถ๋ฅธ๋ค |
ForceUnloadUnusedAssets(performGCCollect) | ๊ฐ๊ฒฉ ์ ํ ์์ด ๋ค์ ํ๋ ์์ ์ ๋ฆฌํ๋ค |
LoadAsset ์๋ ํ์
(assetType)๊ณผ ์ฐ์ ์์(priority)๋ฅผ ๋ฐ๋ ์ค๋ฒ๋ก๋๋ ์์ง๋ง, ์ด ์๋์
์์๋ ๋ ๋ค ๋ฌด์๋๊ณ ์ฃผ์๋ง์ผ๋ก ๋ก๋ํฉ๋๋ค.
์์ GameFramework ๋ฌธ์๋ฅผ ํจ๊ป ๋ณผ ๋
์์์ ๋ฌธ์๋ ์์ (StarForce ๋ฑ)์๋ ์ด ์๋์
์ ์๋ ๊ธฐ๋ฅ์ด ๋์ต๋๋ค. ํท๊ฐ๋ฆฌ์ง ์๋๋ก ์ ๋ฆฌํฉ๋๋ค.
์์์ ๋์ค๋ ๊ฒ | ์ด ์๋์
|
์์
์ด๋ฆ์ ์ ์ฒด ๊ฒฝ๋ก ("Assets/GameMain/Entities/Player.prefab") | Addressables ์ฃผ์ ("Player") |
๋ฆฌ์์ค ๋ชจ๋, ๋ฒ์ ํ์ธ, ๋ฆฌ์์ค ์
๋ฐ์ดํธ Procedure | ์์. ํจ์น๋ Addressables API ๋ก ์ง์ ํ๋ค |
Resource Editor / Builder / Analyzer ์ฐฝ | ์์. Addressables Groups ์ฐฝ์ ์ด๋ค |
LoadBinary | ๋ฏธ์ง์. TextAsset ์ผ๋ก ๋ฑ๋กํด LoadAsset ์ผ๋ก ์ฝ๋๋ค |
HasAsset ์ผ๋ก ์กด์ฌ ํ์ธ | ํญ์ "์์"์ ๋๋ ค์ฃผ๋ฏ๋ก ํ์ธ ์ฉ๋๋ก ์ธ ์ ์๋ค |
๋ก๋ฉ ์งํ๋ฅ ยท์์กด ์์
์ด๋ฒคํธ | ๋ฐ์ํ์ง ์๋๋ค. ์ฑ๊ณตยท์คํจ ์ด๋ฒคํธ๋ง ์จ๋ค |
์คํ ์ ์ ํ์ธํ ๊ฒ
Addressables Groups ์ฐฝ์ Play Mode Script ๋ฅผ Use Asset Database (fastest) ๋ก ๋์ธ์. ์ด ๊ฐ์ Library/ ์ ์ ์ฅ๋์ด git ์ผ๋ก ๊ณต์ ๋์ง ์์ผ๋ฏ๋ก, ํ๋ก์ ํธ๋ฅผ ๋ฐ์ ์ฌ๋๋ง๋ค ํ ๋ฒ์ฉ ํด์ผ ํฉ๋๋ค. Use Existing Build ์ธ ์ฑ๋ก ๋ฒ๋ค์ ๋น๋ํ ์ ์ด ์์ผ๋ฉด ๋ชจ๋ ๋ก๋๊ฐ ์คํจํด ์ํฐํฐ๊ฐ ํ๋๋ ๋จ์ง ์์ต๋๋ค(
01. ํ๋ก์ ํธ ์ธํ
โ ํ๋ ์์ํฌ๊ฐ ์ผ์ง๋ ์ต์ ์กฐ๊ฑด).





