TIL_240115

Z_제트·2024년 1월 15일
0

TODAY I LEARNED

목록 보기
54/88
post-thumbnail

to do_오늘 할 일

retro_오늘 한 일(회고)

최종프로젝트 진행상황

역할 분담 : 매니저

나는 ResourceManager 담당 !


ResourceManager 설계

  1. 각 Assets 들을 Dictionary 로 관리
  2. Init 에서 자료 LoadAll 진행 (Resources.LoadAll<T>("경로");)
  3. 각각의 자료에 대해서 Load 해주기 (e.g. LoadSprite(), LoadPrefab(), etc)
  4. pooling 옵션이 추가된 Instantiate 함수 만들기
    + Instantiate 한다면 Destroy 함수도 챙겨야죠 ~!

계속해서 신경써야 할 부분 :

  • 예외처리 및 null 검사 습관화할 것
  • public 과 private 설정 잘 할 것

ResourceManager.cs

using System.Collections.Generic;
using UnityEngine;

public class ResourceManager : IManagers
{
    // 각 Assets 들을 Dictionary 로 관리
    private Dictionary<string, Sprite> _sprites = new Dictionary<string, Sprite>();
    private Dictionary<string, GameObject> _prefabs = new Dictionary<string, GameObject>();

    // 초기화 과정에서 LoadAll
    public bool Init()
    {
        Sprite[] sprites = Resources.LoadAll<Sprite>(""); // todo : 경로 추가
        foreach (Sprite sprite in sprites)
        {
            _sprites.Add(sprite.name, sprite);
        }

        GameObject[] objs = Resources.LoadAll<GameObject>(""); // todo : 경로 추가
        foreach (GameObject obj in objs)
        {
            _prefabs.Add(obj.name, obj);
        }

        return true;
    }

    public Sprite LoadSprite(string key)
    {
        // TryGetValue - Dictionary 안에 해당 key 가 있는지 확인하고, 있으면 sprite 리턴, 없으면 false 리턴.
        // TryGetValue 는 key 가 없는 경우에 false 를 리턴해주면서 최대한 에러 뜨는 걸 최소화(?)시켜준다고 보면 된다.
        if (!_sprites.TryGetValue(key, out Sprite sprite))
        {
            Debug.LogError($"[ResourceManager] LoadSprite({key}) : Failed to load sprite.");
            return null;
        }

        return sprite;
    }

    public GameObject LoadPrefab(string key)
    {
        if (!_prefabs.TryGetValue(key, out GameObject prefab))
        {
            Debug.LogError($"[ResourceManager] LoadPrefab({key}) : Failed to load prefab.");
            return null;
        }

        return prefab;
    }
    
    public GameObject InstantiateWithPoolingOption(string key, Transform parent = null, bool pooling = false) // 선택적 매개변수 -- 위치 항상 뒤에 있도록 주의 !
    {
        GameObject prefab = LoadPrefab(key);
        if (prefab == null)
        {
            Debug.LogError($"[ResourceManager] InstantiateWithPoolingOption({key}) : Failed to load prefab.");
            return null;
        }

        if (pooling)
        {
            return Main.Get<PoolManager>().Pop(prefab);
        }

        // pooling 이 false 면 pooling 이 적용 안 된 Instantiate 진행 !
        GameObject obj = Object.Instantiate(prefab, parent);
        obj.name = prefab.name;
        return obj;
    }

    public void Destroy(GameObject obj)
    {
        if (obj == null)
        {
            return;
        }

        if (Main.Get<PoolManager>().Push(obj))
        {
            return;
        }

        // pooling 이 적용 안 된 친구들은 Destroy.
        Object.Destroy(obj);
    }
}

profile
trying to make the world a better place with a cool head and warm heart

0개의 댓글