TIL_240116

Z_제트·2024년 1월 16일
0

TODAY I LEARNED

목록 보기
55/88
post-thumbnail

to do_오늘 할 일

retro_오늘 한 일(회고)

최종프로젝트 진행상황

오늘의 작업 :

  • 게임 플레이를 위한 최소한의 기능 정리 및 역할 분담
  • ResourceManager.cs 보수 (feat. 제네릭)

최소한의 기능 정리 및 역할 분담

최소한의 기능 정리.jpg


이 기능들을 바탕으로 필요할 것 같은 class 들을 최대한 디테일하게 정리를 진행했다.

TileManager

GameManager

StageManager

MainSceneUI


역할 분담 진행 결과,
나는 GameManagerMainSceneUI 작업을 담당하게 되었다 !
대체 어떻게 작업을 시작해야할지 아무것도 모르겠지만
어쩌겠습니까 ! 일단 후회없이 최선을 다해서 해내봐야죠 ! 🔥


ResourceManager.cs 보수

오늘 조원분께서 정말 소중한 아이디어와 도움을 제공해주셔서
기존 코드에서 중복되는 부분들을 제네릭을 통해 간결하게 만들었다 !

using System.Collections.Generic;
using UnityEngine;

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

    // 초기화 과정에서 Load 또는 LoadAll
    public bool Init()
    {
        // 이런 식으로 Init 에서 필요한 것들 Load 관련 함수 사용해서 불러오면 되는건가
        Load<SpriteRenderer>("");
        LoadAll<GameObject>("");

        return true;
    }

    // Load - 배열아닌 ver.
    public T Load<T>(string path) where T : Object
    {
        T resource = Resources.Load<T>(path);
        _resources.Add(resource.name, resource);
        return resource;
    }

    // Load - 배열 ver.
    public T[] LoadAll<T>(string path) where T : Object
    {
        T[] resources = Resources.LoadAll<T>(path);
        foreach (T resource in resources) // T 대신 Object 도 가능.
        {
            _resources.Add(resource.name, resource);
        }
        return resources;
    }

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

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

새롭게 알게 된 것s :
// 제네릭 그 자체
// 형변환 관련 - as

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

0개의 댓글