<다른 UI로 넘어가기>
- Login Scene
이전에 새롭게 만들었던 Login Scene을 위한 scripts 파일을 만든다.
1. Scripts -> Scenes 폴더 아래에 LoginScene.cs 파일을 만든다.
2. 그리고 위에서 진행했던 것과 같이 Empty Object를 생성하여 이름을 @Scene으로 한 후 LoginScene.cs를 component로 하여 추가한다.
3. LoginScene.cs 에서 다음과 같이 BaseScene을 상속 받도록한 후 추상화 함수( Init함수와 Clear 함수 )를 구현한다.
현재 Scene이 Login이기 때문에 Scene Type을 Login으로 한다.
* LoginScene.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LoginScene : BaseScene
{
protected override void Init()
{
base.Init();
SceneType = Define.Scene.Login;
}
public override void Clear()
{
throw new System.NotImplementedException();
}
}
- 특정 Key를 누르면 다음 Scene으로 넘어가도록
1. 다음과 같이 LoginScene.cs에서 SceneManager(Unity에서 기본으로 제공하는)을 통해 Game Scene으로 넘어가도록 코딩을 한다.
Q버튼을 눌를 때 다음 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()
{
// Q를 눌렀을 때 다음 Scene으로 넘어가도록
if (Input.GetKeyDown(KeyCode.Q))
{
// Unity에서 제공하는 SceneManager를 이용
SceneManager.LoadScene("Game");
}
}
public override void Clear()
{
throw new System.NotImplementedException();
}
}
2. 이후에 실행을 하면 다음과 같은 Error를 만난다.
해당 error는 Build Setting을 하지 않아서 생긴 문제이다
=> File에서 Build Setting을 클릭하여 다음과 같이 setting한다.
현재 PC를 사용하기 때문에 해당 PC를 선택하고 Scene in Build에서 Scenes 폴더에 저장되어 있던 Game을 drag drop 시킨다.
3. 이렇게 setting 한 후에 실행하면 Q 버튼을 누를 시 우리가 저장한 Game Scene으로 넘어간다.
4. SceneManager에는 다양한 기능이 존재한다.
<Scene Manager Ex>
- 기본
위에서 SceneManager의 기능을 활용하여 다음 Game Scene으로 넘어간 것처럼 Scene Manager를 관리해주기 위한 Manager가 필요하다.
=> Scene Manager Ex
1. Scripts -> Managers 폴더 아래에 SceneManagerEx.cs를 생성한다.
다음과 같이 MonoBehaviour를 없앤 후 Manager.cs에 SceneManagerEx를 추가한다.
* SceneManagerEx.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SceneManagerEx
{
}
* Managers.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Managers : MonoBehaviour
{
static Managers s_instance; // static의 특성을 이용햐여 유일성 보장
static Managers Instance { get { Init(); return s_instance; } } // 외부에서 사용할때는 해당 함수를 이용하여 가져옴
InputManager _input = new InputManager();
ResourceManager _resource = new ResourceManager();
SceneManagerEx _scene = new SceneManagerEx(); // Scene Manager 연결
UIManager _ui = new UIManager(); // UIManger 연결
public static InputManager Input { get { return Instance._input; } }
public static ResourceManager Resource { get { return Instance._resource; } }
public static SceneManagerEx Scene { get { return Instance._scene; } } // Scene instance
public static UIManager UI { get { return Instance._ui; } } // UI instance
2. 후에 SceneManagerEx.cs가 관리할 기능을 차례로 정리한다. 우선 Scene을 Load하는 것을 하기 위해 다음과 깉이 LoadScene 함수를 구현한다.
Define에서 정의한 Scene을 변수로 받는 함수 Load는 Unity에서 제공하는 SceneManager를 이용하여 Scene을 Load하는데 해당 Define.Scene type을 string을 바꿔줘야한다.
* SceneManagerEx.cs
using System.Collections;
using System.Collections.Generic;
using UnityEditor.SearchService;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneManagerEx
{
// Scene Load하기
public void LoadScene(Define.Scene type)
{
SceneManager.LoadScene();
}
3. Enum의 type을 string으로 바꾸기 위해 다음과 같이 함수를 작성한다.
c#에서는 편리하게 Enum값을 가져올 수 있다.
* SceneManagerEx.cs
string GetSceneName(Define.Scene type)
{
string name = System.Enum.GetName(typeof(Define.Scene), type);
return name;
}
* SceneManagerEx.cs : 전체 코드
using System.Collections;
using System.Collections.Generic;
using UnityEditor.SearchService;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneManagerEx
{
// Scene Load하기
public void LoadScene(Define.Scene type)
{
SceneManager.LoadScene(GetSceneName(type));
}
// Define에서 정의한 type의 이름들을 추출할 수 있다.
string GetSceneName(Define.Scene type)
{
string name = System.Enum.GetName(typeof(Define.Scene), type);
return name;
}
}
- 추가
1. 다음 Scene으로 넘어가기전에 LoginScene에서 Clear 함수로 해당 UI에서 없어져야할 것을 먼저 clear한 후에 넘어가도록 해야한다.
2. 프로퍼티로 현재 BaseScene을 가져오도록 한 후 Clear를 한다.
* SceneManagerEx.cs
using System.Collections;
using System.Collections.Generic;
using UnityEditor.SearchService;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneManagerEx
{
// 현재 Scene을 찾아서 반환
public BaseScene CurrentScene{ get { return GameObject.FindObjectOfType<BaseScene>(); } }
// Scene Load하기
public void LoadScene(Define.Scene type)
{
CurrentScene.Clear();
SceneManager.LoadScene(GetSceneName(type));
}
// Define에서 정의한 type의 이름들을 추출할 수 있다.
string GetSceneName(Define.Scene type)
{
string name = System.Enum.GetName(typeof(Define.Scene), type);
return name;
}
}
3. LoginScene.cs에서 내가 위에서 정의한 함수를 사용하여 다음과 같이 코드를 짠다.
* 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()
{
// Q를 눌렀을 때 다음 Scene으로 넘어가도록
if (Input.GetKeyDown(KeyCode.Q))
{
// Unity에서 제공하는 SceneManager를 이용
Managers.Scene.LoadScene(Define.Scene.Game);
}
}
public override void Clear()
{
Debug.Log("Login Scene Clear");
}
}
4. 실행하면 다음과 같이 console창에 Clear 함수에서 정의한 Debug Log가 뜨고 Game UI로 넘어가는 것을 확인할 수 있다.
'Development > 유니티' 카테고리의 다른 글
[섹션 11] Coroutine(코루틴) (0) | 2021.08.20 |
---|---|
[섹션8] Scene Manager (0) | 2021.08.06 |
[섹션7] 인벤토리 실습 & 코드 정리 (0) | 2021.08.01 |
[섹션 7] UI Manager (0) | 2021.07.30 |
[섹션7] UI - UI 자동화 (0) | 2021.07.29 |