์–ด๋“œ๋ ˆ์„œ๋ธ” ์–˜๊ธฐ๊ฐ€ ๋‚˜์™€

ํŽธํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.


๋จผ์ €, ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์ง์ ‘ ์ž‘์„ฑํ•ด์„œ ํ˜„์žฌ ๋งŒ๋“œ๋Š” ๊ฒŒ์ž„์— ์—ด์‹ฌํžˆ ์‚ฌ์šฉ ์ค‘์ด๊ณ , ํ…Œ์ŠคํŠธ๋Š” ๋๋‚ฌ๋Š”๋ฐ

ํ•œ๋ฒˆ ์จ๋ณด์‹œ๊ณ , ๋” ์ข‹์€ ๋ฐฉ๋ฒ• ์žˆ์œผ๋ฉด ๊ฐœ๋Ÿ‰ํ•ด์„œ ์“ฐ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ถ”ํ›„ ์œ ๋‹ˆํ‹ฐ ์—์…‹์Šคํ† ์–ด์— ๋ฌด๋ฃŒ๋กœ ๊ณต์œ ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.


[ํ•ต์‹ฌ ์ฝ”๋“œ]

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.AddressableAssets;

using UnityEngine.ResourceManagement.ResourceLocations;

using UniRx.Async;


public static class CreateAddressablesLoader {

ย  ย  //# ์–ด๋“œ๋ ˆ์„œ๋ธ” ์ƒ์„ฑ

ย  ย  public static async UniTask CreateAddressable<T>(string assetNameOrLabel, List<T> createObjs) where T : Object

ย  ย  {

ย  ย  ย  ย  var locations = await Addressables.LoadResourceLocationsAsync(assetNameOrLabel).Task;

ย  ย  ย  ย  await CreateThenUpdateCollection(locations, createObjs);

ย  ย  }


ย  ย  static async UniTask CreateThenUpdateCollection<T>(IList<IResourceLocation> locations, List<T> createdObjs) where T : Object

ย  ย  {

ย  ย  ย  ย  foreach (var location in locations)

ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  var temp = await Addressables.LoadAssetAsync<T>(location).Task as T;

ย  ย  ย  ย  ย  ย  if (createdObjs.Contains(temp)) return; // ์ด๋ฏธ ํฌํ•จ๋œ ์ƒํƒœ๋ผ๋ฉด ๋ฆฌํ„ด

ย  ย  ย  ย  ย  ย  createdObjs.Add(await Addressables.LoadAssetAsync<T>(location).Task as T);

ย  ย  ย  ย  }

ย  ย  }

}


[์‚ฌ์šฉ ์ฝ”๋“œ]
LoadAssetManager.cs

...

[SerializeField] private List<GameObject> monsters;

...


/// <summary>
/// ์–ด๋“œ๋ ˆ์„œ๋ธ” - ์—์…‹ ๋กœ๋“œ
/// </summary>
private async UniTask LoadAddressable<T>(string name, List<T> t) where T : UnityEngine.Object
{
ย  ย  if (t.Where(obj => obj.name == name).Count() > 0) return;
ย  ย  await CreateAddressablesLoader.CreateAddressable(name, t);
}

public async UniTask LoadMonster(string name) => await LoadAddressable(name, monsters); // ๋ชฌ์Šคํ„ฐ ๋กœ๋“œ
...

๋ชฌ์Šคํ„ฐ๋ฅผ ๋ถ€๋ฅธ๋‹ค๋ฉด,
LoadMonster("M-9999") <--- ๋ชฌ์Šคํ„ฐ ์–ด๋“œ๋ ˆ์„œ๋ธ” ์—์…‹ ์ด๋ฆ„ ์ง€์ •ํ•œ ๊ฑฐ ๋„ฃ์–ด์คŒ

๊ฐ„๊ฒฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๊ณ ,
๋‹จ์ ์ด๋ผ๋ฉด ๋ฆฌ์ŠคํŠธ๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„๋‘๋Š” ๊ฒŒ ๋‹จ์ ์ผ ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”.

๋ฐ›์•„๋‘” ๋ฆฌ์ŠคํŠธ์—์„œ ์ด์ œ ์˜ค๋ธŒ์ ํŠธ ํ’€๋งํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ ,
๋‚˜์ค‘์— ์—์…‹ ํด๋ฆฌ์–ด๋งŒ ์ž˜ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. (๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ ์•ˆํ•˜๋ฉด ํฐ์ผ๋‚จ)

[๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ - ์ฐธ๊ณ  ์ฝ”๋“œ]

/// <summary>

/// ์–ด๋“œ๋ ˆ์„œ๋ธ” - ํ•ด์ œ (๊ฒŒ์ž„ ๋๋‚œ ํ›„)

/// </summary>

public async UniTask ClearAsset<T>(List<T> t) where T : UnityEngine.Object

{

ย  ย  for (int i = 0; i < t.Count; i++)ย {

ย  ย  ย  ย  if (t[i] == null) continue;

ย  ย  ย  ย  if (!t.Contains(t[i])) continue;

ย  ย  ย  ย  else t.Remove(t[i]);


ย  ย  ย  ย  if (t.GetType().Name == "GameObject") Addressables.ReleaseInstance(t[i] as GameObject);

ย  ย  }


ย  ย  t.Clear();

}


์œ ์‹ฌํžˆ ๋ณผ ๋ถ€๋ถ„์€ Addressable.ReleaseInstance

๋ณดํ†ต Release ํ•˜๋ฉด ๋~ ๋‚˜๋Š” ์ค„ ์•„๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


GameObject ํƒ€์ž…์„ Release ํ–ˆ์„ ๋•Œ, ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๊ฐ€ ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ,

ReleaseInstance ๋กœ ์‹œ๋„ํ•ด๋ณด์„ธ์š” :)


๊ฐœ์ธ์ ์œผ๋กœ UniRx / Linq ๋ฅผ ์‚ฌ์šฉ์ค‘์ธ๋ฐ

์Œ.. ์ฝ”๋ฃจํ‹ด์œผ๋กœ ํ•ด๋„ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค.