코가손의 블로그
[DevLogUnity_Soulslike] 에셋관리, Addressable(로컬) 본문
Addressable이란?
리소스 폴더방식의 단점
- 빌드 사이즈 커져서 앱 시작 시간이 길어짐, 조금만 고쳐도 빌드가 무겁다
- 에셋 이름 변경이 어렵다
Asset을 '주소'로 Load할 수 있다
- 에셋이 Load되는 위치를 분리할 수 있다
- 원격서버에 업로드된, 앱 내부에 있지만 위치가 바뀜... 등의 상황에서 유연함
- 메모리 효율적으로 관리 가능(참고)
Addressable 세팅
그룹 만들기
Window -> Asset Management -> Addressables -> Groups
프로파일 세팅
좌상단 Profile: Default -> Manage Profile
추후 서버 사용 시, Remote주소 설정 가능
생성한 그룹 세팅
Cache Clear Behavior 세팅, "Clear When When New Version Loaded" 선택
- 변경사항 생기면 이전 Bundle제거, 새로운 Bundle 적용(적용 안하면, 번들 변경 될 때마다 따로 저장됨)
Inspect Top Level Settings설정(우상단)
Unique Bundle IDs 체크
-- 체크 안되어 있다면, 빌드마다 기존꺼 포함되서 추가됨
Send Profiler Events
- Event Viewer창을 통해서 메모리 로드/언로드 확인 가능
Build Remote Catalog
- Catalog의 사본을 생성 후 서버에 올려서 불러와주어야 함
Build & Load Paths, Remote로 설정
- Inspect Top Level Settings와 DefaultGroup 둘다 설정해야함
Addressable 등록
폴더 생성 -> 등록하고자하는 Object 프리팹, 경로에 넣기 -> Inspector에서 Addressable 체크 활성화
- Group에 프리팹 등록됨
- 자식이 많은 프리팹 등록 시, Material은 등록이 안되서 자식오브젝트가 많은 경우 손수 등록
- Image, Audio는 리소스에서 Addressable체크 가능
등록 마치면 Label통해서 구별 가능
스크립트
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.UI;
public class AddressableManager : MonoBehaviour
{
[SerializeField]
private AssetReferenceGameObject characterObj;
[SerializeField]
private AssetReferenceGameObject[] buildingObjs;
[SerializeField]
private AssetReferenceT<AudioClip> soundBGM; // Audio Source
[SerializeField]
private AssetReferenceSprite flagSprite; // image File
[SerializeField]
private GameObject BGMObj;
[SerializeField]
private Image flagImage; // canvas 접근용
private List<GameObject> gameObjects = new List<GameObject>();
private void Start()
{
StartCoroutine(InitAddressable());
}
// 시작 시, Addressable초기화
IEnumerator InitAddressable()
{
var init = Addressables.InitializeAsync();
yield return init;
}
// Addressable 로드해서 사용하기(ex.버튼 누르면 스폰)
public void SpawnObject()
{
// Obj 생성, 삭제는 리스트에 추가해두고 해제하기
characterObj.InstantiateAsync().Completed += (obj) =>
{
gameObjects.Add(obj.Result);
};
for (int i = 0; i < buildingObjs.Length; i++)
{
buildingObjs[i].InstantiateAsync().Completed += (obj) =>
{
gameObjects.Add(obj.Result);
};
}
soundBGM.LoadAssetAsync().Completed += (clip) =>
{
var bgmSound = BGMObj.GetComponent<AudioSource>();
bgmSound.clip = clip.Result;
bgmSound.loop = true;
bgmSound.Play();
};
flagSprite.LoadAssetAsync().Completed += (img) =>
{
var image = flagImage.GetComponent<Image>();
image.sprite = img.Result;
};
}
public void Release()
{
soundBGM.ReleaseAsset();
flagSprite.ReleaseAsset();
if (gameObjects.Count == 0)
{
return;
}
var index = gameObjects.Count - 1;
Addressables.ReleaseInstance(gameObjects[index]);
gameObjects.RemoveAt(index);
}
}
빌드
Build -> New Build -> Default Build Script로 빌드
Play Mode Script에서 "Use Asset Database"선택
'GameDevLog > Unity' 카테고리의 다른 글
[DevLogUnity_Soulslike] 에셋관리, Addressable(서버) (0) | 2023.09.05 |
---|---|
[DevLogUnity_뱀서라이크 자작게임] Google Sheets 캐릭터 스탯 연동, Exp&Gold 획득 (0) | 2023.08.17 |
[DevLogUnity_뱀서라이크 자작게임] google spreadsheet DB적용, 캐릭터 선택 (0) | 2023.08.11 |
[DevLogUnity_뱀서라이크 자작게임] 모바일 환경 구축, 몬스터 스폰&공격 (0) | 2023.08.07 |
[DevLogUnity_TowerDeffence] TowerSpawn&Attack, ObjectPool (0) | 2023.08.01 |