- ResourceManager
CageSystem
진행 중인 팀 프로젝트에서 제작한 ResourceManager
목적
Resource들을 한곳에서 로드하고 관리하는 것으로 Resource 관리를 최적화 하기 위해서 만들었다.
처음에는 Reousrces를 사용해서 구현 하였지만
효율적으로 관리하기 위해서 Addressable을 사용하도록 변경 했다.
ResourceManager - Resources
-
Singleton 패턴
Resource를 사용해야 되는 모든 곳에서 쉽게 ResourceManager에 접근하고 사용해서 리소스들을 불러오게 하기 위해서 Singleton 패턴으로 구현했다. 어떤 씬에서든 항상 필요한 매니저 이므로 Monobehaviour를 상속받지 않아 씬 전환에서 자유롭도록 구현했다.
-
Dictioanry
모든 리소스의 Object 들을 각 Type에 따라서 Dictionary<Type, Dictionary<string, Object>>로 관리했다. Dictionary 자체는 private로 하고 접근하는 메서드들을 만들어서 이미 로드된 리소스는 중복해서 다시 로드하지 않도록 구현했다.
-
Generic, Overload
제네릭을 사용해서 여러가지 타입의 리소스를 로드할 수 있도록 했고 폴더의 경로가 다른 경우를 대비해서 오버로드로 직접 경로를 지정할 수 있도록 구현하였다.
-
Lazy Loading
여러가지 카드와 몬스터 리소스들을 관리해야 되지만 카드와 몬스터들이 항상 전부 쓰이는 것이 아니라고 생각해서 LazyLoading 방식을 사용했다. 해당 리소스를 처음 사용한다면 로드를 하지만 이미 로드한 적 있다면 캐싱된 Dictionary를 통해서 꺼내서 사용한다. 그리고 너무 많은 리소스가 쌓일 경우를 대비해서 씬을 이동할 때마다 캐싱되어 있는 리소스의 Dictionary를 클리어하고 참조 하고 있지 않는 리소스들을 UnLoad()하는 메서드를 실행시키도록 했다.
ResourceManager - Addressable
-
변경 이유
팀원들과 리소스를 어떻게 효율적으로 관리할 수 있을지에 대해서 고민하다가 Addressalble에 대한 이야기가 나왔고 Addressables가 remote방식으로 리소스들을 관리할 수도 있고, 메모리나 성능 그리고 편의성적인 측면에서 Resources를 사용하는 것 보다 이득인 점이 많다고 생각해서 Addressables에 대해서 공부하고 리소스 매니저를 변경하게 되었다.
-
Addressable, AssetReference
Addressables는 Asset bundle을 내부적으로 사용하며 리소스를 효율적으로 관리해주는 시스템이다. Address를 사용해서 세팅 해둔 리소스에 접근할 수 있고 AssetReference 객체로 주소를 저장해두고 사용할 수 있기 떄문에 리소스들을 확인하여 AssetReference들을 캐싱해두고 필요할 떄 AssetReference를 통해서 리소스를 로드하는 방식을 사용했다.
-
Async, Task
Addressables는 Async 방식으로 사용하는 것을 유니티에서 권장하고 있었고, ResourceManager는 Monobehaviour를 상속받지 않고 사용했기 때문에 async, Task를 사용해서 비동기 메서드를 구현했다. 두 개의 콜백 함수를 매개 변수로 받을수 있도록 구현했는데 로드한 프리펩으로 해야할 작업을 Action<T>로 받고 로드가 전부 끝나고 났을때 하게 될 작업을 Action으로 받아서 실행하도록 구현했다.