새소식

⇥ 2D Game/Unity

Unity 게임 만들기 프로젝트 - SceneManager

  • -
반응형

1. Scene Manager

게임에서는 일반적인 게임화면, 로그인 화면, 서버선택 화면 등 다양한 화면들이 존재한다. Unity 에서는 각 단계를 Scene 이라고 나눌 수 있다.
이러한 Scene 을 관리해주는 SceneManager 를 기본적으로 제공해주지만, 개인적인 취향에 맞게 커스텀하기 위해서 별도의 SceneManager 를 래핑해서 생성해주는 작업을 진행한다.

public enum Scene
    {
        Unknown,
        Login,
        Lobby,
        Game,
    }

Define.cs 에 각 Scene 의 이름을 가진 enum 타입을 하나 만들어준다. 이러면 우리가 관리할 Scene 의 종류와 이름을 명확히 구분할 수 있다.

# SceneManagerEx.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneManagerEx
{
    public BaseScene CurrentScene { get { return GameObject.FindObjectOfType<BaseScene>(); } }
    
    public void LoadScene(Define.Scene type)
    {
        CurrentScene.Clear();
        SceneManager.LoadScene(GetSceneName(type));
    }

    string GetSceneName(Define.Scene type)
    {
        string name = System.Enum.GetName(typeof(Define.Scene), type);
        return name;
    }
}

기본적으로 SceneManager 라는 이름을 유니티에서 사용중이기 때문에 Extend 의 의미인 Ex 를 붙여서 클래스를 생성해준다.
기존 Manager.cs 에 동일하게 통합관리할 수 있도록 붙여넣어주고 내부 코드를 구성한다.

- public BaseScene CurrentScene : BaseScene type 을 가진 오브젝트를 찾아서 반환해주는 함수 현재 Scene 값을 return

- public void LoadScene(Define.Scene type) : Scene 을 로드할 때 Clear 를 먼저 수행해준 뒤 원하는 Scene 을 로드
실제 로드는 Unity 에서 제공하는 SceneManager 기능이지만 래핑되어 clear 를 한번 수행하거나 기타 동작을 추가할 수 있다.

- string GetSceneName(Define.Scene type) : Unity 에서 제공하는 LoadScene 에는 String 이 들어가야 하는데, enum Type 으로 관리중이었으니, String 으로 변환해주는 함수이다.

 

# BaseScene.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public abstract class BaseScene : MonoBehaviour
{
    public Define.Scene SceneType { get; protected set; } = Define.Scene.Unknown;

    void Start()
    {
        Init();
    }

    protected virtual void Init()
    {
        Object obj = GameObject.FindObjectOfType(typeof(EventSystem));

        if (obj == null)
            Managers.Resource.Instantiate("UI/EventSystem").name = "@EventSystem";
    }

    public abstract void Clear();
}

모든 Scene 에서 사용하게될 BaseScene class, 다른 Scene 은 해당 스크립트를 상속받아 사용하게 된다.
기본적으로 SceneType 에 어떤 Scene 인지 저장하게 되고, Init 함수에는 Scene 에서 없어서는 안될 EventSystem 을 생성하여 붙여준다. 이렇게 하면 모든 Scene 이 생성될 때 명시하지 않아도 앞으로 EventSystem 오브젝트가 Scene 에 추가될 것이다.

 

# LoginScene.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class LoginScene : BaseScene
{
    protected override void Init()
    {
        base.Init();

        SceneType = Define.Scene.Login;
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Q))
        {
            Managers.Scene.LoadScene(Define.Scene.Game);
        }
    }

    public override void Clear()
    {
        Debug.Log("LoginScene Clear!");
    }
}

LoginScene 은 LoginScene 에 붙게 될 스크립트이다. BaseScene 을 상속 받으며, Init 에서 SceneType 을 Login 으로 지정
Update 문에서는 Q를 누를 시 이벤트를 받아서, GameScene 으로 이동하게 해주는 코드를 작성한다.
Clear 는 당장 수행할 동작이 없어서 Log 로 Clear 해주었다는 로그를 표시해준다.

 

# GameScene.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameScene : BaseScene
{
    protected override void Init()
    {
        base.Init();

        SceneType = Define.Scene.Game;

        Managers.UI.ShowSceneUI<UI_Inven>();
    }

    public override void Clear()
    {
        
    }
}

GameScene 에 붙을 스크립트이다. Init 시에 SceneType 을 Game 으로 지정해주고, UI_Inven 을 띄우도록 추가한다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.