- 이 글은 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 |