using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ResourceManager
{
public T Load<T>(string path) where T : Object
{
return Resources.Load<T>(path);
}
public GameObject Instantiate(string path, Transform parent = null)
{
GameObject prefab = Load<GameObject>($"Prefabs/{path}");
if (prefab == null)
{
Debug.Log($"Failed to load prefab: {path}");
return null;
}
return Object.Instantiate(prefab, parent);
}
public void Destroy(GameObject go)
{
if (go == null)
{
return;
}
Object.Destroy(go);
}
}
Load<T>(string path) 메서드Resources.Load<T>(path)를 통해 지정된 경로의 리소스를 불러옵니다.T는 제네릭 타입으로, 호출 시 특정 리소스 타입(예: GameObject, AudioClip, Texture2D 등)을 지정할 수 있습니다.where T : Object 제약 조건은 Unity의 Object 클래스(프리팹, 텍스처 등 Unity 자원)를 상속받은 타입만 사용할 수 있도록 제한합니다.GameObject prefab = ResourceManager.Load<GameObject>("Prefabs/Tank");Resources 폴더 내의 Prefabs/Tank 경로를 기준으로 Tank 프리팹을 찾고, 해당 프리팹을 메모리로 로드하여 반환합니다.Instantiate(string path, Transform parent = null) 메서드parent는 생성된 오브젝트가 특정 부모 오브젝트의 하위로 설정되도록 합니다.Load<GameObject>를 호출하여 경로에 해당하는 프리팹을 로드합니다.null을 반환합니다.Object.Instantiate를 통해 프리팹을 인스턴스화합니다.Object.Instantiate를 명시적으로 호출하는 이유는 사용자 정의 Instantiate 메서드와의 혼동을 피하기 위함입니다.GameObject tank = ResourceManager.Instantiate("Tank");Destroy(GameObject go) 메서드Destroy는 동적 오브젝트를 제거하는 데 사용됩니다.null 확인을 통해 유효하지 않은 객체에 대한 예외를 방지합니다.Object.Destroy 메서드를 호출하여 해당 게임 오브젝트를 삭제합니다.ResourceManager.Destroy(tank);public class Managers : MonoBehaviour
{
static Managers s_instance;
static Managers Instance { get { Init(); return s_instance; } }
ResourceManager _resource = new ResourceManager();
public static ResourceManager Resource { get { return Instance._resource; } }
void Start()
{
Init();
}
void Update()
{
}
static void Init()
{
if (s_instance == null)
{
GameObject go = GameObject.Find("@Managers");
if (go == null)
{
go = new GameObject { name = "@Managers" };
go.AddComponent<Managers>();
}
DontDestroyOnLoad(go);
s_instance = go.GetComponent<Managers>();
}
}
}
Managers 클래스는 전역에서 하나의 인스턴스로만 존재하며, 이를 통해 관리 객체들을 일관되게 관리할 수 있습니다.Instance 속성을 통해 초기화 및 접근이 용이합니다.@Managers라는 이름의 게임 오브젝트를 찾습니다.Managers 컴포넌트를 추가합니다.DontDestroyOnLoad를 통해 씬 전환 시에도 삭제되지 않도록 설정합니다.Managers.Resource 속성을 통해 ResourceManager를 간편하게 호출할 수 있습니다.tank = Managers.Resource.Instantiate("Tank");
Managers.Resource.Destroy(tank);public class PrefabTest : MonoBehaviour
{
GameObject tank;
void Start()
{
tank = Managers.Resource.Instantiate("Tank");
Destroy(tank, 3.0f);
}
}
동작 과정:
Start() 메서드에서 ResourceManager.Instantiate를 호출하여 Tank 프리팹을 인스턴스화합니다.Destroy 메서드를 통해 3초 후 해당 오브젝트를 삭제합니다.장점:
Managers.Resource.Instantiate를 사용함으로써 프리팹 로드 및 생성 작업이 모듈화되어 코드의 가독성과 유지보수성이 높아졌습니다.코드 재사용성 증가:
관리 효율성 증가:
유연성 제공:
Load<T>)를 통해 다양한 타입의 리소스를 로드할 수 있습니다.디버깅 및 유지보수 용이: