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을 호출하는 기능을 구현하였다.
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()이 그 역할을 대신할 수 있다.
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으로 넘어간다.
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함수 또한 제대로 작동함을 확인하였다.