1. ResourceManager 기본 구현

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는 생성된 오브젝트가 특정 부모 오브젝트의 하위로 설정되도록 합니다.
  • 구현 상세:
    1. Load<GameObject>를 호출하여 경로에 해당하는 프리팹을 로드합니다.
    2. 프리팹이 존재하지 않을 경우, 디버그 메시지를 출력하고 null을 반환합니다.
    3. 프리팹이 로드되었다면 Object.Instantiate를 통해 프리팹을 인스턴스화합니다.
    • 주의: Object.Instantiate를 명시적으로 호출하는 이유는 사용자 정의 Instantiate 메서드와의 혼동을 피하기 위함입니다.
  • 사용 예:
    GameObject tank = ResourceManager.Instantiate("Tank");

Destroy(GameObject go) 메서드

  • 설명:
    • 게임 오브젝트를 삭제합니다.
    • Destroy는 동적 오브젝트를 제거하는 데 사용됩니다.
  • 구현 상세:
    1. null 확인을 통해 유효하지 않은 객체에 대한 예외를 방지합니다.
    2. 유효한 객체인 경우, Unity의 Object.Destroy 메서드를 호출하여 해당 게임 오브젝트를 삭제합니다.
  • 사용 예:
    ResourceManager.Destroy(tank);

2. Managers 클래스와 ResourceManager 통합

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 속성을 통해 초기화 및 접근이 용이합니다.
  • 초기화 로직:
    1. @Managers라는 이름의 게임 오브젝트를 찾습니다.
    2. 없다면 새로운 게임 오브젝트를 생성하고, Managers 컴포넌트를 추가합니다.
    3. 생성된 오브젝트는 DontDestroyOnLoad를 통해 씬 전환 시에도 삭제되지 않도록 설정합니다.

ResourceManager 통합

  • 설명:
    • Managers.Resource 속성을 통해 ResourceManager를 간편하게 호출할 수 있습니다.
    • 이를 통해 리소스 로드, 인스턴스화, 삭제 작업이 한 곳에서 관리됩니다.
  • 사용 예:
    tank = Managers.Resource.Instantiate("Tank");
    Managers.Resource.Destroy(tank);

3. PrefabTest 예제 코드 분석

public class PrefabTest : MonoBehaviour
{
    GameObject tank;

    void Start()
    {
        tank = Managers.Resource.Instantiate("Tank");
        Destroy(tank, 3.0f);
    }
}
  • 동작 과정:

    1. Start() 메서드에서 ResourceManager.Instantiate를 호출하여 Tank 프리팹을 인스턴스화합니다.
    2. Destroy 메서드를 통해 3초 후 해당 오브젝트를 삭제합니다.
  • 장점:

    • Managers.Resource.Instantiate를 사용함으로써 프리팹 로드 및 생성 작업이 모듈화되어 코드의 가독성과 유지보수성이 높아졌습니다.

4. ResourceManager 설계의 이점

  1. 코드 재사용성 증가:

    • 리소스 로드, 인스턴스화, 삭제 작업이 각각의 메서드로 캡슐화되어 다른 스크립트에서도 재사용이 용이합니다.
  2. 관리 효율성 증가:

    • 리소스를 중앙에서 관리함으로써 여러 곳에서 동일한 작업을 반복하거나 수정할 필요가 없습니다.
  3. 유연성 제공:

    • 제네릭 메서드(Load<T>)를 통해 다양한 타입의 리소스를 로드할 수 있습니다.
  4. 디버깅 및 유지보수 용이:

    • 리소스 로드 실패 시 디버그 메시지를 제공하여 문제를 쉽게 파악할 수 있습니다.

profile
李家네_공부방

0개의 댓글