어드레서블 (Addressable) - 1. 기본
어드레서블 에셋 시스템
어드레서블 에셋 시스템은 에셋 번들을 대체하는 기술이 아니다.
그냥 에셋 관리의 편의성을 위한 유틸리티라고 보면 된다.
간단하게 말하면, 아래와 같이 에셋에 주소(address)를 부여해주는게 어드레서블의 핵심이라 할 수 있다.
그리고 어드레서블 에셋 시스템은 이러한 주소를 이용하여 에셋의 관리, 로딩, 빌드를 통합한 시스템이다.
어드레스(address)
에셋에 부여된 어드레스(address)는 다음과 같이 활용할 수 있다.
버튼을 누르면 지정된 프리팹을 생성하는 Spawner가 있다고 하자.
위와 같이 프리팹을 직접 연결하는 방식은 스포너가 생성되는 순간 연결된 프리팹도 메모리에 올라가서 좋지않다.
이를 위해 직접 에셋의 경로를 Spanwer에 전달하는 방식을 써야 한다. 보통 이 부분은 경로를 하드코딩하거나 별도의 에디터 툴을 만들어서 연결된 프리팹의 경로를 변환하기도 한다.
public class Spawner : MonoBehaviour
{
public AssetReference prefab;
public void OnClickBtn()
{
if (prefab == null) return;
prefab.InstantiateAsync();
}
}
이렇게 AssetReference를 사용하면 프리팹의 어드레스를 전달해줄 수 있다.
어드레서블 그룹 (Addressable Group)
에셋에 어드레스를 부여했다면 해당 에셋들을 다시 그룹으로 분류할 수 있다. 이 어드레서블 그룹은 에셋 번들이라고 보면 된다. 에셋을 빌드하면 해당 그룹별로 번들이 빌드가 된다.
그룹별로 아래와 같이 다양한 세팅이 가능하다.
신기한건 build path와 load path까지 어드레서블 에셋 시스템이 다 해준다는 것.
언로드
기존의 에셋 번들 시스템에서는 에셋 번들 단위로 언로드를 했다. 어드레서블 에셋 시스템도 똑같다.
다만 사용자가 특정 에셋 번들을 명시적으로 언로드 할 일은 없는데, 어드레서블 에셋 시스템 내부적으로 에셋과 에셋 번들에 대한 레퍼런스 카운트를 유지하기 때문이다. 그리고 카운트가 0이 된 에셋 번들은 그제서야 언로드 된다.
예를 들어 stuff 라는 번들에 tree, tank, cow라는 에셋들이 있다고 하자.
만약 tree를 로드하면 tree라는 에셋에 대한 카운트와 stuff라는 번들에 대한 카운트가 1씩 증가한다.
여기서 tank를 로드하면 tank에셋과 stuff번들의 카운트가 1씩 증가한다. 결론적으로 tree, tank, stuff는 각각 1,1,2의 레퍼런스 카운트를 가지게 된다.
여기서 tree를 언로드하면 tank와 stuff만이 각각 1,1의 레퍼런스 카운트를 유지한다. 그렇다고 해서 실제로 tree에셋이 언로드 되는 것은 아니다. 왜냐면 에셋번들을 부분적으로 로드할 수는 있지만 부분적으로 언로드할 수는 없기 때문이다.
단, 예외적으로 Resources.UnloadUnusedAssets 를 호출하면 tree에셋이 언로드 된다.
에셋의 언로드는 다음과 같은 코드로 할 수 있다.
Addressables.ReleaseInstance(gameObj); //Instantiate를 사용한 경우
Addressables.Release(asset); //LoadAsset
실습
설치
Package Manager 들어가서 Addressables를 설치해준다.
어드레스 부여
그냥 에셋에서 addressable 체크해주면 된다.
어드레서블 그룹 뷰어
여기서 그룹을 선택해주면 된다.
위와 같은 창에서 우클릭으로 새로운 그룹을 만들 수 있고, 각 에셋은 드래그앤 드롭으로 그룹끼리 옮길 수 있다.
어드레서블 프로파일러 (어드레서블 이벤트 뷰어)
위와 마찬가지로 상단 메뉴바에서 선택한다.
프로파일러에서 이벤트 뷰어로 이름이 바뀐듯.
참고
https://docs.unity3d.com/Packages/com.unity.addressables@1.14/manual/MemoryManagement.html