EveryDay.DevUp

[Unity] Addressable Asset System ( 어드레서블 어셋 시스템 ) 본문

Unity

[Unity] Addressable Asset System ( 어드레서블 어셋 시스템 )

EveryDay.DevUp 2020. 5. 24. 01:19

 

● Unity Addressable Asset System 정의

- Asset을 불러올 때 address ( 사용자가 정한 이름 ) 에 따라 Asset이 Resources에 위치하던지, Asset Bundle에 위치하던지에 관계 없이 쉽게 불러와서 사용할 수 있는 시스템

● Asset의 정의

- Asset은 프로젝트/Assets 안에 있는 Prefabs, Textures, Materials, Audio Clips Animations 등을 말함

● 기존 Asset Workflow

- 기존 Unity에서 Asset을 사용하는 방식에는 3가지가 있다

: 간단한 테스트를 위해 버튼을 누르면 Cube Object를 생성하는 코드를 작성

: Resources/Cube Prefab을 생성

1. Unity Editor의 Inspector 창에서 필요한 어셋을 드래그&드랍으로 참조 연결 시켜서 사용하는 방식

using UnityEngine;

public class Test : MonoBehaviour
{
	public GameObject cube;

	public Transform posTrans;

	public void OnCreate()
	{
		GameObject obj = GameObject.Instantiate( cube );
	}
}

 

 

▶ 씬을 로드할 때 참조하고 있는 Cube Prefab이 메모리 상에 올라오게 됨

2. Resources.Load 함수를 사용하여 Resources 폴더에 있는 Asset를 가져오는 방식

using UnityEngine;

public class Test : MonoBehaviour
{
	GameObject cube;

	public void OnCreate()
	{
		cube = Resources.Load( "Cube" ) as GameObject;
		GameObject obj = GameObject.Instantiate( cube );
	}
}

▶ 필요한 어셋을 코드에서 필요한 때에 불러와서 사용할 수 있다.

3. 어셋번들에서 Asset을 로드해서 사용하는 방식

▶ 아래의 예제는 테스트용으로 간결하게 작성한 방식으로 실제 사용 시에는 여러가지 예외 상황을 고려한 과정들이 필요하다.

 

[ Cube Prefab에 AssetBundle의 이름 cubeasset 설정 ]

 

using UnityEditor;

public class AssetBundleEditor : Editor
{
	[@MenuItem( "Asset/Build AssetBundles" )]
	public static void AssetBundleCreate()
	{
		BuildPipeline.BuildAssetBundles( "Assets/AssetBundle", BuildAssetBundleOptions.StrictMode, BuildTarget.Android );
	}
}

 

[ 어셋 번들 생성]
[ 만들어진 어셋번들 ]

 

using UnityEngine;
using System.IO;

public class Test : MonoBehaviour
{
	AssetBundle bundle;
	GameObject cube;

	public void OnCreate()
	{
		if( cube == null )
		{
			bundle = AssetBundle.LoadFromMemory( File.ReadAllBytes( "Assets/AssetBundle/cubeasset" ) );
			cube = bundle.LoadAsset<GameObject>( "Cube" );
		}

		GameObject obj = GameObject.Instantiate( cube );
	}
}

▶ 필요한 어셋을 어셋번들로 묶고, 코드에서 어셋번들을 로드한 후 필요한 어셋을 찾아서 불러와서 사용할 수 있다.

● 기존 Asset Workflow 비교

 

 

● 추가된 Addressable Asset System 의 특징

: 리소스 폴더의 장점 + 어셋 번들의 장점 + 개발 편의성을 가진 시스템

: 프로파일러 제공을 통한 어셋의 종속성 파악 및 메모리 로드/언로드 현황 파악

 

[ Addressable은 어셋과 주소의 매핑 정보를 가짐, 리소스 매니저는 어셋들을 Unity에서 로드할 수 있는 정보를 가짐 ]

 

●  Addressable Asset System 의 Workflow

 

[ Package Manager에서 Addressable 패키지를 Import ]
[ 사용할 Asset의 Addressable 옵션을 키고 주소를 부여 ]

 

using UnityEngine;
using UnityEngine.AddressableAssets;

public class Test : MonoBehaviour
{
	GameObject cube;

	public void OnCreate()
	{
		Addressables.InstantiateAsync( "Assets/Cube/Cube.prefab" );
	}
}

▶ 매우 간단한 코드로 어셋의 위치에 관계없이 어셋을 로드해서 사용할 수 있는 시스템이 어드레서블 어셋 시스템이다.

▣ 해당 글에서는 시스템의 비교 및 소개를 위해 예외 상황을 고려하지 않은 매우 간단한 예제를 사용하였다. 실제 사용 시에는 여러가지 고려가 필요할 것으로 생각된다.

참고 자료 : https://docs.unity3d.com/Packages/com.unity.addressables@1.1/manual/AddressableAssetsOverview.html

 

Addressable Assets Overview | Package Manager UI website

Addressable Assets Overview The Addressable Assets System consists of two packages: Addressable Assets package (primary package) Scriptable Build Pipeline package (dependency) When you install the Addressable Assets package, the Scriptable Build Pipeline p

docs.unity3d.com

참고 자료 : https://www.youtube.com/watch?v=yoBzTpJYN44