특정 화면을 하나의 Scene으로 나타낼 수 있는데 Scene은 로그인화면과 같이 UI로만 구성될 수도 있고 실제 Game환경의 화면을 나타낼 수 있다.
Scene은 어떤 화면을 구성하기 위한 공간으로 쓰일 수 있지만 Scene에서 사용할 GameObject의 설정을 하는 역할이나 다른 곳에서 정보를 받아오는 역할도 수행 가능하다.
초기화하는 역할을 UI나 다른 GameObject가 수행할 수는 없다. 모든 Scene에 UI나 GameObject가 있을 것이라는 확신이 없다.
Scene에 Component Script를 붙이는 것은 불가능하기 때문에 보이지않는 Empty Object
에 Initiate를 위한 Component Script를 붙여 Scene 실행 시 설정 및 할당을 진행하도록 한다.
UI Management에서 다룬 코드를 Empty GameObject
에 Component로 넣어주면 된다.
SceneType = Define.Scene.Game;
Managers.UI.ShowSceneUI<UI_Inven>();
EventSystem은 UI와 상호작용되는데 사용되는 시스템이다. Scene에 EventSystem Object가 없다면 사용자가 UI를 눌러도 아무런 동작을 하지 않을 것이다.
아래 코드는 EventSystem을 하나의 Prefab으로 지정해둔 상황에서의 코드이다. Empty Object
에 EventSystem과 관련된 Component를 추가하는 것도 하나의 방법이다.
Object obj = GameObject.FindObjectOfType(typeof(EventSystem));
if (obj == null)
Managers.Resource.Instantiate("UI/EventSystem").name = "@EventSystem";
Unity에는 SceneManager를 제공한다. SceneManager에는 여러 함수와 변수를 제공하며 Scene을 불러오는 데는 LoadScene()
과 LoadSceneAsync()
를 사용한다.
LoadSceneAsync()
는 Scene을 비동기로 불러오는 함수로 Scene을 불러오는데 시간이 오래 걸릴 때 다른 서비스를 제공하고자 할 때 사용한다.
Scene 사이를 넘어가려면 Build 세팅을 해야한다. File
- Build Settings
에서 Build 세팅을 진행할 수 있다.
LoadScene()
에는 Scene의 이름을 String으로 넘기거나 위의 Scene Build 과정에 부여되는 번호를 int로 넘길 수 있다. LoadMode에 관련한 설정값도 동시에 넘길 수 있다.
string이나 int말고 다른 매개변수를 지정하고 싶다면 어댑터패턴을 사용해보자
Scene의 이름을 넘기는 대신 enum으로 정의한 Scene 종류를 넘기는 방식을 구현하기 위해 System.Enum.GetName()
사용하였는데 C#에는 enum으로 정의된 값의 이름을 가져오는 함수가 구현되어 있다.
SceneManager.LoadScene(System.Enum.GetName(typeof(Define.Scene), type));