상세 컨텐츠

본문 제목

1024 TIL - 어드레서블 독학하기

C#/Unity

by lucar 2025. 10. 24. 16:46

본문

25년도 이제 2개월 밖에 안남았다.

 

개인 프로젝트 중에 어드레서블 사용했던 내용을 저장해두면 좋을 것 같아서 글을 작성하게 되었다.

 

우선 패키지 매니저에서 어드레서블을 다운로드 한다.

 

그러면 이제 Winow창에 Addressables가 생성되는걸 확인 할 수 있다.

눌러보면 이런 창이 나오는데 간단히 설명하자면

 

여러 개의 그룹과 그 내부의 항목, 타입, 위치, 라벨이 있다.

 

그룹은 그냥 폴더처럼 사용하고 있고

내부의 항목을 보면 Music/StartSceneMusic이 보일텐데 저것이 AudioClip의 주소이다.

Path는 해당 항목의 현재 위치

라벨은 태그처럼 사용하고 있다.

 

이제 어드레서블 매니저를 작성해보자.

public class AddressableManager : DontDestroy<AddressableManager>
{
    public Dictionary<string, UnityEngine.Object> assetDictionary = new Dictionary<string, UnityEngine.Object>();
    [SerializeField] private UnityEngine.Object[] _objects;
    [SerializeField] private string[] _name;

    private void Start()
    {
        StartCoroutine(InitAddressable());
        Init();
    }

    private void Init()
    {
        for(int i = 0; i < _objects.Length; i++)
        {
            assetDictionary.Add(_name[i], _objects[i]);
        }
    }

    IEnumerator InitAddressable()
    {
        var init = Addressables.InitializeAsync();
        yield return init;
    }

    public void LoadGameAsset<T>(string id, string path) where T : UnityEngine.Object
    {
        Addressables.LoadAssetAsync<T>(path).Completed += (obj) =>
        {
            Debug.Log(obj.GetType().ToString());
            assetDictionary.Add(id, obj.Result as T);
            if (assetDictionary[id] == obj.Result as T && assetDictionary[id] != null) Debug.Log("Well Loaded");
            else
            {
                Debug.LogAssertion("Load Error Occur");
            }
        };
    }

    public T GetGameAsset<T>(string id) where T : UnityEngine.Object
    {
        if (assetDictionary[id] is T)
        {
            return assetDictionary[id] as T;
        }
        else
        {
            Debug.LogAssertion($"{id} is not {typeof(T)}");
            return null;
        }
    }

    public void AddGameAsset<T>(string id, T obj) where T : UnityEngine.Object
    {
        if(assetDictionary.ContainsKey(id))
        {
            assetDictionary[id] = obj;
        }
        else
        {
            assetDictionary.Add(id, obj);
        }
    }

    public void ShowDict()
    {
        foreach(var a in assetDictionary)
        {
            Debug.Log($"{a.Key}, {a.Value}");
        }
    }
}

나는 어드레서블 매니저를 작성하면서 언제든지 불러온 항목을 꺼내 쓸 수 있게끔 Dictionary타입으로 저장하기로 했다.

 

과정을 간단하게 보면

 

LoadGameAsset<T> 함수를 통해 id와 address를 입력받고

Addressables.LoadAssetAsync<T>를 통해 해당 주소에 맞는 리소스를 불러온다.

불러온 리소스는 T타입으로 변경한 뒤에 딕셔너리에 저장하고

 

GetGameAsset<T> 함수를 통해 딕셔너리에 저장된 항목을 T타입으로 받아온다.

 

뭔가 계속 LoadAssetAsync로 불러와서 사용한다면

리소스를 더 잡아먹을 것 같은 느낌이 들어서 이렇게 했는데 정확히는 모르겠다.

 

AddGameAsset<T> 함수를 통해 다른 곳에서 사용 중인 게임오브젝트도 바로 딕셔너리에 저장 가능하게끔 했다.

 

또 시작과 동시에 바로 필요한 파일을 Load할 수 있게끔

UnityEngine.Object 배열과 string배열을 외부에서 입력받을 수 있게 한 후

시작과 동시에 로드하게끔 했다.

 

개인 프로젝트 한다고 도트만 너무 많이 찍었다.

이제 게임 프로세스만 만들면 되니까 좀만 더 힘내보자