63 lines
2.0 KiB
C#
63 lines
2.0 KiB
C#
// using System
|
|
using UnityEngine;
|
|
|
|
public class ResourceManager {
|
|
public T Load<T>(string path) where T : Object
|
|
{
|
|
// [PM]_1. 에 해당하는 해결책: if문
|
|
if (typeof(T) == typeof(GameObject))
|
|
{
|
|
string name = path;
|
|
int idx = name.LastIndexOf('/');
|
|
if (idx >= 0)
|
|
name = name.Substring(idx + 1);
|
|
GameObject go = Managers.Pool.GetOriginal(name);
|
|
if (go != null)
|
|
return go as T;
|
|
}
|
|
return Resources.Load<T>(path);
|
|
}
|
|
|
|
public GameObject Instantiate(string path, Transform parent = null)
|
|
{
|
|
// [PM]_1. 이 original도 들고 있을 경우에는 로드 없이 사용하면 될 것 같다.
|
|
GameObject original = Load<GameObject>($"Prefabs/{path}");
|
|
if (original == null)
|
|
{
|
|
Debug.Log($"Prefab Missing! {path}");
|
|
return null;
|
|
}
|
|
|
|
// [PM]_2. 혹시 풀링된 오브젝트가 있을 경우에는 그걸 사용하면 된다.
|
|
|
|
// [PM]_2. 의 해결책
|
|
if (original.GetComponent<Poolable>() != null)
|
|
return Managers.Pool.Pop(original, parent).gameObject;
|
|
|
|
// 여기는 프리팹을 만들다 보면 뒤에 (Clone) 이라는 이름이 붙는다.
|
|
// 이걸 제거하는 작업
|
|
GameObject go = Object.Instantiate(original, parent);
|
|
int idx = go.name.IndexOf("(Clone)");
|
|
if (idx > 0)
|
|
go.name = original.name;//go.name.Substring(0, idx);
|
|
return go;
|
|
|
|
// return Object.Instantiate(prefab, parent);
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|