프로젝트 일지/Unity

[Unity/TIL] Addressable 연구(2)

톰마토 2025. 4. 9. 22:22

2025.04.08 - [공부 기록/유니티 Unity] - [Unity/TIL] Addressable 연구

 

[Unity/TIL] Addressable 연구

이번 프로젝트에서는 Addressable을 사용할 것이다. 빌드 시 Resources.Load를 사용하는 것보다 무조건 빌드 용량에 이점이 있기 때문이다. 그외에도 다음과 같은 장점들이 있다. 서버와 Addressable을 함

ramenkirby.tistory.com

 

Addressables.ResourceManager.CreateGenericGroupOperation(operations);

어드레서블에서 제공하는 위 함수를 사용하면 operations 리스트를 하나의 Group Operation으로 묶어준다. 이것도 로딩이 완료될 때 Completed를 제공한다.

 

이 기능을 활용해서 여러 에셋을 동시에 비동기 로드할 수 있게 만들어줬다. 아래 코드는 ResourceManager의 기능으로서 만든 함수이다. 중복 등록을 방지하며 키 목록을 내부 딕셔너리에 저장해둔다. 

private readonly Dictionary<string, List<string>> keys = new();
private readonly Dictionary<string, AsyncOperationHandle> operations = new();

public AsyncOperationHandle CreateGenericGroupOperation(AsyncOperationHandle<IList<IResourceLocation>> groupLocation, Action onComplete = null)
{
    var locations = groupLocation.Result;
    var keys = new List<string>(locations.Count);
    var operations = new List<AsyncOperationHandle>(locations.Count);
    foreach (var location in locations)
    {
        string key = location.PrimaryKey;
        keys.Add(key);

        var operation = LoadAssetAsync<Object>(key);
        operations.Add(operation);
    }

    string label = groupLocation.DebugName;
    if (!this.keys.ContainsKey(label))
        this.keys.Add(label, keys);

    var groupOperation = Addressables.ResourceManager.CreateGenericGroupOperation(operations);
    groupOperation.Completed += operation => onComplete?.Invoke();

    if(!this.operations.ContainsKey(label))
        this.operations.Add(label, groupOperation);

    Addressables.Release(groupLocation);
    return groupOperation;
}

이런 기능을 만들어두면 여러 리소스를 라벨 단위로 로드하고 관리할 수 있어진다. 씬을 로드할 때 해당 씬에서 필요한 리소스들을 로드해두고, 씬을 나갈 때 해제할 수 있도록 하면 될 것 같다.

+ 추가로 씬도 StateMachine 으로 만들어서 씬을 로드하기 전과 후에 할 일들을 처리해주려고 한다.