728x90

유니티 Resources폴더를 통해 로드하는 방법의 단점.

  1. 무조건 최종 빌드에 모든 리소스가 딸려 나가기 때문에 사용하지 않는 리소스가 있다면 쓸데없이 메모리를 차지 하게 될 것이다.
  2. 처음 시작할 때도 Resorces를 로드하는 부분이 있어 느리다고 알려져 있다.

그래서 사용해야할 것이 Asset Bundle과 Addressable인데 그 중 Addressable의 사용법에 대해 알아보도록 하자.

Unity Package Manager에서 Addressable을 Install하면 사용하기 위한 준비는 끝난다.

이제 Resources폴더가 아닌 다른 이름(아무거나 상관없음)으로 된 폴더에 프리팹을 하나 생성해두고

Addressable체크를 해주게 되면

Default Group에 해당 프리팹이 추가될 텐데 처음에는 이름이 보이는 것 처럼 Test가 아닌데 바꿔주면 된다. 이게 이제 코드 상에서 로드할 때 구분할 key값이 되는 것이며, 기본 Resources폴더에 넣어두면 위에 보이는 Built In Data에 들어가게 되는데 이건 기존처럼 처음 빌드할 때 딸려나가는 리소스 들이다. 그룹은 여러개로 구분해서 만들 수 있고 이건 구분짓기 나름이다. 해당 창은 Window > Asset Management > Addressables > Groups를 누르면 된다.

이제 테스트용 스크립트와 오브젝트를 만들어서 프리팹을 로드하는 코드를 만들어보자. 먼저 알아야할 것이 Addressable은 기본적으로 비동기형식으로 동작한다는 것을 기억해야한다. 비동기 형식에 익숙하지 않다면 어렵게 느껴질 수 있는데 쉽게 생각해서 예약을 걸어둔다고 생각하면 된다.

기존의 Resources.Load()같은 경우 경로를 입력하면 해당경로에 있는 리소스를 로드한 후 다음 코드로 넘어간다. 이게 비동기형식일 경우에는 로드한 후 다음코드로 넘어가는게 아니라 일단 로드해달라는 요청만 한 후 다음 코드로 넘어간다. 그럼 코딩을 어떻게 해야 할까

GameObject obj = Resources.Load<GameObject>("Test");
AsyncOperationHandle<GameObject> handle = Addressables.LoadAssetAsync<GameObject>("Test");
 

Resources.Load함수를 호출하면 제네릭으로 설정한 타입의 오브젝트를 반환한다. 하지만 Addressable의 LoadAssetAsync함수는 AsyncOperationHandle이라는 이름도 긴 이상한 객체를 반환한다.

 

 

AsyncOperationHandle | Package Manager UI website

AsyncOperationHandle The AsyncOperationHandle struct is returned from several methods in the Addressables API. The main purpose of the AsyncOperationHandle is to allow access to the status and result of an operation. The result of the operation will be vai

docs.unity3d.com

handle의 여러 사용법을 알아보고 싶다면 해당 유니티 문서를 읽어보기 바란다.

문서에서 필요한 부분만 설명하면

  1. 로드한 타입과 핸들의 타입이 맞지 않으면 예외가 발생한다.
  2. Status속성을 통해 로딩이 완료되었는지 확인 가능하며 그럴경우 Completed를 통해서 이벤트를 등록할 수 있다.
  3. 다 사용했으면 Release를 호출하여 메모리를 해제하여야 한다.

위에서 LoadAssetAsync함수는 로드해달라는 요청만 하고 다음 코드로 넘어간다고 언급했었다. 그럼 완료되는 것을 Completed를 통해 알 수 있다는 것을 확인했으니 리소스 로딩이 완료 되었을 때 해야할 것을 함수로 만들어 이벤트로 걸어놓으면 알아서 완료되는 순간 호출이 될 것이다. Test프리팹의 이름을 호출하는 코드를 만들어보자.

AsyncOperationHandle<GameObject> handle = Addressables.LoadAssetAsync<GameObject>("Test");
handle.Completed += (op) =>
{
    GameObject go = op.Result;
    Debug.Log(go.name);

    Addressables.Release(handle);
};
 

람다를 사용하여 이벤트를 걸어 주었고 간단하게 로딩이 완료되면 해당 오브젝트에 이름을 출력하고 Release를 통해 핸들 메모리를 해제해주는 함수를 만들었다.

출력이 잘 되는 것을 확인할 수 있다.

추가적으로 메모리 사용량을 모니터링 하는 기능이 있으니 확인하고 마무리 하겠다.

AddressableAssetSettings에서 Send Profiler Events항목을 체크하고

Window > Asset Management > Addressables > Event Viewer을 눌러보면 게임이 실행 중일 때 사용되고 있는 리소스를 확인할 수 있다. 만약 해제 되었어야하는 메모리가 있다면 체크해서 해제해주자

 

728x90

'Unity > Unity 기초' 카테고리의 다른 글

오브젝트 풀링  (0) 2023.05.15
Scene 전환하기  (0) 2023.05.15
EventSystems Interface  (0) 2023.05.15
GetComponentsInChildren, GetChild  (0) 2023.05.15
Load, Instantiate, Destroy  (0) 2023.05.15

+ Recent posts