최종프로젝트 진행상황
오늘의 작업 :
최소한의 기능 정리.jpg
이 기능들을 바탕으로 필요할 것 같은 class 들을 최대한 디테일하게 정리를 진행했다.
TileManager
GameManager
StageManager
MainSceneUI
역할 분담 진행 결과,
나는 GameManager 와 MainSceneUI 작업을 담당하게 되었다 !
대체 어떻게 작업을 시작해야할지 아무것도 모르겠지만
어쩌겠습니까 ! 일단 후회없이 최선을 다해서 해내봐야죠 ! 🔥
오늘 조원분께서 정말 소중한 아이디어와 도움을 제공해주셔서
기존 코드에서 중복되는 부분들을 제네릭을 통해 간결하게 만들었다 !
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