
현재 게임UI는 씬에 UI를 직접 배치하기 보다, Prefab으로 만들어진 UI를 필요할 때 동적생성을 하는 식으로 구현되어 있다.
public void OpenShopUI(ShopKeeper shopKeeper)
{
Managers.UI.OnEnableUI<MarketPopup>();
_shopSystem = MarketPopup.ShopSystem;
_shopSystem.CreateItemStocks(shopKeeper);
}
예를들어, ShopKeeper이라는 클래스에 있는 위 메서드는 호출하면 MarketPopup UI를 활성화한다.
OnEnableUI의 메서드는 다음과 같다.
public void OnEnableUI<T>() where T : PopupUI
{
PopupUI popupUI = _popupsList.Find(popup => popup.GetType() == typeof(T));
if (popupUI != null)
{
popupUI.gameObject.SetActive(true);
}
else
{
CreatePopup<T>();
}
}
OnEnableUI에서는 우선 Find메서드를 통해 씬 내의 T를 가진 오브젝트가 있는지를 찾는다.
이 동작에서도 popupUI를 찾지 못해, null이라면 CreatePopup을 하고, 존재한다면 해당 PopupUI를 활성화 한다.
CreatePopup 메서드는 다음과 같다.
private void CreatePopup<T>() where T : PopupUI
{
GameObject prefab = Resources.Load<GameObject>($"Prefabs/UI/Popup/{typeof(T).Name}");
if (prefab == null)
{
Debug.LogWarning($"{name} 이라는 팝업이 없음.");
return;
}
GameObject clone = Instantiate(prefab);
if (SceneManager.GetActiveScene().buildIndex != 0)
{
Scene targetScene = SceneManager.GetSceneByBuildIndex(1);
SceneManager.MoveGameObjectToScene(clone, targetScene);
// 생성된 UI를 InGame씬에 머무를 수 있도록 함
}
if (!clone.TryGetComponent(out T popupUI))
{
Debug.LogError($"게임 오브젝트가 popupUI를 상속 받아야 합니다 : {prefab}");
return;
}
_popupsList.Add(popupUI);
popupUI.Init();
}
CreatePopup메서드는 Resources 폴더에서 PopupUI를 상속받은 T의 이름을 가진 미리 준비된 팝업UI 오브젝트를 CreatePopup을 통해 생성할 수 있게 한다.


또한 해당 Popup들을 메인 씬인 InGame 씬에 존재하도록 하기 위해, 만약 다른 씬에서 활성화가 되어 있을 경우, InGameScene으로 이동하는 로직 또한 포함되어 있다.
이렇게 생성된 Popup은 _popupsList에 추가되어, 관리된다.
팝업의 생성은 제네릭을 이용하여, 추가적인 Popup이 필요할 경우, 해당하는 클래스와 프리팹을 만들고, 메서드를 호출하면 쉽게 생성할 수 있도록 이루어져있다.
public void ClosePopup(GameObject p_obj)
{
p_obj.gameObject.SetActive(false);
}
public void CloseAllPopup()
{
foreach (PopupUI item in _popupsList)
{
if (item.gameObject.activeSelf)
{
item.gameObject.SetActive(false);
}
}
}
Popup창을 닫을 일이 필요할 때는 위 처럼 비활성화만 해준다.
만약 비활성화가 아니라 파괴를 했다면,
팝업창을 닫고 다시 생성할 때, Resources 폴더에서 팝업창을 생성하는 것을 다시 진행해야하지만, 비활성화만 하면, OnEnableUI에서 활성화만 함으로서 Resources Load를 다시 이용하지 않아도 되기 때문이다.
'내일배움캠프 TIL' 카테고리의 다른 글
| 내일배움캠프 72일차 TIL "Transparency Sort Mode" (0) | 2024.12.30 |
|---|---|
| 내일배움캠프 71일차 TIL "시세 변동 시스템" (0) | 2024.12.27 |
| 내일배움캠프 69일차 TIL "Mask, Rect Mask 2D" (0) | 2024.12.24 |
| 내일배움캠프 68일차 TIL "IPointerEnterHandler" (0) | 2024.12.23 |
| 내일배움캠프 67일차 TIL "중간발표 기능 정리" (0) | 2024.12.20 |