Unity_Learn/Assets/Scripts/Managers/ResourceManager.cs
2025-09-10 12:54:42 +09:00

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);
}
}