๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Unity

Addressable (๋กœ์ปฌ)

by LemongO 2024. 5. 31.

๐Ÿ“Œ Addressable

์•„์ง ๊ณต๋ถ€๊ฐ€ ๋งŽ์ด ํ•„์š”ํ•œ ์˜์—ญ์ธ ๊ฒƒ ๊ฐ™์ง€๋งŒ
์ผ๋‹จ ํ˜„์—…์—์„œ ๋Œ€ํ‘œ์ ์œผ๋กœ ์“ฐ์ด๋Š” ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด๋ผ๊ณ  ํ•˜๋‹ˆ ์ง์ ‘ ์จ๋ณด๋ฉด์„œ ์•Œ์•„๊ฐ€๋ณด๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค.

 

์–ด๋“œ๋ ˆ์„œ๋ธ”(Addressables)๋Š” Unity ์—”์ง„์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž์‚ฐ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž๋Š” ์ž์‚ฐ(์ด๋ฏธ์ง€, ์˜ค๋””์˜ค, ํ”„๋ฆฌํŒน ๋“ฑ)์„ ํšจ์œจ์ ์œผ๋กœ ๋กœ๋“œํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋“œ๋ ˆ์„œ๋ธ” ์‹œ์Šคํ…œ์€ ์ž์‚ฐ์„ ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ, ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์™€ ๋Ÿฐํƒ€์ž„ ๋™์•ˆ ์ž์‚ฐ์„ ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋“œ๋ ˆ์„œ๋ธ”์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
1. ์ฃผ์†Œ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ: ์ž์‚ฐ์„ ์ฃผ์†Œ๋กœ ์ฐธ์กฐํ•˜์—ฌ, ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์ž์‚ฐ ๊ด€๋ฆฌ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
2. ๋™์  ๋กœ๋”ฉ: ํ•„์š”ํ•  ๋•Œ ์ž์‚ฐ์„ ๋กœ๋“œํ•˜๊ณ , ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ ์–ธ๋กœ๋“œํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.
3. ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ ์ตœ์ ํ™”: ์ž์‚ฐ ๋ฒˆ๋“ค์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ์ด์šฉํ•ด ๊ฒŒ์ž„์˜ ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ๊ฐ„์„ ์ค„์ด๋ฉฐ, ํŒจ์น˜ ํฌ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
4. ๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ ์ง€์›: ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ์ผ๊ด€๋œ ์ž์‚ฐ ๋กœ๋”ฉ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์–ด๋“œ๋ ˆ์„œ๋ธ”์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž์‚ฐ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ , ๊ฒŒ์ž„์˜ ์„ฑ๋Šฅ๊ณผ ์œ ์—ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋” ๋‚˜์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

GPT ์„ ์ƒ๊ป˜์„œ ๋งํ•˜๋Š” ์–ด๋“œ๋ ˆ์„œ๋ธ” ์ด๋‹ค.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  • ๋จผ์ € ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ๋‹ค.
    • Unity Editor - Window - Package Manager - Unity Registry - Addressables

 

  • ์–ด๋“œ๋ ˆ์„œ๋ธ” ๊ทธ๋ฃน์ฐฝ์„ ์—ฐ๋‹ค.
    • Unity Editor - Window - Asset Management - Addressables - Groups

 

  • ํ”„๋ฆฌํŒน์—์„œ Addressable ์ฒดํฌ๋ฅผ ํ•˜๊ฑฐ๋‚˜
  • ๋“œ๋ž˜๊ทธ ๋“œ๋กญ์œผ๋กœ ๋“ฑ๋ก ๊ฐ€๋Šฅํ•˜๋‹ค

 

 

 

์–ด๋“œ๋ ˆ์„œ๋ธ”์€ ์ด๋ฆ„์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๊ทธ ์ฃผ์†Œ๋กœ Key(Addressable Name)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ง€๊ธˆ์€ Key๊ฐ€ ๋„ˆ๋ฌด ๊ธธ๊ธฐ ๋•Œ๋ฌธ์— ์ข€ ์ค„์ด๋„๋กํ•œ๋‹ค.

 

๋˜ํ•œ ๊ทธ๋ฃน์„ ๋”ฐ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•ด ๊ทธ๊ณณ์œผ๋กœ ์˜ฎ๊ธด๋‹ค.

 

 

 

Resources์™€ Addressable์˜ ์ฐจ์ด์  ์ค‘ ํ•˜๋‚˜๋กœ

Resources๋ฐฉ์‹์€ ๋ฐ˜๋“œ์‹œ Resources ํด๋” ๋‚ด์— ์—์…‹์ด ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ,

Addressable๋ฐฉ์‹์€ ์—์…‹์ด ์–ด๋””์— ์žˆ๋Š” ์ฃผ์†Œ๋กœ ์ฐธ์กฐ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์„ค์ •์„ ์ข€ ๋” ๊ฑด๋“œ๋ ค์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ์ง€๋งŒ

์ด์ •๋„๋งŒ ํ•˜๋”๋ผ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋˜์—ˆ๋‹ค.

 


์‹ค์ œ ์‚ฌ์šฉ

using UnityEngine.AddressableAssets;

1์ผ 1๊ตฌํ˜„์—์„œ ์ฃผ๋กœ Addressables ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ ํ…๋ฐ ๋ฐ‘์—๋„ ์–ธ๊ธ‰ ๋  AssetReference๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ

UnityEngine.AddressableAssets ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (์š”์ฆ˜์€ ์ž๋™์™„์„ฑ์ด ์ž˜ ๋ผ ์žˆ์œผ๋‹ˆ ๋ญ...)

 

๊ทธ๋ฆฌ๊ณ  ์–ด๋“œ๋ ˆ์„œ๋ธ”์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™๊ธฐ ๋ฐฉ์‹์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ ์ „๋ถ€ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผํ•œ๋‹ค.

๋™๊ธฐ ๋ฐฉ์‹์€ ๋‹ค ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ์œผ๋กœ ๋‚˜์˜จ๋‹ค

 

ํ•„์š”ํ•  ๋•Œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œ, ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ ์–ธ๋กœ๋“œ

์ฃผ์š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฆฌ์†Œ์Šค๋Š” ์–ธ๋กœ๋“œ๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค.

public class AddressableTester : MonoBehaviour
{
    [SerializeField] AssetReference aRef;

    GameObject go;

    private void Start()
    {
        aRef.InstantiateAsync().Completed +=
            (op) =>
        {
            go = op.Result;

            Invoke("ReleaseGO", 5f);
        };
    }

    private void ReleaseGO()
    {
        aRef.ReleaseInstance(go);        
    }

    private void NextScene()
    {
        SceneManager.LoadScene("TestScene");
    }
}

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ค€๋น„ํ•œ ์ฝ”๋“œ์ด๋‹ค.

 

  • AssetReference : ์–ด๋“œ๋ ˆ์„œ๋ธ”์— ๋“ฑ๋ก๋˜์–ด์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ ์ฐธ์กฐ์ด๋‹ค.
  • AssetReference.instantiateAsync() : ์–ด๋“œ๋ ˆ์„œ๋ธ”์„ ์‚ฌ์šฉํ•œ Instantiate์ด๋‹ค.
    • ๋น„๋™๊ธฐ ๋ฐฉ์‹์ด๋‹ค ๋ณด๋‹ˆ Completed์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋ก์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
    • ํ˜„์žฌ๋Š” GameObject ์ „์—ญ ๋ณ€์ˆ˜์— ์ƒ์„ฑ๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ• ๋‹นํ–ˆ๋‹ค.
  • AssetReference.ReleaseInstance(GameObject) : ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ GameObject๋ฅผ ์ œ๊ฑฐ ๋ฐ ์–ธ๋กœ๋“œ ํ•œ๋‹ค.
  • ์–ธ๋กœ๋“œ ํ–ˆ์„ ๋•Œ์™€ ์•ˆ ํ•˜๊ณ  ์”ฌ์„ ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ”์„ ๋•Œ ์ฐจ์ด๋ฅผ ๋ณด๊ธฐ์œ„ํ•ด NextScene ๋ฉ”์„œ๋“œ๋ฅผ ์ค€๋น„ํ–ˆ๋‹ค.

ํ™•์ธ์„ ์œ„ํ•ด ์–ด๋“œ๋ ˆ์„œ๋ธ” ์ „์šฉ ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์ผ ๋‹ค

Window - Asset Management - Addressables - Event Viewer

 

๋‹จ, ํ”„๋กœํŒŒ์ผ๋Ÿฌ์—์„œ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์–ด๋“œ๋ ˆ์„œ๋ธ” ์„ธํŒ…์˜ Send Profiler Events ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์ฒดํฌํ•ด์•ผํ•œ๋‹ค.

 

 

 

ํ”„๋ฆฌํŒน์„ ์ฐธ์กฐํ•˜๊ณ  ํ™•์ธํ•ด๋ณด์ž

 

 

 

ํ…Œ์ŠคํŠธ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํ•˜์ด์–ด๋ผํ‚ค์ฐฝ์— ์˜ฌ๋ผ์™”๊ณ 

ํ”„๋กœํŒŒ์ผ๋Ÿฌ์—๋„ ๋‚˜์™€์žˆ๋‹ค.

 

5์ดˆ ๋’ค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ํ”„๋กœํŒŒ์ผ๋Ÿฌ ์ƒ์—์„œ๋„ ์–ธ๋กœ๋“œ ๋˜์—ˆ์Œ์„ ํ™•์ธํ–ˆ๋‹ค.

 

 

์ด๋ฒˆ์—” Inovke ํ•จ์ˆ˜๋ฅผ NextScene ๋ฉ”์„œ๋“œ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด์ž.

์ฒ˜์Œ์€ ๊ฐ™๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์”ฌ์ด ๋ณ€๊ฒฝ๋œ ํ›„ ์˜ค๋ธŒ์ ํŠธ ์ž์ฒด๋Š” ์‚ฌ๋ผ์กŒ์ง€๋งŒ

์ด๋ฏธ ์˜ฌ๋ผ์˜จ ๋ฆฌ์†Œ์Šค๋Š” ํ•ด์ œ๋˜์ง€ ์•Š์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

์ฆ‰ ์–ด๋“œ๋ ˆ์„œ๋ธ”์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋งŒ ๋กœ๋“œ์‹œํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ด€๋ฆฌ๋ฅผ ์ข€ ๋” ์„ธ์‹ฌํ•˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ์ ๊ณ  ๋กœ์ปฌ์˜ ๋‚˜๋จธ์ง€๋Š” [1์ผ 1 ๊ตฌํ˜„]์—์„œ ์ž‘์„ฑํ•ด์•ผ๊ฒ ๋‹ค.

LoadAsync ๊ธฐ๋Šฅ๋„ ์จ๋ด์•ผ ํ•˜๊ณ  ์„œ๋ฒ„๋„ ์จ๋ด์•ผํ•˜๋‹ˆ ์ดํ›„ ๋‚ด์šฉ์€ ์ข€ ๋” ๊ณต๋ถ€ํ•ด์„œ ๋‹ค์‹œ ์ž‘์„ฑ์„ ํ•  ์˜ˆ์ •.

'Unity' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[RequireComponent]  (0) 2024.06.06
[RuntimeInitializeOnLoadMethod]  (0) 2024.06.05
Culling (์ตœ์ ํ™”)  (0) 2024.05.09