2. 에러 프리팹 관리 스크립트StaticManager ,UIManager
StaticManager
로그인 코드를 볼때
ui를 가져올때 staticmanager 코드에서 인스턴스 해주는 것이 많았다.
그래서 오늘은 staticmanager을 공부 해보려 한다.
- 키워드 : 인스턴스
public static StaticManager Instance { get; private set; }
public static BackendManager Backend { get; private set; }
public static UIManager UI { get; private set; }
싱글턴 패턴 및
staticmanager 코드 자식으로 불러오기 위해서 선언
- 키워드 : GetComponentInchildren<T>();
Init 코드는 한마디로 싱글톤패턴 및 오브젝트 파괴 방지
또한 ui Backend 를 staticmanager 자식으로 만들기 위해서 선언
void Awake() {
Init();
}
void Init() { // 이코드를 넣으면 ui,backend 자식이 생김
if (Instance != null) {
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(this.gameObject);
Backend = GetComponentInChildren<BackendManager>();
UI = GetComponentInChildren<UIManager>();
UI.Init();
Backend.Init();
결국 아래와 같이 생긴다고 볼수 있음
uimanager 에있는Init 를가져온다는 뜻임 (저 코드 안에도 init가 있기 때문에 )
- 키워드 : 씬 변경및 페이드아웃 코드
public void ChangeScene(string sceneName) {
UI.FadeUI.FadeStart(FadeUI.FadeType.ChangeToBlack, () => SceneManager.LoadScene(sceneName));
}
UIManager
ui manager 안에 fade ui ,alert ui 에 대해서 설명하겠다.
- 키워드 : 인스턴스
[SerializeField]
private FadeUI _fadeUI;
[SerializeField]
private AlertUI _alertUI;
// 알림 UI
public AlertUI AlertUI {
get { return _alertUI; }
}
//페이드 in/out UI
public FadeUI FadeUI {
get { return _fadeUI; }
}
[SerializeField] private GameObject _loadingAnimationIcon;
- 키워드 : 자식 , 활성화 , 비활성화
public void Init() {
AlertUI.Init();
FadeUI.Init();
AlertUI.gameObject.SetActive(false);
FadeUI.gameObject.SetActive(false);
_loadingAnimationIcon.gameObject.SetActive(false);
}
방금 말했듯이 Init 이코드를 가져와서 위에 자식으로 만들어주는거다
uimanager의 자식으로 alertui와 fadeui가 생기게 되는것이다.
또한 그자식들의 버튼은 비활성화 되어있다고 보면된다.
- 키워드 : Resources 파일 생성,검색
private bool TryLoadUIObject(string prefabName, Transform parent, out GameObject gameObject) {
gameObject = null;
string path = $"{prefabName}";
GameObject loadObject = Resources.Load<GameObject>(path);
if (loadObject == null) {
Debug.LogError($"{prefabName}가 Prefab에 존재하지 않습니다. in {path}");
return false;
}
gameObject = Object.Instantiate(loadObject, parent, true);
gameObject.transform.localScale = Vector3.one;
gameObject.transform.localPosition = Vector3.zero;
return true;
}
처음 볼땐 이해가 안됬는데
이거는 오브젝트가 없을 경우, Resources에서 검색하여 생성한다. 이다.
보면 loadObject를 리소스를 로드 하는것 이라고 정의했다.
그래서 이 loadObject가 존재하지 않는다면 false로
크기와 위치를 설정해주고 성공했다면 true을 반환
- 키워드 : 오류가 났을때 이패널을 넣어서 어떤 패널을 넣을 건지 결정
// ====================================================================
// 현재 씬에 UICanvas를 생성한다. 씬이 이동할 경우 없어지며 새로운 UI를 만든다.
// 생성만 가능하기에 삭제가 가능한 Resources의 오브젝트만 해당 UI로 할당한다.
// ====================================================================
public void OpenUI<T>(string folderPath, Transform parent) where T : BaseUI{
if (TryLoadUIObject(folderPath + "/"+ typeof(T).Name, parent, out var uiObject) == false) {
StaticManager.UI.AlertUI.OpenErrorUI(GetType().Name,MethodBase.GetCurrentMethod()?.ToString(), folderPath + "를 찾을 수 없습니다.");
return;
}
uiObject.GetComponent<BaseUI>().OpenUI();
}
- 키워드 : 로딩 애니메이션
로딩 애니메이션이 왔다갔다 하는거 활성화 /비활성화
public void SetLoadingIcon(bool active) { //로딩 애니메이션
_loadingAnimationIcon.SetActive(active);
}
//2023년11월17일 11:31분 openui부터 시작하면됨
//2023년11월22일 21:18 분 다음장