본문 바로가기

프로그램-잉/Unity

Addressable Asset Basic

- 이 글은 github.com/Unity-Technologies/Addressables-Sample 소스코드를 정리한 글입니다.

 

Addressable Asset을 사용하는 가장 간단한 방법은 컴포넌트 레퍼런스에 에셋을 지정하는 방법입니다.
그 방법은 이전 글 Getting Started with Addressable Assets 을 참고해주세요

 

 

인스턴스화

	public AssetReference baseCube;

	public void SpawnThing()
	{
		baseCube.InstantiateAsync();
	}

가장 기본이 되는 방식입니다.

public레퍼런스로 받아온 AssetReference를 필요할때 InstantiateAsync함수를 호출하면 에셋의 로드와 인스턴스화를 한번에 하게됩니다.

 

 void Start()
    {
        leftObject.LoadAssetAsync();
    }


    void FixedUpdate()
    {
       var leftGo = Instantiate(leftObject.Asset, leftPosition, Quaternion.identity) as GameObject;
    }

 

다른 방법으로 로드를 먼저한 후 필요한 시점에 인스턴스화를 하는 방법이 있습니다.

 

Note : 두 예제의 다른 점은 어드레서블 에셋은 ref-count를 사용하여 관리가 되어지는데

위에 예제는 인스턴스화가 될때마다 ref-count가 올라가게 됩니다.

아래 예제는 InstantiateAsync가 아닌 GameObject.Instantiate를 사용하였는데 이 경우에는 ref-count가 올라가지 않습니다

당연히 destroy될때도 ref-count가 줄어들지 않는다 즉 managed가 아니란것이죠.

 

로드 완료 체크.

다음으로 Addressable Asset은 모두 비동기로 로드를 하기때문에 로드가 완료될때 콜백을 받아 처리를 할 수 있습니다.

 

	void Start ()
	{
		m_ToLoadCount = shapes.Count;
		foreach (var shape in shapes)
		{
			shape.LoadAssetAsync<GameObject>().Completed += OnShapeLoaded;
		}
	}

	void OnShapeLoaded(AsyncOperationHandle<GameObject> obj)
	{
		m_ToLoadCount--;
		if (m_ToLoadCount <= 0)
			m_IsReady = true;
	}

	public void SpawnAThing()
	{
		if (m_IsReady && shapes[currentIndex].Asset != null)
		{
			for(int count = 0; count <= currentIndex; count++)
				GameObject.Instantiate(shapes[currentIndex].Asset);
			currentIndex++;
			if (currentIndex >= shapes.Count)
				currentIndex = 0;

		}
	}

위코드는 에셋을 로드하고 OnShapeLoadede 콜백을 Complete 액션에 추가하였다.

에셋의 로딩이 완료가 되면 OnShapeLoadede가 호출되며 AsyncOperationHandle을 인자로 받습니다.

여기서 로드가 완료된 에셋에 접근이 가능하며(.result) 추후 해제를 위해 저장해놓을 수 도 있습니다.

 

   void FixedUpdate()
    {
       if (leftObject.Asset != null)
       {
          ...
        }
     }

에셋 로드를 확인하는 다른 방법은 폴링을 하는 것입니다.

레퍼런스로 가져온 AssetReference의 .Asset을 이용하여 해당 에셋이 로드가 된상태인지 확인이 가능합니다.

 

이상 Addressable Asset의 가장 기본적인 사용법을 정리해보았습니다.

'프로그램-잉 > Unity' 카테고리의 다른 글

Addressable Memory Management  (0) 2021.02.26
Getting started with Addressable Assets  (0) 2021.02.20
Addressable Asset Overview  (0) 2021.02.20
Unity x LEGO Microgame 공모전  (0) 2020.10.28
TimeScale - Coroutine  (0) 2020.10.16