개인 과제에 간단한 Addressable
을 적용했다.
Addressable
로 로드한 리소스를 Dictionary로 관리하는 ResourceManager
도 작성해봤다.
Resources
의 편리함과 AssetBundle
의 버전관리, 원격로드 와 같은 장점들을 합친 에셋 관리 기능이라고 한다.
하위디렉토리명/파일명
으로 Load했던 것처럼 편리하다.이외에도 정말 많은 기능을 제공해서, 파면 팔 수록 계속 깊어지는 기능인 것 같다.
나는 다음 팀 프로젝트에서 이 기능을 사용하기위해, 이번 개인 과제에 에셋에 Address와 Label을 부여하고, 이를 이용해서 필요한 에셋만 Load/Release할 수 있도록 해봤다.
이전 팀 프로젝트에서 Addressable을 사용해본 경험이 있으신 팀원분께서 코드를 공유해주셨다.
이 매니저의 기능을 간단하게 말하면, Dictionary
로 캐싱된 리소스들을 관리하는 매니저라고 할 수 있겠다.
key
는 에셋의 Address
를 가리킨다.
value
는 key
를 이용해서 Addressable
에서 Load한 Object
이다.
ResourceManager
에게 Address
를 매개변수로 Load를 요청하면, Addressables.LoadAssetAsync
를 이용하여 에셋를 로드하고, 로드된 리소스를 Dictionary
에 저장한다.
옵셔널 파라미터로 AsyncOperationHandle.Completed
이벤트에서 호출될 callback을 지정해줄 수도 있다.
Address
를 이용해서 이미 Dictionary에 캐싱된 리소스를 참조할 수 있는 메서드도 제공한다.
캐싱된 리소스(Prefab 등)을 이용하여 Instantiate를 할 수 있게 해준다.
ResourceManager
에게 Address
를 매개변수로 UnLoad를 요청하면, Dictionary
에서 캐싱된 리소스를 Addressable.Release
하고, Dictionary
에서 key
를 지운다.
address는 클래스명.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
를 초기화할 때, 각 prefab의 address를 이용해서 리소스를 불러오게 해봤다.
이후에 GameManager
나 SceneManager
등을 작성해서, 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");
}