One_KWS

Addressable System #1 - 에셋 로드 및 생성 본문

Unity

Addressable System #1 - 에셋 로드 및 생성

One-Kim 2023. 2. 21. 21:24

Asset Bundle과 Addressable

에셋 번들은 앱 컨텐츠를 분리하여 앱 초기 다운로드 크기를 작게 유지할 수 있으며 동적으로 에셋들을 로드하기 때문에 추가적으로 업데이트시 앱을 재설치할 필요 없이 컨텐츠만 수정, 추가, 삭제하여 앱을 업데이트할 수 있는 장점이 있다.

하지만 이러한 장점들에도 불구하고 에셋 번들은 구현하기가 어렵고 많은 리팩터링과 커스텀이 필요하다는 단점이 있다. 이 단점들을 해결하기 위해서 나온 것이 Addressable System이다.

Addressable 설치

어드레서블을 설치하는 것은 간단하다. Package Manager에서 어드레서블을 찾아서 설치하면 끝난다.

어드레서블을 설치하면 Window - AssetManagement- Addressables 메뉴가 만들어진다. Groups를 눌러 Addressable Groups 창을 열고 Create Addressable Settings 버튼을 누르면 프로젝트에AddressableAssetsData 폴더가 생성된다.

 

Addressable Asset 만들기

어드레서블을 설치하고 에셋을 클릭하면 인스펙터 창에 Addressable 체크 박스가 생긴다. 체크 박스를 클릭하면 자동으로 Address를 생성해주는데 원하는 Address로 수정할 수 있다.

Addressable에 체크한 에셋은 기본적으로 Addressable Groups의 Default Local Groups에 만들어진다. Create 버튼을 누르거나 마우스 우클릭으로 그룹을 새로 생성할 수 있다.

 

에셋 로드 및 생성

AssetReference를 사용하는 방법과 에셋의 어드레스를 사용하는 방법 두 가지가 있다.

 

에셋 로드

AssetReference를 이용한 에셋 로드

아래와 같은 코드를 이용하여 인스펙터 창에서 AssetReference를 선택할 수 있다.

[SerializeField]
private AssetReference assetReference;

만들어 놓은 Addressable Asset을 선택한 후 스크립트에서 LoadAssetAsync() 함수를 사용하여 해당 에셋을 로드할 수 있다.

// LoadAssetAsync 함수의 매개변수로 앞에서 선언한 AssetReference를 넣어준다. 
// 에셋 로드 후 진행할 작업을 Completed 대리자(delegate)에 연결할 수 있다. 
Addressables.LoadAssetAsync<GameObject>(assetReference).Completed += handle => {
	prefab = handle.Result;
};

Address를 이용한 에셋 로드

AssetReference를 선언하지 않고 LoadAssetAsync() 함수에 에셋의 어드레스를 입력하는 것으로도 에셋을 로드할 수 있다. 다른 코드들은 AssetReference를 이용하는 것과 같다.

// 어드레스는 어드레서블을 만들 때 자동으로 생성된 어드레스 또는 임의로 지정한 값을 넣어준다.
Addressables.LoadAssetAsync<GameObject>("Assets/Prefabs/Cube.prefab").Completed += handle => {
	prefab = handle.Result;
};

 

에셋 생성

InstantiateAsync() 함수를 사용하면 에셋을 게임 오브젝트로 바로 생성할 수 있다.

1. AssetReference를 이용한 게임 오브젝트 생성

Addressables.InstantiateAsync(assetReference);

2. 어드레스를 이용한 게임 오브젝트 생성

Addressables.InstantiateAsync("Assets/Prefabs/Cube.prefab");

어드레서블 에셋을 로드, 생성 함수들은 이름에서 알 수 있듯 비동기로 되어있다.
따라서 어드레서블을 다룰때는 Completed, Destroyed 대리자를 이용하거나 async, await 등을 사용하여 처리해야 한다.

 

예제 만들기

이제 간단한 예제를 만들어 보자. 버튼을 누를때마다 큐브가 생성되는 예제이다.

Loader라는 스크립트를 생성하고 아래 코드를 작성한다.

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.UI;

public class Loader : MonoBehaviour {
    [SerializeField]
    private AssetReference assetReference;

    public void OnClickCreate() {
        assetReference.InstantiateAsync();
    }
}

게임 오브젝트를 하나 생성하여 위에서 작성한 스크립트를 붙여준다. 큐브를 생성하여 프리팹으로 만들어준다. 큐브가 생성된 후 아래로 떨어지게 하기위해 프리팹에 Rigidbody 컴포넌트를 추가하였다. 프리팹을 어드레서블 에셋으로 만들어 준 후 AssetRefernce로 설정해준다.

버튼을 하나 생성하고 클릭 이벤트와 Loader 스크립트의 OnClickCreate() 함수를 연결한다.

실행하면 버튼을 누를때마다 큐브가 생성되는 것을 볼 수 있다.