포스트

섹션8. Scene

위 글은 인프런에 있는 Rookiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진 강의를 듣고 남긴 필기입니다.

SceneManagerEx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class SceneManagerEx
{
    public BaseScene CurrentScene => GameObject.FindObjectOfType<BaseScene>();

    // UnityEngine에 구현되어있는 SceneManager를 이용해 만든 Scene전환 기능 함수.
    public void LoadScene(Define.Scene type)
    {
        CurrentScene.Clear();
        SceneManager.LoadScene(GetSceneName(type));
    }

    // 현재 Scene의 이름을 받아오는 함수. LoadScene(Define.Scene type)에서 활용됨.
    string GetSceneName(Define.Scene type)
    {
        // enum을 string으로 바꾼다. C#의 Reflection기능
        string name = System.Enum.GetName(typeof(Define.Scene), type);

        return name;
    }
}
  • Utils > Deifne.cs 에서 Scene들을 enum으로 정의
1
2
3
4
5
6
7
8
9
10
11
12
public class Define
{
    // 이는 실제 Scene와 Utils > Deifne.cs 에서 Scene들을 enum으로 정의이름이 동일해야 함.
    public enum Scene
    {
        Unknown,
        Login,
        Lobby,
        Game,
    }
    //...
}
  • 모든 Scene에 빈 게임 오브젝트를 만들고,
    • 이름을 @Scene으로 정하고, BaseScene을 상속하는 스크립트를 만들어 붙인다.
      • 이 오브젝트는 현재 Scene에 대한 정보를 갱신하고, Scene 내부에서 최초로 UI를 불러들이는 역할을 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public abstract class BaseScene : MonoBehaviour
{
    // 현재 Scene에 대한 정보
    public Define.Scene SceneType
    {
        get;            // get은 public
        protected set;  // set은 protected
    } = Define.Scene.Unknown;
    
    void Awake()
    {
        Init();
    }

		// UI와 상호작용을 위한 EventSystem Instantiate
    protected virtual void Init()
    {
        var obj = GameObject.FindObjectOfType(typeof(EventSystem));
        if (obj == null)
            Managers.Resource.Instantiate("UI/EventSystem").name = "@EventSystem";
    }

    public abstract void Clear();
}
  • BaseScene을 상속하는 클래스는 Init() 내부에서
    1. base.Init(); 을 호출해야 함.
    2. BaseScene.SceneType 변수를 현재 Scene에 맞게 정의하여 (혹은 정의한 것을 이용해), 값을 갱신한다.
    3. 미리 정의한 UIManager를 이용해 필요한 UI를 화면에 띄운다. Managers.UI.ShowSceneUI<~>(); 와 같이.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.