야근에 야근에 야근을 더해서
ㅇ<-<
이미 쓰러진 감자입니다
개쩌는 코드 리팩토링의 시작
기능 구현하면서 자꾸 코드를 더 깔끔하게 만들고 싶은 욕심이 나서 결국 코드 리팩토링하는데 시간을 한참 썼다.
우선 저번 팀 과제에서 시간 부족으로 시도하지 못했던 UI Manager를 하나만 만들어서 게임 전체 UI를 관리하게 하는 것
public void RemoveUIComponent<T>(T uiComponent) where T : GameUIClass
{
if (uiDic.ContainsKey(typeof(T).Name))
{
uiDic.Remove(typeof(T).Name);
}
}
그리고 UI Manager를 하나로 만든 것에서 나아가 모든 Manager 클래스들을 처음 Scene에서 만들고 DontDestroyOnLoad에 담아서 Scene을 이동하면서 전달하는 것!
이를 위해서 SingletonManager라는 클래스를 새로 만들었다. trigger 같은 역할이라고 생각하면 될듯
UI Manager와 비슷하게 Dictionary에 Manager 클래스들을 담아서 관리한다. 이것도 Monobehaviour가 아니라 전체 Manager 클래스가 상속받는 부모 클래스를 value 값으로 들고 있게 바꿀 수 있을 듯..?!
처음에 Manager Instance들이 Dictionary에 있는지 확인하고, 없다면 생성해준다.
public class SingletonManager : MonoBehaviour
{
public static SingletonManager Instance;
Dictionary<string, MonoBehaviour> managerDic;
private void Awake()
{
if (Instance == null)
{
Instance = this;
}
else if (Instance != this)
{
Destroy(gameObject);
return;
}
DontDestroyOnLoad(gameObject);
// 닉네임 입력부터 하고 싶을 때 PlayerDatabase 지우고 주석 풀기
//PlayerPrefs.DeleteAll();
managerDic = new Dictionary<string, MonoBehaviour>();
InitManagerInstance<DataManager>();
InitManagerInstance<UIManager>();
InitManagerInstance<GameManager>();
InitManagerInstance<SoundManager>();
}
public void InitManagerInstance<T>() where T : MonoBehaviour
{
string key = typeof(T).Name;
if (!managerDic.ContainsKey(key))
{
var obj = new GameObject();
obj.name = key;
managerDic.Add(key, obj.AddComponent<T>());
}
}
}
이렇게 SingletonManager만 StartScene에 미리 생성해놓으면 Hierarchy 창은 아래와 같이 깔꼼해진다.
그리고 게임을 시작하면 이렇게 Manager 오브젝트들이 DontDestroyOnLoad에 담겨서 좌르륵 생성된다.
이렇게 마참내 전체 게임에서 기능별 Manager가 각각 하나씩만 있는 구조 완성~,,!
private void Awake()
{
...
SceneManager.activeSceneChanged += OnActiveSceneChanged;
}
public void OnActiveSceneChanged(Scene scene1, Scene scene2)
{
InitUIComponent();
}
private void InitUIComponent()
{
switch (_curState)
{
case SceneStateType.START:
InitStartSceneComponent();
break;
case SceneStateType.MAIN:
InitMainSceneComponent();
break;
}
}
public void OnPointerEnter()
{
_itemNameText.text = _item.Name;
string effectStr = "";
switch (_item.Type)
{
case ItemType.HEALTH:
effectStr = "피로도 -";
break;
case ItemType.ATTACK:
effectStr = "공격력 +";
break;
case ItemType.SHIELD:
effectStr = "방어력 +";
break;
}
_itemEffectText.text = effectStr + _item.Value;
_itemDescriptionImage.SetActive(true);
_animator.SetBool("IsOpen", true);
}
public void OnPointerExit()
{
_animator.SetBool("IsOpen", false);
_itemDescriptionImage.SetActive(false);
}
사실 UI 꾸미기 욕심만 없었으면 진작 끝냈겠지만 UI 꾸미는거 어떻게 참음?
여기 와서 유니티보다 포토샵을 더 만지는 것 같지만 기분 탓이겠지 응
열심히 만든 UI는 다음 TIL에서 공개...
커 밍 쑨 !
야근이 복사가 되는 이벤트
이번주 내내 야근을 누려보세요!
히히...밤새.....죽어보자고..........
끗~