Unity

리소스 관리 - Addressable (1) - 초기세팅 및 코드베이스

Dean83 2024. 2. 1. 15:01

이전에는 유니티에서 텍스쳐 등 각종 리소스를 사용하기 위해 Resources 폴더를 만들고, 리소스들을 몰아 넣었다.

이후, 인스펙터나 씬에 해당 리소스들을 직접 연결함으로서 사용하였는데, 이럴경우 문제가 있다. 

 

  • 사용하지 않는 리소스 이라도 메모리에 올린다.
  • 빌드 결과 파일 용량이 커지고, 메모리 및 로딩속도가 오래 걸린다.
  • 미사용 리소스 정리가 어렵다

해서, AssetBundle 이라는 것이 생겼으나, 사용의 불편함 (예 : 모델링 파일 사용시 메쉬 등 도 일일히 미리 로딩 해야함) 이 있어 나온것이

Addressable 이다. 

 

* 주의 : Addressable 로 리소스 등록시, Stack 을 따른다. 즉 Last in First Out이 되므로, 리소스의 순서가 중요하다면 이점을 유의하여 등록하자

 

Addressable 을 이용하면, 

  • 리소스를 Resources 에 두지 않아도 된다 (심지어 리소스가 온라인 스토리지에 있어도 된다)
  • 태그 이름만으로 해당 리소스를 불러올 수 있다
  • 리소스 불러 오는 작업이 비동기로 동작한다
  • 연관된 리소스들을 자동으로 불러온다
  • 씬 또한 Addressable로 관리가 가능하다.
  • 동일한 리소스를 여러곳에서 로딩할때, 메모리할당을 새로 하지 않는다.
  • 리소스 릴리즈시, 만일 해당 리소스가 다른곳에서 사용중이라면 릴리즈 하지 않고 나중에 사용중인곳이 없을때 릴리즈 한다
    • 즉, 메모리 관리를 알아서 해준다

1. Addressable 설치

  • Addressable 을 이용하기 위해 Unity 상단 메뉴 -> Window -> Package Manager -> Unity Registry -> Addressable
    설치

2. 기존 Resources 폴더 내 리소스를 Addressable로 전환

  • Resources 에 존재하는 리소스 선택
  • Inspector -> addressable 에 체크
  • Resources 폴더에서 xxx 로 옮기겠냐는 팝업창에서 Yes 클릭
  • Unity 상단 메뉴 -> Window -> Asset Management -> Addressable -> Group 클릭시 위치 및 명칭 확인 가능
    • 그룹을 변경 할 수도 있다. 
  • Scene 파일 또한 Addressable로 관리할 수 있다

3. 스크립트에서 GameObject 리소스 로딩  예 (1)

     - 비동기로 불러오며, completed 이벤트에서 Instantiate를 통하여 불러온 리소스를 메모리 할당 해야 한다.

....
[SerializeField]
private string address변수명;

private AsyncOperationHandle<GameObject> operation변수명;

.....

on Start()
{
	operation변수명 = Addressable.LoadAsync<GameObject>(address변수명);
    operation변수명.Completed += 콜백함수명
}

void 콜백함수명(AsyncOperationHandle<Gameobject>obj)
{
	if(obj.Status == AsyncOperationStatus.Succeeded)
    {
        Instantiate(obj.Result, operation변수명);
    }
}

void OnDisable()
{
    operation변수명.Completed -= 콜백함수명;
}

....

 

 

4. Inspector 에서 Addressable 이름 배정

  • 불러올 Addressable 이름을 위에서 선언한 변수 Inspector에 넣어주면 된다.
  • 반드시 알맞은 이름을 넣어야 하며, 이름은 유니크 하게 만드는것을 추천
  • 개발 후 이름변경을 하지 말것을 추천 (빌드를 다시 안하기 위한)

 

5. Release

  • 사용 후 릴리즈를 하고싶다면, 다음의 코드 사용
  • 만일, 다른곳에서 사용하고 있는 리소스일 경우, 릴리즈되지 않고, 자동으로 관리해준다
Addressables.ReleaseInstance(AsyncOperationHandle변수명);