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배열을 외부에서 입력받을 수 있게 한 후
시작과 동시에 로드하게끔 했다.
개인 프로젝트 한다고 도트만 너무 많이 찍었다.

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