Addressable 학습 코스 링크
https://prf.hn/click/camref:1011lvz7h/pubref:study_addr/destination:https%3A%2F%2Flearn.unity.com%2Ftutorial%2Fwhy-use-addressables%3FcourseId%3D64255c01edbc2a268fb0b800%23
어드레서블(Addressables) 시스템 스터디 노트 4화에서는, 스크립트를 사용하여 어드레서블 에셋을 게임에 로드하고 언로드하는 방법을 다룹니다.
학습을 위해 필요한 지식들
C# 주니어 학습 코스를 마무리 했거나, 중급 과정인 분들을 대상으로 하며 아래 지식들이 필요.
비동기 처리 (Asynchronous operations)
어드레서블 API에서는 에셋과 데이터를 로드한 다음 결과를 반환하는 작업이 많고 에셋이나 데이터가 원격 서버에 있는 경우 작업 시간이 더 걸릴 수 있음. 처리 중 프리즈를 방지하고 동시에 다른 작업을 수행하면서 성능 저하를 피하려면 작업이 동시에 실행되는 비동기 연산을 사용해야 함.
코루틴 (Coroutines)
코루틴을 사용하면 즉시가 아닌 시간에 걸쳐 함수를 수행할 수 있습니다.
아래 링크는 코루틴 학습 코스.
델리게이트 (Delegates)
델리게이트는 전달하거나 변수처럼 사용할 수 있는 함수를 위한 컨테이너
아래 링크는 델리게이트 학습 코스.
이벤트 (Events)
어떤 일이 발생했음을 알릴 수 있는 특수 델리게이트
아래 링크는 이벤트 학습 코스.
구조체 (Structs)
어드레서블 API는 코드에서 비동기 연산을 추적하는 데 도움이 되는 AsyncOperationHandle이라는 구조체를 사용.
AsyncOperationHandle 구조체에는 메서드의 성공 또는 실패 여부와 요청 작업의 반환값을 나타내는 부울 값 존재.
직렬화 (Serialization)
직렬화는 애플리케이션의 세션 간에 데이터를 변환하고 저장하는 프로세스이며, 역직렬화는 애플리케이션이 다시 실행될 때 재구성할 수 있도록 저장된 데이터를 가져오는 프로세스.
어드레서블 시스템과 API를 사용할 때 직렬화를 사용하여 프로젝트에서 에셋을 소비하는 방식을 최적화할 수 있음.
아래는 직렬화(Serialization) 메뉴얼
어드레서블 프리팹 로드하기
아래는 학습 코스에서 가이드 해주는 코드들을 모두 취합하여 정리한 코드.
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 공식 문서
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
Unity 2021 버전, 유니티 교과서
https://link.coupang.com/a/ZgsN8
(본문 링크로 유니티 교과서 구입 시, 일정액의 수수료를 제공받습니다. 감사합니다.)
Unity Asset Store
https://prf.hn/click/camref:1011lvz7h/pubref:store/destination:https%3A%2F%2Fassetstore.unity.com%2F
'유니티 엔진 (Unity Engine)' 카테고리의 다른 글
어드레서블 시작하기(Get started with Addressables) 스터디 노트 8화 "프로파일" (0) | 2023.05.31 |
---|---|
어드레서블 시작하기(Get started with Addressables) 스터디 노트 7화 "프로파일" (0) | 2023.05.29 |
어드레서블 시작하기(Get started with Addressables) 스터디 노트 5화 "다양한 에셋 로드" (0) | 2023.05.28 |
어드레서블 시작하기(Get started with Addressables) 스터디 노트 3화 "Addressable 등록하기" (0) | 2023.05.26 |
어드레서블 시작하기(Get started with Addressables) 스터디 노트 2화 "어드레서블을 써야만 하는 이유" (2) | 2023.05.26 |
어드레서블 시작하기(Get started with Addressables) 스터디 노트 1화 (0) | 2023.05.25 |
유니티 모바일 노티피케이션(Unity Engine Mobile Notifications) (0) | 2023.05.25 |