내일배움캠프 Unity 32일차 TIL - Addressable 기초

Wooooo·2023년 12월 12일
0

내일배움캠프Unity

목록 보기
34/94

오늘의 키워드

개인 과제에 간단한 Addressable을 적용했다.
Addressable로 로드한 리소스를 Dictionary로 관리하는 ResourceManager도 작성해봤다.


Addressable

Resources의 편리함과 AssetBundle의 버전관리, 원격로드 와 같은 장점들을 합친 에셋 관리 기능이라고 한다.

  • 에셋에 주소값을 부여하고, 그 주소값을 이용해서 Load할 수 있다.
    • Resources 폴더에서 하위디렉토리명/파일명으로 Load했던 것처럼 편리하다.
  • 필요한 에셋만 Load할 수 있으므로, 메모리 최적화가 가능하다.
    • Resources 폴더는 빌드 시 메모리에 적재된다. 따라서 메모리의 낭비가 있다.
  • 앱을 재배포하지 않고도 특정 에셋을 업데이트 할 수 있다.
    • 앱 실행 시, 서버에 있는 에셋의 버전을 비교한 후, 업데이트가 필요하면 다운로드 할 수 있다.
  • 캐싱된 리소스를 메모리에서 해제하는 Release 메서드가 있다.

이외에도 정말 많은 기능을 제공해서, 파면 팔 수록 계속 깊어지는 기능인 것 같다.
나는 다음 팀 프로젝트에서 이 기능을 사용하기위해, 이번 개인 과제에 에셋에 Address와 Label을 부여하고, 이를 이용해서 필요한 에셋만 Load/Release할 수 있도록 해봤다.


ResourceManager

이전 팀 프로젝트에서 Addressable을 사용해본 경험이 있으신 팀원분께서 코드를 공유해주셨다.

이 매니저의 기능을 간단하게 말하면, Dictionary로 캐싱된 리소스들을 관리하는 매니저라고 할 수 있겠다.

key는 에셋의 Address를 가리킨다.
valuekey를 이용해서 Addressable에서 Load한 Object이다.

ResourceManager에게 Address를 매개변수로 Load를 요청하면, Addressables.LoadAssetAsync를 이용하여 에셋를 로드하고, 로드된 리소스를 Dictionary에 저장한다.
옵셔널 파라미터로 AsyncOperationHandle.Completed 이벤트에서 호출될 callback을 지정해줄 수도 있다.

Address를 이용해서 이미 Dictionary에 캐싱된 리소스를 참조할 수 있는 메서드도 제공한다.
캐싱된 리소스(Prefab 등)을 이용하여 Instantiate를 할 수 있게 해준다.

ResourceManager에게 Address를 매개변수로 UnLoad를 요청하면, Dictionary에서 캐싱된 리소스를 Addressable.Release하고, Dictionary에서 key를 지운다.


Test UI를 Addressable로 Load해보기

Test UI Prefab에 Addressable 등록하기

address는 클래스명.prefab으로 정해줬다.

ResourceManager에게서 prefab 받아오기

UI를 열 때, ResourceManager에게서 UI의 prefab을 받아오게 바꿔줬다.

UIManager.cs

    public T ShowSceneUI<T>(string name = null) where T : UI_Scene
    {
        if (string.IsNullOrEmpty(name))
            name = typeof(T).Name;
		
        // ResourceManager에게서 prefab을 받아옴
        GameObject obj = ResourceManager.Instance.Load<GameObject>($"{name}.prefab");
        obj = Instantiate(obj, Root.transform);

        _sceneUI = obj.GetOrAddComponent<T>();
        return _sceneUI as T;
    }

UIManager 초기화 시, Test UI들을 Load하기

일단 임시로 UIManager를 초기화할 때, 각 prefab의 address를 이용해서 리소스를 불러오게 해봤다.
이후에 GameManagerSceneManager 등을 작성해서, Scene에 필요한 에셋들을 불러올 때 같이 불러올 수 있는 구조로 바꿔야겠다.

UIManager.cs

    protected override void Initialize()
    {
        SetCanvas(Root);
        SetEventSystem(gameObject);

        //Test Code
        ResourceManager.Instance.LoadAsync<GameObject>($"UI_Scene_Test.prefab", obj => ShowSceneUI<UI_Scene_Test>(obj.name));
        ResourceManager.Instance.LoadAsync<GameObject>($"UI_PopUp_Test.prefab");
    }
profile
game developer

0개의 댓글