현재 Player가 없으면 매니저가 생성되지 않는다
Player에 매니저 생성 하는게 맞나? -> 아니다
그래서 Scene에서 나머지 코드들을 실행시킨다
enum으로 Scene Type을 관리한다
public enum Scene
{
Unknown,
Login,
Lobby,
Game,
}
enum으로 만든 SceneType을 여기서 관리하고 UI는 EventSystem이 있어야 관리가 되므로
혹시나 없으면 프리팹으로 넣어놓은 EventSystem을 넣어준다
컴포넌트가 비활성화된 상태 + active한 상태에서도 Awake가 실행된다
public abstract class BaseScene : MonoBehaviour
{
public Define.Scene SceneType { get; protected set; } = Define.Scene.Unknown;
void Awake()
{
Init();
}
protected virtual void Init()
{
//EventSystem 찾아서 없으면 프리펩에 저장된거 가져오기
Object obj = GameObject.FindObjectOfType(typeof(EventSystem));
if (obj == null)
Managers.Resource.Instantiate("UI/EventSystem").name = "@EventSystem";
}
public abstract void Clear();
}
빈게임 오브젝트에 이렇게 넣어서 사용한다(지금 여기서 처음으로 나머지 애들을 불러옴)
제일 기본인 BaseScene을 상속받고 씬타입을 게임을 바꾸고 UI_Inven을 출력한다
public class GameScene : BaseScene
{
protected override void Init()
{
base.Init();
SceneType = Define.Scene.Game;
Managers.UI.ShowSceneUI<UI_Inven>();
}
public override void Clear()
{
}
}
public class LoginScene : BaseScene
{
protected override void Init()
{
base.Init();
SceneType = Define.Scene.Login;
}
private void Update()
{
//특정키 입력하면 Scene넘어가게하기
if (Input.GetKeyDown(KeyCode.Q))
{
//기본적으로 제공하는 SceneManager로 씬을 변경
SceneManager.LoadScene("Game");
}
}
public override void Clear()
{
}
}
이걸 응용하면 로그인 UI에서 아이디 입력을 넣고 서버에 보낸다음에 서버에서 확인하고 OK가 넘어오면 다음씬으로 넘어가게된다.
씬을 넘어가기 위해서는 빌드 세팅을 해줘야 오류없이 씬끼리 넘어가게된다
씬 매니저 만들어서 기존에 있던 SceneManager를 래핑해준다
//이미 SceneManager가 있어서 뒤에 Ex붙여줌
public class SceneManagerEx
{
//BaseScene컴포넌트가 있는 오브젝트를 찾아주세요
public BaseScene CurrentScene { get { return GameObject.FindObjectOfType<BaseScene>(); } }
//Define.Scene type만 넣어줌
public void LoadScene(Define.Scene type)
{
//현재 사용하던 씬 클리어 후
CurrentScene.Clear();
//다음씬 이동
SceneManager.LoadScene(GetSceneName(type));
}
//Scene타입 넣으면 String으로 바꾸기
string GetSceneName(Define.Scene type)
{
string name = System.Enum.GetName(typeof(Define.Scene), type);
return name;
}
}
public class LoginScene : BaseScene
{
protected override void Init()
{
base.Init();
SceneType = Define.Scene.Login;
}
private void Update()
{
//특정키 입력하면 Scene넘어가게하기
if (Input.GetKeyDown(KeyCode.Q))
{
//Async를 사용하면 백그라운드에 미리 받아옴
//기본적으로 제공하는 SceneManager로 씬을 변경
Managers.Scene.LoadScene(Define.Scene.Game);
}
}
public override void Clear()
{
Debug.Log("LoginScene Clear");
}
}
특정키를 누르면 LoginScene에서 GameScene으로 넘어가면서 Clear가 실행되면서 로그가 남는다
Part3: 유니티 엔진
섹션 8.Scene(씬)
Awake
https://docs.unity3d.com/ScriptReference/MonoBehaviour.Awake.html
https://blog.naver.com/cdw0424/221633388216