기존 에셋 시스템의 장단점
- 직접 레퍼런스
- 장점
- 쉽고 코드 길이가 줄어든다.
- 단점
- 실제로 쓰지 않아도 메모리가 올라가 있다.
- 장점
- 리소스 폴더
- 장점
- 쉽고 편리하다
- 단점
- 빌드할 때, 리소스 폴더 안의 파일은 각 파일마다 빌드하므로 빌드 사이즈가 커진다.
- 게임 시작 시 리소스 파일에 대한 인덱싱을 하다보니 앱 시작 시간이 길어진다.
- 리소스폴더 안에 접근할 때는 파일 이름을 스트링으로 가지고 있기 때문에 에셋의 이름을 변경할 수가 없다.
- 결론
- 사용할 때, 경계해야 한다.
- 장점
- 에셋 번들
- 장점
- 빌드 사이즈 절감
- 앱 시작 시간이 짧다
- 단점
- 에셋번들 종속성(depedency), 버전 관리로 인해 사용하기 까다롭다.
- 모든 것이 코드로 되어 있어서 에디터 수준에서 작업이 거의 없다.
- 장점
기존 에셋 시스템의 워크 플로
보통 직접 레퍼런스 -> 리소스 폴더 -> 에셋번들의 순서로 개발이 진행되고, 이런 경우 코드 변경이 필수다.
Addressable Asset System
Addressable Asset?
- Address가 할당된 에셋. 이 Address로 에셋에 접근할 수 있다.
- Addressable Asset System = Asset 관리 + 로딩 + 빌드
장점
- 에셋 빌드와 배포의 단순화
- 에셋 관리 용이
- 코드 변경 X
구현
패키지 매니저에서 Addressables System 적용
Inspector에서 해당 에셋을 클릭하고 Addressable에 체크 (해당 내용은 Addressable 윈도우에서 확인 가능)
"어드레스"를 이용한 Loading, Instantiating
GameObject myGameObj; //// 로딩을 하고, 로딩이 끝나면 발동시킬 함수를 구독해놓을 수 있다. ... Addressables.LoadAsset<GameObject>("AssetAddress").Completed += onLoadDone; } //// 로딩이 끝나면 발동하는 콜백 함수 private void onLoadDone(IAsyncOperation<Sprite> obj) { myGameObject = obj.Result; } //// 실제 Instantiating Addressbles.Instantiate<GameObject>("AssetAddress"); // "AssetReference"를 이용한 로딩과 Instantiating // - Inspector에서 Address 입력을 도와준다. // - 직접 타이핑이 없어 오타 발생이 없다. public AssetReference spawnObject; public void Spawn() { spawnObject.InstantiateAsync(); // 또는 spawnObject.LoadAsset<GameObject>(); spawnObject.Instantiate<GameObject>(pos, rot); }
어드레스 해제
- LoadAsset => ReleaseAsset()
- Instantiate() => ReleaseInstance()
Addressables.ReleaseAsset<GameObject>(obj); Addressables.ReleaseInstance<GameObject>(obj, delay); AddRef.ReleaseAsset<GameObject>(obj); AddRef.ReleaseInstace<GameObject>(obj);
작동 방식
Addressable은 크게 '초기화'와 '로드'일 때 작동한다.
내부 파츠는 리소스의 어드레스를 관리하는 'Addressables'과 실제 파일을 관리하는 'Resource Manager'가 있다.
초기화
- Addressble
- Content Catalog를 참고해 실제 리소스 위치를 담는 Resource Locator를 형성한다.
- Content Catalog = 주소 정보를 Serialization해서 JSON파일 형태로 가지고 있다.
- Resource Manager
- Provider를 등록한다.
- Provider = 각 파일 형식에 따라 최적화된 로드 방식을 가지고 있다.
- Addressble
로드
사용자가 코드로 로드를 시작한다. 이 때, Addressables에 주소를 넘겨준다.
Addressables의 Resource Locator가 실제 리소스 위치를 Resource Manager에게 넘긴다.
Resource Manager는 실제 리소스를 보고 적절한 Provider를 선정해서 AsyncOperation을 반환한다.
로드가 다 되면 로드 완료 이벤트가 발동한다.
'Coding > Unity, C#' 카테고리의 다른 글
Unity, Design Pattern: Command Pattern (0) | 2021.02.25 |
---|---|
Unity : Virtual, Abstract, Interface (0) | 2021.02.23 |
[Unity] Save, Load (0) | 2021.02.23 |
[Unity / Mirror] Authority (0) | 2021.02.19 |
Unity : Built-in Pipeline, Forward Rendering Path (0) | 2021.02.16 |