2019.3 버전에 들어서면서 Addressable Asset System이 정식으로 릴리즈 되었다.

Addressable Asset System은 유니티의 새로운 에셋 관리 시스템인데,

기존의 Resources, Remote AssetBundle의 통합하는 새로운 시스템이다.

 

잘 사용만 한다면, 기존에 에셋 로딩 방식이 가지던 단점들을 보완하는 꽤 좋은 시스템이다.

그래서 앞으로 게임 개발 시엔 이 Addressable Asset System이 기본이 될 것이며 유니티도 이 시스템을 밀어줄 것이라 생각한다.

(따지고 보면, 기존의 에셋 번들 시스템을 개선한 버전이기는 하다.)

 

시대에 뒤처지지 않기 위해, 나도 이것저것 테스트해보는 중이다.

테스트해보면서 알게 된 몇 가지 특징들이 있는데,

잊지 않기 위해서 여기에 적어두려고 한다.

 

(이 부분은 어느 정도 Addressable Asset System에 대해 이해가 있어야지 이해가 쉬울 것이다.)

  • Addressable에서 에셋을 분류하는 단위인 Group은 기존의 번들 개념과 유사하다.
    • 기존 에셋에 번들 이름을 부여해서, 나중에 번들 이름 단위로 데이터를 생성하듯이, 기본적으로 어드레서블은 그룹 단위로 에셋 번들을 만든다.
    • 그래서 기존의 에셋번들 시스템에서 어드레서블로 컨버팅을 하면 에셋 번들 이름이 그룹으로 처리되면서, 그룹 별로 에셋들이 분류된다.
    • 옵션 변경해서 그룹 단위가 아닌 개별 에셋, 혹은 레이블 단위로 에셋 번들을 만들 수 있다.
  • Addressable에서 LoadAsset과 DownloadDependencies는 Key 또는 Label 값을 파라미터로 받는다.
    • 이 부분이 아직 나에게 낯선 개념인데, 에셋을 그룹 단위로 로드할 수 없다. 에셋의 Key값이나, Label을 통해서만 로드할 수 있다. 여기서 레이블이란, 일종의 Tag개념으로 에셋마다 여러 개 레이블을 가질 수 있다. 그래서 레이블로 로딩 시, 해당 레이블을 가진 모든 데이터를 로드한다.
    • 이유는 위에서 설명한 옵션 때문인데, 에셋 번들이 무조건 그룹 단위로 만들어지는 것이 아니기 때문에, 그룹 단위로 처리하는 함수는 없다.
  • LoadAsset, Instantiate은 에셋이 리모트 에셋일 경우, 다운로드를 한다
    • 굳이 다운로드 함수를 호출하지 않아도, 로컬에 캐싱된 에셋 번들이 없다면 자동으로 다운로드를 해서 캐싱을 한다.
    • 로컬 캐싱관련 옵션을 끄면 매번 로드할 때마다 다운로드를 한다.
  • LoadAsset, Instantiate, DownloadDependencies를 이용해 에셋을 로드하면, 관련 의존된 에셋 또한 알아서 다운로드하고 로드해준다.
    • 에셋 하나를 로드하는데 의존 에셋이 있다면 같이 다운로드한다. 그게 설령 의존에 의존에 의존 에셋이라도.
    • 예를 들어, 리모트 번들 A에 메쉬 Prefab이 있고, 리모트 번들 B에 메쉬의 Material이 있고, 리모트 번들 C에 머테리얼의 Texture가 있으면, Prefab 에셋을 로드할 때, 자동으로 번들 B와 C까지 알아서 같이 로드한다.
  • 그룹 단위의 처리 방식이 아니기 때문에 새로운 방식의 에셋 데이터 관리 방향을 제시할 수 있다.
    • 기존 게임들은 게임 시작 시에 필요한 데이터를 사전에 전부 다운로드하도록 하지만, 위에 설명한 어드레서블의 특징 덕분에 그룹 단위로 에셋 데이터를 관리하지 않아도 되기 때문에, 유저가 게임을 플레이를 하면서 필요한 데이터만 다운로드하게 할 수 있다.
  • LoadAsset로 불러온 에셋은 사용 후 Release를 호출해줘야한다.
    • 기존 변수를 Null로 처리하는 것 또한 잊으면 안 된다.
  • Instantiate으로 생성한 오브젝트는 ReleaseInstance를 호출해줘야 한다.
    • 다만, 호출하면, 오브젝트가 Destroy 되므로 풀링을 했다면, 더 이상 필요 없어진 시점에 해야 할 것이다.
    • Release를 호출해도 똑같이 작동한다.
    • 반대로 LoadAsset으로 불러 온 Prefab 또한 ReleaseInstance로 처리해도 동일하게 처리된다.
  • LoadAsset으로 불러온 Prefab으로 생성한 인스턴스는 Release 대상이 아니다.
  • AsyncOperationHandle로 Release를 하면 로드/생성된 에셋 또한 릴리즈 된다.
    • 때문에 Instantiate의 AsyncOperationHandle을 이용해 해제하면, 인스턴스를 Release 한 것처럼 오브젝트가 Destroy 된다.
  • 에셋끼리 동일한 키값을 가질 수 있다. 해당 키로 에셋을 로드할 때, LoadAssets로 에셋을 불러오면, 배열로 로드할 수 있다.
  • LoadAssets으로 한 번에 여러 에셋을 불러올 때 특정 데이터 타입으로 하면, 같은 값(키 또는 레이블)을 가진 에셋 중에 해당 타입을 가진 에셋만 불러온다.
  • LoadAssets으로 한 번에 여러 에셋을 불러올 때 object로 타입을 정하면, 같은 값(키 또는 레이블)을 가진 모든 에셋을 불러온다.

 

기능을 더 확장하고 활용하려면, Provider 같은 인터페이스들을 상속하고 커스터마이즈 하는 법까지 알아야 할 텐데.

그 부분은 나에게 너무 어렵다...

 

이 시스템을 이용해서 어떻게 번들 데이터들의 버전 업데이트 시스템을 만들 수 있을지는 아직 고민해보지 않아서,

이건 차차 업데이트할 예정이다.

 

 

'Unity' 카테고리의 다른 글

왜 Unity의 GC(Garbage Collector)는 무식할까  (0) 2020.04.24
Script Execution Order  (0) 2020.04.05

+ Recent posts