-
[Unity] Adressable 사용법과 그룹 세팅, 단순 불러오기카테고리 없음 2024. 10. 25. 19:18
사용해 본적은 많지만, 하나부터 차근차근 사용해본적은 없어서 예시로 프로젝트 하나에 적용해볼 겸 블로그 작성
Adressable을 사용해야하는 이유
우리가 만약 오브젝트를 동적으로 생성한다고 가정했을 때
1. Instantiate를 사용
//예시 Public class Test: MonoBehaviour { [SerializeField]private GameObject prefab; void Start() { GameObject obj = Instantiate(prefab); } }
Instantiate함수를 활용하여 Public으로 게임 오브젝트를 선언해서 해당하는 프리팹을 할당해 주거나.
2. Resource.Load 사용
//예시 Public class Test: MonoBehaviour { void Start() { GameObject obj = Resources.Load<GameObject>("Prefabs/Prefab")//경로 지정 } }
불러올 프리팹이 Resources폴더 안에 있어야 하고 Resources.Load를 사용하여 오브젝트를 불러와야한다.
리소스 로드 V.S 어드레서블
Resources.Load Adressable 로딩 방식 모든 리소스를 메모리에 불러옴
불필요한 리소스까지 로드되거나 메모리 계속 유지비동기적으로 리소스를 로드
필요한 리소스만 선택적으 불러옴메모리 관리 사용이 끝난 리소스를 명시적으로 언로드 해야함 사용하지 않는 리소스 자동 해제 빌드 모든 리소스를 다시 패키징 변경된 리소스만 업데이트 가능 불러오는 방식 로컬 경로에만 리소스를 로드 서버를 붙여 서버로부터 리소스를 로드 가능 사용 난이도 매우 간단하지만 대규모 프로젝트에는 부적합 초기 설정이 복잡함, 그렇지만 이득이 더 많다. 잘 이해가 안가는 것도 있지만 표로 정리해 봤을때는 어드레서블이 장기적으로 좋다는 결론이다.
어드레서블 사용법
1. 설치 방법
Window - PackageManager - UnityRegistry에서 Adressables 설치
설치가 잘 완료되었다면 이렇게 Prefab이나 이미지를눌러보면 어드레서블 토글이 보인다.
이 토글을 체크하면 현재 폴더 위치에 따라 자동으로 주소가 설정되는데 이거 원하는대로 수정이 가능하다.
이렇게 주소를 설정해두면 현재 프리팹이 다른 폴더로 이동이 되어도 불러오는데 지장이 없다고 한다.
2. Adressable그룹
Window - Asset Management - Addressables - Group
이 그룹은 하나로 묶이게 되고 이 그룹안에 있는 하나의 리소스를 불러오기만 해도 통째로 불러와진다고 한다.
(UI Atlas같은 느낌아닐까?)
또한 Label이라는 기능이 있는데 그룹에 상관없이 특정라벨인 리소스들을 불러올 수 있다.(이건 GameObject의 Tag랑 비슷한 느낌 같다.)
2-1 그룹 설정 세팅
그룹을 새로만들고 누르면 Inspector창에서 그룹을 세팅할수 있는 정보가 나오고
CacaheClearBehaviour에서 ClearWhenWhenNewVersionLoaded를 설정해주자
이건 변경 사항이 있어서 번들을 다운받게 된다면 이전 번들은 제거하고 새로 변경해준다.
선택해주지 않는다면 해당 기기에 번들이 변경 될 때마다 따로 저장하기 때문에 용량이 계속해서 늘어날 수 있다.
그다음에 맨 위에 InspectTopLevelSettings에 들어간다
(다른 버전에 SystemSettings이 있는거 같지만 2022.3.17.f1기준으로는 보이지 않다.)
다음 Build에서 UniqueBundleIDs를 체크해준다.
체크되지 않았다면 빌드때마다 기존꺼를 포함해서 전부 추가해주게 된다.
체크되면 기존꺼는 제외하고 새로운 것만 추가하게 된다.
체크하면 EventViwer을 통해 어떻게 되는지 확인할 수 있다.
이걸 통래 메모리가 로드되거나 언로드되는걸 확인할 수 있다.
BuildRemoteCatalog는 꼭 체크하라하는데 Catalog의 사본을 생성해주고 서버에 올려 불러와줘야하기 때문이라는데 사실 아직 서버안붙여봐서 잘모르겠다(모르니깐 하라는대로 함)
추가로 Build & Load Paths는 Remote로 설정해주자.
3. 실제로 불러오는 예시 (코드 사용)
https://docs.unity3d.com/Packages/com.unity.addressables@1.19/api/index.html
추가적인 api는 여기서 참고할 것
AssetReferneceGameObject : 게임오브젝트 타입을 가져올 때 사용, 여러개 가져오면 [] 을 붙여서 배열로 가져온다.
AssetReferenceSprite: 스프라이트 타입을 가져올 때 사용
AssetReferenceT<타입명>
InstantiateAsyc(): 불러온 리소스를 생성해주는 함수
<=> Adressable.ReleaseInstance() : 불러온 리소스 메모리 해제
LoadAssetAsync(): 불러운 리소스를 할당해 줄 수 있다. (이미지나 음원 등)
<=> .ReleaseAssets() : 불러온 리소스 메모리 해제
.Completed += : Completed 를 추가해주고 람다식으로 추가해줄 수 있다.
using UnityEngine; using UnityEngine.AddressableAssets; public class AddressableManager : MonoBehaviour { [SerializeField] private AssetReferenceGameObject[] buildingObj; void Start() { //단순 사용예시 GameObject obj =buildingObj[0].InstantiateAsync(); buildingObj[0].InstantiateAsync().Completed += (obj)=> { //원하는 작동 코드 }; Adressables.ReleaseInstance(obj); //메모리 해제 // .ReleaseAssets() } }
이러고 작동하면 잘 되는 것을 확인할 수 있지만...
하나하나 프리팹을 넣어야한다는 점에서 메모리상 성능 차이는 있어도 개발자가 체감하기에는 별로인 것 같아.
다음에는 그룹화된 어드레서블을 통째로 가져오고 불러올 수 있을지 방법을 생각해 구현해보려 한다.