[Unity] UI Management

이정석·2023년 6월 30일
0

Unity

목록 보기
8/22

UI Management

여러개의 UI를 다룰 때 어떤 UI를 제일 먼저 표시할지 관리를 해주어야 한다. 사용자가 누른 UI를 제일 위로 올리는것과 특정 키를 누르면 닫히는 것과 같은 관리를 해주어야 한다.

UI의 우선순위를 다루는 것은 Sort order이다.

UI의 종류

UI는 크게 두 가지로 나눌 수 있다.

  • 게임화면(Scene) UI
  • 팝업(Popup) UI: 장비창이나 인벤토리와 같은 키고 끌 수 있는 UI

UI의 종류마다 관리할 방법과 구현해야 할 요소들이 다르기 때문에 코드를 나누어 작성해야 한다. 예를 들면 아래와 같은 구조로 UI를 배치할 수 있다.

* UI_Base
	ㄴ UI_Popup
    	ㄴ UI_Inventory
		ㄴ UI_Option
    ㄴ UI_Scene
    	ㄴ UI_Map

Manager

Popup UI는 입력에 따라 UI를 키고 끌 수 있어야 한다.

  • Manager는 켜저있는 popup UI에 대해서 알고 있어야 한다.
  • Manager는 UI GameObject를 생성하고 삭제할 수 있어야 한다.
  • Popup UI경우 Sort Order를 지정해주어야 한다.

1. UI 저장 방법

popup UI 같은 경우 이후에 가장 최근에 킨 UI부터 끄기를 원하기 때문에 stack을 사용한다. 물론 다른 자료구조를 사용해도 되지만 stack을 사용한다면 이후에 기능을 구현할 때 더 쉽게 구현이 가능할 것이다.

	Stack<UI_Popup> _popupStack = new Stack<UI_Popup>();

GameObject를 저장하는 것이 아닌 UI_Popup을 상속받은 모든 UI클래스를 저장한다.

2. UI 생성

UI를 생성하는 단계는 다음과 같이 구성된다.

  • UI에 해당하는 Prefab을 생성한다.
  • UI Component를 stack에 저장한다.
  • 생성한 GameObject의 Parent를 설정한다.

생성한 GameObject의 Parent를 설정하는 이유는 여러개의 UI를 생성할 때 여러 UI를 하나의 GameObject의 산하로 두어 관리하기 쉽게하기 위함이다.

    public T ShowPopupUI<T>(string name = null) where T : UI_Popup
    {
        if (string.IsNullOrEmpty(name))
            name = typeof(T).Name;

        GameObject go = Managers.Resource.Instantiate($"UI/Popup/{name}");
        T popup = Util.GetOrAddComponent<T>(go);
        _popupStack.Push(popup);

        go.transform.SetParent(Root.transform);

        return popup;
    }

3. UI 삭제

UI를 끄는 것은 stack의 top에 있는 UI를 순차적으로 지우면 된다.

    public void ClosePopupUI()
    {
        if (_popupStack.Count == 0)
            return;

        UI_Popup popup = _popupStack.Pop();
        Managers.Resource.Destroy(popup.gameObject);
        popup = null;
        _order--;
    }

4. Canvas - Sort Order 설정

SortOrder의 설정은 Canvas Component에 있다. 어떤 GameObject에 대해 popup UI인지 scene UI인지 구분을 한 뒤 Sort Order를 설정해주어야 한다.

    public void SetCanvas(GameObject go, bool sort = true)
    {
        Canvas canvas = Util.GetOrAddComponent<Canvas>(go);
        canvas.renderMode = RenderMode.ScreenSpaceOverlay;
        canvas.overrideSorting = true;

        if (sort)
        {
            canvas.sortingOrder = (_order);
            _order++;
        }
        else
        {
            canvas.sortingOrder = 0;
        }
    }

5. Blocker

2개 이상의 UI가 켜져있을 때 최상위의 UI를 제외하고 다른 UI를 조작할 수 없도록 하고 싶을 때 Blocker를 설정할 수 있다.

  • UI GameObject 산하에 보이지않는 Image나 Panel를 전체 화면에 입힌다.
  • 보이지 않는 Object의 Raycast Target 옵션을 킨다.
  • 보이지 않는 Object의 Component 위치를 최상단으로 한다.

위와 같이 설정하면 다른 UI의 조작을 할수 없게 만드는 Blocker를 만들 수 있다.

Component의 위치를 최상단으로 하지 않으면 동작시키고자 하는 UI의 입력을 막아버린다.

profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글