유니티 엔진 (Unity Engine)

어드레서블 시작하기(Get started with Addressables) 스터디 노트 4화 "어드레서블 스크립트 코딩"

원소랑 2023. 5. 27. 19:12

Addressable 학습 코스 링크
https://prf.hn/click/camref:1011lvz7h/pubref:study_addr/destination:https%3A%2F%2Flearn.unity.com%2Ftutorial%2Fwhy-use-addressables%3FcourseId%3D64255c01edbc2a268fb0b800%23

 

Why use Addressables? - Unity Learn

The Addressables system is Unity's dynamic asset management system. Addressables builds on Unity's AssetBundles technology, and also provides tools inside the Unity Editor to help you prepare your assets for on-demand loading, whether your content is on-de

learn.unity.com

 

어드레서블(Addressables) 시스템 스터디 노트 4화에서는, 스크립트를 사용하여 어드레서블 에셋을 게임에 로드하고 언로드하는 방법을 다룹니다.

 

학습을 위해 필요한 지식들

C# 주니어 학습 코스를 마무리 했거나, 중급 과정인 분들을 대상으로 하며 아래 지식들이 필요.

 

비동기 처리 (Asynchronous operations)

어드레서블 API에서는 에셋과 데이터를 로드한 다음 결과를 반환하는 작업이 많고 에셋이나 데이터가 원격 서버에 있는 경우 작업 시간이 더 걸릴 수 있음. 처리 중 프리즈를 방지하고 동시에 다른 작업을 수행하면서 성능 저하를 피하려면 작업이 동시에 실행되는 비동기 연산을 사용해야 함.

 

코루틴 (Coroutines)

코루틴을 사용하면 즉시가 아닌 시간에 걸쳐 함수를 수행할 수 있습니다.

아래 링크는 코루틴 학습 코스.

https://prf.hn/click/camref:1011lvz7h/pubref:learn/destination:https%3A%2F%2Flearn.unity.com%2Ftutorial%2Fcoroutines

 

Coroutines - Unity Learn

Coroutines are a way of performing an operation over time instead of instantly. They can be useful, but there are some important things you need to be aware of when you use them to avoid inefficiency in your game or application. By the end of this tutorial

learn.unity.com

 

델리게이트 (Delegates)

델리게이트는 전달하거나 변수처럼 사용할 수 있는 함수를 위한 컨테이너

아래 링크는 델리게이트 학습 코스.

https://prf.hn/click/camref:1011lvz7h/pubref:learn/destination:https%3A%2F%2Flearn.unity.com%2Ftutorial%2Fdelegates

 

Delegates - Unity Learn

How to create and use delegates to provide complex and dynamic functionality in your scripts.

learn.unity.com

 

이벤트 (Events)

어떤 일이 발생했음을 알릴 수 있는 특수 델리게이트

아래 링크는 이벤트 학습 코스.

https://prf.hn/click/camref:1011lvz7h/pubref:learn/destination:https%3A%2F%2Flearn.unity.com%2Ftutorial%2Fevents-uh

 

Events - Unity Learn

How to create a dynamic "broadcast" system using Events.

learn.unity.com

 

구조체 (Structs)
어드레서블 API는 코드에서 비동기 연산을 추적하는 데 도움이 되는 AsyncOperationHandle이라는 구조체를 사용.

AsyncOperationHandle 구조체에는 메서드의 성공 또는 실패 여부와 요청 작업의 반환값을 나타내는 부울 값 존재.

 

직렬화 (Serialization)

직렬화는 애플리케이션의 세션 간에 데이터를 변환하고 저장하는 프로세스이며, 역직렬화는 애플리케이션이 다시 실행될 때 재구성할 수 있도록 저장된 데이터를 가져오는 프로세스.

어드레서블 시스템과 API를 사용할 때 직렬화를 사용하여 프로젝트에서 에셋을 소비하는 방식을 최적화할 수 있음.

아래는 직렬화(Serialization) 메뉴얼

https://prf.hn/click/camref:1011lvz7h/pubref:learn/destination:https%3A%2F%2Fdocs.unity3d.com%2FManual%2Fscript-Serialization.html

 

Unity - Manual: Script serialization

Running Editor Script Code on Launch Script serialization Serialization is the automatic process of transforming data structures or GameObject states into a format that Unity can store and reconstruct later. How you organize data in your Unity project affe

docs.unity3d.com

 

어드레서블 프리팹 로드하기

아래는 학습 코스에서 가이드 해주는 코드들을 모두 취합하여 정리한 코드.

using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

class Something
{
	[SerializeField]
	private string m_Address; // Addressable 주소 문자열

	//private ResourceRequest m_HatLoadingRequest; // 아래 AsyncOperationHandle 로 대체
	private AsyncOperationHandle<GameObject> m_HatLoadOpHandle;

	void SetHat()
	{
		m_HatLoadOpHandle = Addressables.LoadAssetAsync<GameObject>(m_Address);
		m_HatLoadOpHandle.Completed += OnHatLoadComplete;
	}
	
	void OnDisable()
	{
		m_HatLoadOpHandle.Completed -= OnHatLoadComplete;
	}

	private void OnHatLoadComplete(AsyncOperationHandle<GameObject> asyncOperationHandle)
	{
		if (asyncOperationHandle.Status == AsyncOperationStatus.Succeeded)
		{
			Instantiate(asyncOperationHandle.Result, m_HatAnchor);
		}
	}

}

핵심만 짚어봅니다.

ResourceRequest 를 대신하여 AsyncOperationHandle 을 사용하더 리소스를 로딩합니다.

Addressables.LoadAssetAsync<>() 메소드로 어드레서블 주소를 전달하여 로드. 완료는 Completed 델리게이트로 받습니다. OnHatLoadComplete 메소드에서 로드 완료를 처리합니다.

 

AssetReference 로 어드레서블 프리팹 로드하기

AssetReference(에셋 레퍼런스) 는 클래스 타입이며, "AssetReferences"는 에셋에 대한 직접 참조를 저장하지 않습니다. "AssetReference"는 에셋의 글로벌 고유 식별자(GUID)를 저장하며, 이는 어드레서블 시스템에서 런타임에 검색을 위해 오브젝트를 저장하는 데 사용.

 

문자열 대신 AssetReference를 사용하면 인스펙터에서 문자열 주소의 오타 등을 방지할 수 있음.

 

아래 코드는 문자열 대신 AssetReference 를 사용하여 어드레서블 로드를 수행.

using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

class Something
{
	//[SerializeField]
	//private string m_Address;
	
	// 위 문자열 주소 대신 AssetReference 를 사용
	[SerializeField]
	private AssetReference m_HatAssetReference;

	private AsyncOperationHandle<GameObject> m_HatLoadOpHandle;

	void SetHat()
	{
		if (!m_HatAssetReference.RuntimeKeyIsValid())
		{
		  return;
		}

		// m_Address 대신 AssetReference 인 m_HatAssetReference 를 사용.
		//m_HatLoadOpHandle = Addressables.LoadAssetAsync<GameObject>(m_Address);
		m_HatLoadOpHandle = m_HatAssetReference.LoadAssetAsync<GameObject>();
		
		m_HatLoadOpHandle.Completed += OnHatLoadComplete;
	}
	
	void OnDisable()
	{
		m_HatLoadOpHandle.Completed -= OnHatLoadComplete;
	}

	private void OnHatLoadComplete(AsyncOperationHandle<GameObject> asyncOperationHandle)
	{
		if (asyncOperationHandle.Status == AsyncOperationStatus.Succeeded)
		{
			Instantiate(asyncOperationHandle.Result, m_HatAnchor);
		}
	}

}

아래 링크는 AssetReference 공식 문서

https://prf.hn/click/camref:1011lvz7h/pubref:study/destination:https%3A%2F%2Fdocs.unity3d.com%2FPackages%2Fcom.unity.addressables%401.19%2Fmanual%2FAssetReferences.html

 

Asset References | Addressables | 1.19.19

Asset References An AssetReference is a type that can reference an Addressable asset. Use the AssetReference class in a MonoBehaviour or ScriptableObject. When you add a serializable AssetReference field to one of these classes, you can assign a value to t

docs.unity3d.com

 

AssetReferenceGameObject 로 어드레서블 프리팹 로드하기

오직 프리팹만 로드하고 싶다면, AssetReference 대신 AssetReferenceGameObject를 사용하면 됨. 기존 코드를 아래와 같이 수정.

using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

class Something
{
	//[SerializeField]
	//private string m_Address;
	
	//[SerializeField]
	//private AssetReference m_HatAssetReference;
	
	// 이번엔 AssetReferenceGameObject 를 사용
	[SerializeField]
	private AssetReferenceGameObject m_HatAssetReference;

	private AsyncOperationHandle<GameObject> m_HatLoadOpHandle;

	void SetHat()
	{
		if (!m_HatAssetReference.RuntimeKeyIsValid())
		{
		  return;
		}

		// m_Address 대신 AssetReference 인 m_HatAssetReference 를 사용.
		//m_HatLoadOpHandle = Addressables.LoadAssetAsync<GameObject>(m_Address);
		m_HatLoadOpHandle = m_HatAssetReference.LoadAssetAsync<GameObject>();
		
		m_HatLoadOpHandle.Completed += OnHatLoadComplete;
	}
	
	void OnDisable()
	{
		m_HatLoadOpHandle.Completed -= OnHatLoadComplete;
	}

	private void OnHatLoadComplete(AsyncOperationHandle<GameObject> asyncOperationHandle)
	{
		if (asyncOperationHandle.Status == AsyncOperationStatus.Succeeded)
		{
			Instantiate(asyncOperationHandle.Result, m_HatAnchor);
		}
	}

}

AssetReference 를 AssetReferenceGameObject 로 교체하면 아래와 같이 Select Addressable Asset 팝업창에서 프리팹만 선택할 수 있음.

 

(이어지는 내용은 스터디노트 5화로 넘어갑니다.)


Addressable 학습 코스 링크
https://prf.hn/click/camref:1011lvz7h/pubref:study_addr/destination:https%3A%2F%2Flearn.unity.com%2Ftutorial%2Fwhy-use-addressables%3FcourseId%3D64255c01edbc2a268fb0b800%23

 

Why use Addressables? - Unity Learn

The Addressables system is Unity's dynamic asset management system. Addressables builds on Unity's AssetBundles technology, and also provides tools inside the Unity Editor to help you prepare your assets for on-demand loading, whether your content is on-de

learn.unity.com

Unity 2021 버전, 유니티 교과서
https://link.coupang.com/a/ZgsN8

 

2021 버전 완벽 대응 유니티 교과서 개정5판

COUPANG

www.coupang.com

(본문 링크로 유니티 교과서 구입 시, 일정액의 수수료를 제공받습니다. 감사합니다.)

Unity Asset Store

https://prf.hn/click/camref:1011lvz7h/pubref:store/destination:https%3A%2F%2Fassetstore.unity.com%2F

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

728x90
반응형