public T Load<T>(string path) where T : Object
{
if (typeof(T) == typeof(GameObject))
{
string name = path;
int index = name.LastIndexOf('/');
if (index >= 0)
name = name.Substring(index + 1);
GameObject go = Managers.Pool.GetOriginal(name);
if (go != null)
return go as T;
}
return Resources.Load<T>(path);
}
GameObject를 Load하는 경우 Pool매니저의 GetOriginal 함수를 사용하여 go에 접근한다.
만약 풀링한 go가 있을 경우 해당 go를 반환한다.
public GameObject Instantiate(string path, Transform parent = null)
{
GameObject original = Load<GameObject>($"Prefabs/{path}");
if (original == null)
{
Debug.Log($"Failed to load prefab : {path}");
return null;
}
if (original.GetComponent<Poolable>() != null)
return Managers.Pool.Pop(original, parent).gameObject;
GameObject go = Object.Instantiate(original, parent);
go.name = original.name;
return go;
}
original이 Poolable 컴포넌트가 있는 경우 PoolManager에서 Pop함수를 통해 루트에 존재하는 go를 instantiate 한다.
public void Destroy(GameObject go)
{
if (go == null)
return;
Poolable poolable = go.GetComponent<Poolable>();
if (poolable != null)
{
Managers.Pool.Push(poolable);
return;
}
Object.Destroy(go);
}
gameObject가 Poolable 컴포넌트가 있으면 PoolManager에서 Push함수를 써서 루트 산하로 넣는다.
그렇지 않은 경우 기존 방식과 마찬가지로 go를 Destroy한다.
[LoginScene]
5개의 UnityChan Prefab을 Instantiate하고 바로 Destroy 하였다.
UnityChan은 Poolable이 부착되어있는데, 이 때문에 UnityChan_Root로 이동한다.
[GameScene]
5개의 UnityChan을 Instantiate하였다.
기존에 있는 1개를 포함하여 총 6개의 UnityChan이 생성됨을 확인하였다.
DontDestroyOnLoad에 UnityChan_Root가 생성됨을 확인하였다.