EveryDay.DevUp

[Unity] 프레임 워크 개발 - ResourceManager ( v.0.1.0 ) 본문

FrameWork

[Unity] 프레임 워크 개발 - ResourceManager ( v.0.1.0 )

EveryDay.DevUp 2020. 6. 17. 22:03

▣ 기본 설정

https://everyday-devup.tistory.com/44

 

[Unity] 프레임 워크 가이드 - 패키지 다운 및 기본 씬 설정 ( v.0.1.0 )

● Framework Package를 다음의 링크에서 다운로드 https://everyday-devup.tistory.com/40 [Unity] 프레임 워크 기능 및 사용 가이드 프레임워크의 기능 업데이트 및 사용 가이드를 관리하는 페이지 #2020-05-08..

everyday-devup.tistory.com

ResourceManager는 Addressable Package를 사용하여 Unity Asset의 프리팹, 텍스쳐, 폰트, 아틀라스와 같은 것을 동적으로 불러오는데 사용된다.

Object의 guid를 기반으로 캐싱하여 관리하며, 비동기적으로 어셋을 로드하여 관리한다.

※ GUID ( Globally Unique IDentifier )

: 키가 필요한 모든 곳에서 모든 컴퓨터 및 네트워크에서 사용할 수 있는 128 비트 정수로, 식별자가 중복될 확률은 매우 낮다.

public class ResourcesManager
{
	Dictionary<int, Object> resources; // Addressable로 로드한 오브젝트를 관리

	public ResourcesManager()
	{
		resources = new Dictionary<int, Object>();
	}

	public IEnumerator Load(AssetReference assetReference, bool isCaching, System.Action<Object> successCallback, System.Action failCallback)
	{
		int hashCode = assetReference.GetHashCode();
		Object obj = null;
        
		// 캐싱체크를 하면 Dictionary에서 먼저 검색하여 기존에 로드한 오브젝트를 찾음
		if( isCaching )
		{
			resources.TryGetValue( hashCode, out obj );
			if( obj != null )
			{
				successCallback.Invoke( obj );
			}
		}
		
        // 로드한 오브젝트가 없을 경우 비동기로 오브젝트를 로드한 후, 로드가 끝나면 콜백을 보냄
		if( obj == null )
		{
			AsyncOperationHandle<Object> handle = assetReference.LoadAssetAsync<Object>();
			yield return handle;

			if( handle.Status == AsyncOperationStatus.Succeeded )
			{
				obj = handle.Result;
				Addressables.Release( handle );
				if( isCaching )
				{
					resources.Add( hashCode, obj );
				}
				successCallback.Invoke( obj );
			}
			else
			{
				failCallback.Invoke();
			}
		}
	}
	
    // 캐싱을 하지 않은 오브젝트는 사용이 끝나면 Unload로 오브젝트를 없애주어야함
	public void UnLoad(AssetReference assetReference)
	{
		assetReference.ReleaseAsset();
	}
}

▣ 사용 가이드

: Addressable을 사용하려면 먼저 AssetReference 의 값을 불러올 수 있어야 한다. 간단하게는 GameObject의 public AssetReference 으로 Inspector에서 설정할 수도 있다.

public UnityEngine.AddressableAssets.AssetReference reference;

private void Start()
{
	resourcesManager = new ResourcesManager();
	StartCoroutine( resourcesManager.Load( reference, false, OnLoadSuccess, OnLoadFaile ));
}

void OnLoadSuccess(Object obj) {
	GameObject.Instantiate( obj );
}

void OnLoadFaile() {
}
        

[ LogoUI 프리팹에 주소 설정 ]
[ Reference에 로드할 프로젝트를 설정 ]
[ LogoUI 가 Game Scene에 올라온것을 확인할 수 있음 ]

실제 사용 시에 AssetReference를 하나만 사용하는 경우는 드물기 때문에 ScriptableObject를 사용하여 관리하는 것을 추천한다. UI System에서 로드할 프리팹을 관리하는 방식으로 ScriptableObject를 사용하고 있다. 

▣ 해당 컴포넌트 사용 관련 이론

https://everyday-devup.tistory.com/55

 

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

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

everyday-devup.tistory.com

참고 자료 : https://docs.microsoft.com/ko-kr/dotnet/api/system.guid?view=netcore-3.1

 

Guid 구조체 (System)

GUID(Globally Unique IDentifier)를 나타냅니다.Represents a globally unique identifier (GUID).

docs.microsoft.com