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 을 띄우도록 추가한다.
'⇥ 2D Game > Unity' 카테고리의 다른 글
Unity 게임 만들기 프로젝트 - Coroutine (0) | 2024.06.10 |
---|---|
Unity 게임 만들기 프로젝트 - SoundManager (0) | 2024.06.10 |
Unity 게임 만들기 프로젝트 - UI Manager, 자동화 (2) | 2024.06.10 |
Unity 게임 만들기 프로젝트 - Camera, Click 이동 구현 (1) | 2024.06.08 |
Unity 게임 만들기 프로젝트 - RayCasting (1) | 2024.06.07 |
댓글
이 글 공유하기
다른 글
-
Unity 게임 만들기 프로젝트 - Coroutine
Unity 게임 만들기 프로젝트 - Coroutine
2024.06.10 -
Unity 게임 만들기 프로젝트 - SoundManager
Unity 게임 만들기 프로젝트 - SoundManager
2024.06.10 -
Unity 게임 만들기 프로젝트 - UI Manager, 자동화
Unity 게임 만들기 프로젝트 - UI Manager, 자동화
2024.06.10 -
Unity 게임 만들기 프로젝트 - Camera, Click 이동 구현
Unity 게임 만들기 프로젝트 - Camera, Click 이동 구현
2024.06.08