[Unity] 어드레서블(Addressable) 빠르게 사용해 보기 (4/4) - 여러 리소스를 한 번에 비동기로 리소스를 로드(Load)하고 사용하기
이 포스팅은 어드레서블(Addressable)에서 지정한 라벨(Lable)를 기준으로 한 번에 로드하여 사용하는 것을 다룹니다.
다른 포스팅은 한 개씩 로드하여 사용하는 예제였습니다.
한 개씩 로드하는 방식은 여러 개를 로드하려면 각각 나머지 리소스가 로드되었는지 확인하는 코드를 직접 구현하여야 합니다.
하지만 어드레서블에서는 여러 개의 리소스를 한 번에 로드하는 기능을 제공하므로 따로 구현할 필요가 없습니다.
* 이 포스팅은 '흔한 개발자의 메모장'님의 코드를 참고하여 작성되었습니다. *
0. 리소스 준비
프리팹은 아래와 같이 등록되어 있습니다.
한 번에 여러 개의 리소스를 불러올 때는 경로(Path)는 몰라도 됩니다.
정확히는 로드가 끝나면 리소스의 경로를 조회할 수 있으므로 어떻게 관리할지는 설계의 영역입니다.
1. 리소스 불러오기(Load)
라벨을 기준으로 리소스를 불러오려면 'Addressables.LoadResourceLocationsAsync'함수를 사용합니다.
'.Completed'이벤트를 연결하여 사용합니다.
//지정된 레블과 일치하는 경로를 가져온다.(key가 되는 경로)
//경로만 불러오는 것이라 오브젝트가 생성되지는 않는다.
Addressables.LoadResourceLocationsAsync([레이블 명칭]).Completed +=
(handle) =>
{
IList<IResourceLocation> LocationList = handle.Result;
Debug.Log("GetLocations : " + this.LocationList.Count);
};
(참고 : github - dang-gun/UnitySamples/AddressableSamples/Addressable_LabalLoad.cs)
3번 줄 : [레이블 명칭]은 문자열입니다.
인스팩터에 추가하는 경우 어드레서블(Addressable)에 등록된 레이블을 선택하는 인터페이스를 볼 수 있습니다.
6번 줄 : 'handle.Result'를 통해 읽어 들인(Load) 리소스의 리스트를 전달받을 수 있습니다.
이 리스트를 따로 보관하여 관리하는 것이 좋습니다.
2. 리소스 사용하기
사용은 한 개씩 사용하는 비동기 예제와 똑같습니다.
단지 여기서는 리스트를 가지고 있으므로 랜덤하게 1개를 추출하여 사용하도록 하겠습니다.
//랜덤한 경로 한개 추출
IResourceLocation location = LocationList[Random.Range(0, LocationList.Count)];
//위치 정보 생성
Vector3 v3Start = new Vector3(Random.Range(-5f, 5f), Random.Range(-3f, 3f), Random.Range(-5f, 5f));
Addressables.InstantiateAsync(location, v3Start, Quaternion.identity).Completed
+=(handle) =>
{
//생성된 개체저장
GameObject newGO = handle.Result;
};
(참고 : github - dang-gun/UnitySamples/AddressableSamples/Addressable_LabalLoad.cs)
2번 줄 : 리소스를 불러왔을 때 받은 리스트에서 한 개를 랜덤하게 추출하여 저장합니다.
6번 줄 : 추출한 리소스를 가지고 어드레서블에 인스턴스를 만들어달라고 요청합니다.
10번 줄 : 'handle.Result'를 통해 생성된 인스턴스를 받을 수 있습니다.
이 인스턴스를 따로 저장하여 관리해도 됩니다.
생성된 개체는 따로 저장해 두어야 자원을 해제할 때 사용할 수 있습니다.
3. 인스턴스 해제(Release)
인스턴스를 해제하는 것은 다른 방법과 동일합니다.
어드레서블에서 인스턴스를 해제할 때는 'Addressables.ReleaseInstance'를 사용하면 됩니다.
Addressables.ReleaseInstance([생성된 인스턴스]);
(참고 : github - dang-gun/UnitySamples/AddressableSamples/Addressable_LabalLoad.cs)
마무리
테스트 프로젝트 : github - dang-gun/UnitySamples/AddressableSamples
프로젝트의 규모가 커지면 로딩을 따로 표시하고 한 번에 리소스를 로드하는 것이 좋습니다.
그래서 비동기로 리소스를 로드해야 하는데 어드레서블은 그걸 자동으로 처리해 주는 것도 편한 기능 중 하나입니다.