Unity 자습서/Addressable

유니티 Addressable #1 - 기본편

개양반 2020. 9. 5.
728x90

가. 설치하기

Addressable은 2020.1 버전 기준으로 정식 버전이 되었습니다. Package Manager 에서 Addressable을 Install 해주세요. 

설치가 완료되면 Addressable Groups창에서 Create Addressable Settings 버튼을 누르면 Project창에 AddressableAssetData가 생성됩니다.


나. 게임 오브젝트 설치

1. 프리팹 만들기

Hierarchy창에서 Cube를 생성한 뒤 이름을 objectToLoad으로 변경합니다.

프리팹으로 만드세요. 그 후 Hierarchy창의 objectToLoad는 삭제합니다.

 

Hierarchy창에서 BoxSphere를 생성한 뒤 이름을 accessoryObjectToLoad로 변경합니다.

프리팹으로 만드세요. 그 후 Hierarchy창의 accessoryObjectToLoad는 삭제합니다.

 

2.  Addressable 오브젝트로 만들기

위에서 만든 프리팹들의 Inspector창에서 Addressable을 활성화합니다. 

 

유니티의 상단메뉴 Window - Asset ManageMent - Addressables - Groups 을 선택해서 Addressable Groups창에 위에서 만든 프리팹이 추가되었는지 확인합니다.

 

3. 빈 게임오브젝트 생성 후 이름을 Loader 로 변경하기

 


다. 스크립트 작업

1. AssetReferenceUtility.cs 생성

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class AssetReferenceUtility : MonoBehaviour
{
    public AssetReference objectToLoad;
    public AssetReference accessoryObjectToLoad;

    private GameObject instantiatedObject;
    private GameObject instantiatedAccessoryObject;


    void Start()
    {
        // 에셋을 비동기 방식으로 로드합니다.
        // 번들에서 에셋을 로드하는 코드입니다. <타입>(불러올 에셋의 키) 
        // AssetReference 전역 변수를 이용해서 유니티 에디터에서 불러올 에셋의 키를 참조할 수 있도록 할 예정입니다.
        Addressables.LoadAssetAsync<GameObject>(objectToLoad).Completed += ObjectLoadDone;
    }

    private void ObjectLoadDone(AsyncOperationHandle<GameObject> obj)
    {
        if (obj.Status == AsyncOperationStatus.Succeeded)
        {
            GameObject loadedObject = obj.Result;
            Debug.Log("오브젝트 로드 완료");

            // Instantiate 를 통해 Hierarchy 뷰에 게임오브젝트를 생성합니다.
            instantiatedObject = Instantiate(loadedObject);
            Debug.Log("오브젝트 인스턴스화 완료");


            if (accessoryObjectToLoad != null)
            {
                // 비동기 방식으로 에셋을 로드한 다음 바로 Hierarchy 뷰에 게임오브젝트를 생성합니다.
                // 람다식으로 작성된 코드
                accessoryObjectToLoad.InstantiateAsync(instantiatedObject.transform).Completed += op =>
                {
                    if (op.Status == AsyncOperationStatus.Succeeded)
                    {
                        instantiatedAccessoryObject = op.Result;
                        Debug.Log("Accessory Object 로드와 생성 완료");
                    }
                };
            }
        }
    }
}

#부가 설명

Start 함수를 통해 비동기 방식으로 objectToLoad 에 참조된 키를 가진 에셋을 로드합니다. 로드가 완료되면 ObjectLoadDone() 가 호출되며 매개변수로 AsyncOperationHandle을 전달합니다. 로드가 성공하면 해당 에셋을 인스턴트화해서 Hierarchy창에 해당 에셋을 게임오브젝트로 생성합니다. 

accessoryObjectToLoad.InstantiateAsync(instantiatedObject.transform) 이 코드는 accessoryObjectToLoad에 참조된 에셋을 로드한 후  instantiatedObject.transform의 자식 GameObject로 바로 생성시킵니다. 

 

# 주요 코드

  • AssetReference : 에셋 레퍼런스는 참조할 수 있는 변수 타입
  • Addressables.LoadAssetAsync<GameObject>(objectToLoad) : 번들에서 에셋을 로드하는 코드입니다. <타입>(불러올 에셋의 키) 위의 AssetReference 변수를 이용해서 유니티 에디터에서 불러올 에셋의 키를 참조할 수 있도록 할 예정입니다.
  • AsyncOperationHandle : 로드한 에셋의 상태 및 결과 등을 확인할 때 사용합니다.
  • AsyncOperationStatus.Succeeded : 로드 결과 값 등을 비교할 때 사용합니다.
  • Addressables.InstantiateAsync : 비동기식으로 에셋을 로드하고 바로 인스턴트화 합니다. Addressables.LoadAssetAsync 와 다른 점은 Addressables.LoadAssetAsync는 로드만 진행하고 Addressables.InstantiateAsync 로드 후 바로 인스턴트까지 진행합니다.

라. 컴포넌트 연결

하이러키 창의 Loader에 위에서 만든 스크립트를 연결하고 AssetsReference 변수들을 참조시킵니다. 우측 끝에 드롭 다운 버튼을 누르면 연결할 수 있는 에셋 리스트가 나옵니다. 

 


마. 확인하기

Window - Asset ManageMent - Addressables - Addressable Event Viewer 를 선택해서 창을 엽니다. 

AddressableAssetSettings 에서 Send Profiler Events 를 활성화하면 Addressable Event Viewer 를 통해 Addressable 프로파일러를 확인 할 수 있게 됩니다. 

 

재생 버튼을 눌러 확인합니다. 두 개의 리소스가 올라간 것을 확인 할 수 있습니다. Addressable Event Viewer에 대해서는 차후 상세하게 설명할 예정입니다. 지금은 여기서 메모리에 올라간 리소스를 확인할 수 있다는 것을 아시면 됩니다.

댓글

💲 추천 글