코가손의 블로그

[DevLogUnity_Soulslike] 에셋관리, Addressable(로컬) 본문

GameDevLog/Unity

[DevLogUnity_Soulslike] 에셋관리, Addressable(로컬)

Cogason 2023. 9. 4. 23:03

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);
    }
}

inspector 세팅

빌드

Build -> New Build -> Default Build Script로 빌드

Play Mode Script에서 "Use Asset Database"선택

 

 

 

Comments