본문 바로가기
Unity/어드레서블 에셋 시스템

어드레서블 에셋 시스템 - 개념: Label로 로드하기

by PlaneK 2020. 6. 26.

Label로 로드하기

Cube와 Sphere 중 하나를 랜덤 생성하는 로직을 Label을 사용해 구현해보자.

Mange Labels를 눌러 Label을 추가한다.

Cube와 Sphere에 'MyLabel'을 달아주자.

사용할 필드는 위 두가지이다.

AssetLabelReference 필드는 라벨을 쉽게 고를 수 있도록 하는 자료형이다.

IList<IResourceLocation>은 '라벨'에 해당하는 에셋들의 경로들이다.

위 API를 통해 라벨을 인자로해서 에셋들의 경로인 IList<IResourceLocation>을 얻는다.

그리고 이 경로를 통해 게임오브젝트를 생성할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.ResourceLocations;
 
public class LabelReferences : MonoBehaviour
{
    // 어드레서블의 Label을 얻어올 수 있는 필드.
    public AssetLabelReference assetLabel;
 
    private IList<IResourceLocation> _locations;
    // 생성된 게임오브젝트를 Destroy하기 위해 참조값을 캐싱한다.
    private List<GameObject> _gameObjects = new List<GameObject>();
 
    public void GetLocations()
    {
        // 빌드타겟의 경로를 가져온다.
        // 경로이기 때문에 메모리에 에셋이 로드되진 않는다.
        Addressables.LoadResourceLocationsAsync(assetLabel.labelString).Completed +=
            (handle) =>
            {
                _locations = handle.Result;
            };
    }
 
    public void Instantiate()
    {
        var location = _locations[Random.Range(0, _locations.Count)];
 
        // 경로를 인자로 GameObject를 생성한다.
        // 실제로 메모리에 GameObject가 로드된다.
        Addressables.InstantiateAsync(location, Vector3.one, Quaternion.identity).Completed +=
            (handle) =>
            {
                // 생성된 개체의 참조값 캐싱
                _gameObjects.Add(handle.Result);
            };
    }
    
    public void Release()
    {
        if (_gameObjects.Count == 0)
            return;
 
        var index = _gameObjects.Count - 1;
        // InstantiateAsync <-> ReleaseInstance
        // Destroy함수로써 ref count가 0이면 메모리 상의 에셋을 언로드한다.
        Addressables.ReleaseInstance(_gameObjects[index]);
        _gameObjects.RemoveAt(index);
    }
}
 

Addressables.LoadResourceLocationsAsync는 에셋을 메모리에 로드하지 않고 경로만 추출하는 api다.

IList형태로 반환하기 때문에 해당 Label의 다수 에셋을 한번에 로드할 수 있다.

 

 

댓글