Unity3D_MMO - SceneManager

k_hyun·2022년 10월 13일
0

Unity_MMO_Project

목록 보기
14/33

SceneManagerEx.cs

public class SceneManagerEx 
{
    // BaseScene 컴포넌트를 가진 오브젝트를 찾아서 BaseScene 반환
    public BaseScene CurrentScene { get { return GameObject.FindObjectOfType<BaseScene>(); } }
    

    public void LoadScene(Define.Scene type)
    {
        CurrentScene.Clear();
        SceneManager.LoadScene(GetSceneName(type));
    }

    // enum Scene에서 씬 이름을 가져온다.
    string GetSceneName(Define.Scene type)
    {
        // 이넘 타입에서 안의 값을 string으로 받아온다.
        string name = System.Enum.GetName(typeof(Define.Scene), type);
        return name;
    }
   
}

기존에 SceneManager가 존재하므로 SceneManagerEx를 작성하였다.

Define에서 선언한 enum Scene에서 Scene의 이름을 추출해서 Scene을 호출하는 기능을 구현하였다.

BaseScene.cs

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

    void Awake()
    {
        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();
    
}

Clear함수는 BaseScene을 상속하는 클래스에서 구현할 함수이다.

화면 전환이 일어날 때 기존에 있던 정보들을 지우기 위한 용도이다.

Awake()의 경우 스크립트가 비활성화 있는 경우에도 작동되는 효과가 있다.

또한 BaseScene을 상속한 클래스에서 Start에 Init()을 쓰지 않아도 BaseScene의 Init()이 그 역할을 대신할 수 있다.

LoginScene.cs

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("Login Scene Clear !");
    }
}

Q를 누르면 LoginScene에서 GameScene으로 넘어간다.

GameScene.cs


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

        SceneType = Define.Scene.Game;

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

    public override void Clear()
    {
		// 미구현
    }

}

GameScene이다.

실행 화면


일단 모든 Scene마다 @Scene을 만들고, 거기에 해당 스크립트들을 달아놓는다.

Q를 누르면 다음과 같이 씬이 이동되고, Clear함수 또한 제대로 작동함을 확인하였다.

0개의 댓글