Scene

·2023년 4월 22일
0

Unity

목록 보기
19/22

📌Scene만들기


현재 Player가 없으면 매니저가 생성되지 않는다
Player에 매니저 생성 하는게 맞나? -> 아니다
그래서 Scene에서 나머지 코드들을 실행시킨다

enum으로 Scene Type을 관리한다

 public enum Scene
    {
        Unknown,
        Login,
        Lobby,
        Game,
    }

BaseScene

enum으로 만든 SceneType을 여기서 관리하고 UI는 EventSystem이 있어야 관리가 되므로
혹시나 없으면 프리팹으로 넣어놓은 EventSystem을 넣어준다

Awake

컴포넌트가 비활성화된 상태 + 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();
}

GameScene

빈게임 오브젝트에 이렇게 넣어서 사용한다(지금 여기서 처음으로 나머지 애들을 불러옴)

제일 기본인 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()
    {
        
    }
}

LoginScene

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가 넘어오면 다음씬으로 넘어가게된다.

빌드세팅

씬을 넘어가기 위해서는 빌드 세팅을 해줘야 오류없이 씬끼리 넘어가게된다

SceneManagerEx

씬 매니저 만들어서 기존에 있던 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

profile
개인공부저장용(하루의 기록)

0개의 댓글