프로그래밍/Unity, MAUI, Mono

[Unity] 어드레서블(Addressable) 빠르게 사용해 보기 (4/4) - 여러 리소스를 한 번에 비동기로 리소스를 로드(Load)하고 사용하기

당근천국 2024. 7. 27. 15:30

이 포스팅은 어드레서블(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

 

프로젝트의 규모가 커지면 로딩을 따로 표시하고 한 번에 리소스를 로드하는 것이 좋습니다.

그래서 비동기로 리소스를 로드해야 하는데 어드레서블은 그걸 자동으로 처리해 주는 것도 편한 기능 중 하나입니다.