Unity - 어드레서블(Addressable) (1)

One·2021년 8월 3일
5

Unity

목록 보기
1/9
post-custom-banner

티스토리로 옮겨진 글입니다.(https://one-kws.tistory.com/)

어드레서블 소개

에셋번들과 어드레서블

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

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

어드레서블 설치

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

어드레서블을 설치하면 Window - AssetManagement- Addressables 메뉴가 만들어진 것을 볼 수 있다.

Groups를 눌러 Addressable Groups 창을 열고 Create Addressable Settings 버튼을 누르면 프로젝트에AddressableAssetsData라는 폴더가 생성된다.

어드레서블 에셋 만들기

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

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

에셋 로드 및 생성

에셋 로드

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

1. AssetReference를 이용한 에셋 로드

스크립트에서 AssetReference 선언하는 코드를 작성하면 인스펙터 창에서 AssetReference를 선택할 수 있다.

[SerializeField]
private AssetReference assetReference;

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

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

2. 어드레스를 이용한 에셋 로드

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 컴포넌트를 추가하였다.

프리팹을 어드레서블 에셋으로 만들어 준 후 Loader 스크립트의 assetRefernce로 설정해준다.

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

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

profile
Unity Developer
post-custom-banner

0개의 댓글