[Basic] 씬 불러오기



유니티에서 씬을 불러오는 방법을 알아보자 보통 씬을 불러오는 목적은 게임에 여러가지 맵이 있는데 맵을 이동할 때 쓰인다.

하지만 씬을 불러오기 위해 반드시 코드에 써줘야 하는게 있다.

image

위와 같이 using UnityEngine.SceneManagement;를 반드시 써야한다.

using UnityEngine.SceneManagement;가 위미하는 것은 UnityEngine에 있는 SceneManagement 네임스페이스를 사용한다는 의미이다.

그리고 씬을 불러오기 위해서 준비해야하는 것이 하나가 더 있다.

바로 [Ctrl] + [Shift] +[B]를 누르면 빌드셋팅창이 아래와 같이 하나 나타난다.

image-20220310085237499

이제 Add Open Scenes에 프로젝트에 있는 씬들을 다 드래그하면 추가가 된다.

image-20220310085419196

위 사진에서 파란색 동그라미 부분을 잘 기억해두자 나중에 쓸 일이 있다.

이제 씬을 불러올 수 있는 준비가 된 것이다.

씬을 불러오는 방법

씬을 불러오는 방법에는 여러 방법과 종류가 있다.

우선 첫번째 방법!

1) 씬의 이름으로 불러오기

코드를 먼저 살펴보자!

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            SceneManager.LoadScene("Scene2");
        }        
    }

우리가 using UnityEngine.SceneManagement;을 선언했기 때문에 코드에서 SceneManager클래스가 사용이 가능한 것이다. 그리고 위의 코드에서 보는것과 같이 내가 불러오고 싶은 씬의 이름을 LoadScene함수에 넣어주면 된다. 하지만 씬의 이름으로 불러오는 방법과 다르게 씬의 부여된 번호로 씬을 불러오는 것이 가능하다.

2)씬의 부여된 번호로 불러오기

씬을 불러오기 위해 사전에 준비했던 과정중에 빌드셋팅창에서 씬들을 빌드안에 추가 했던것을 떠올려보면 각 씬에 해당하는 번호가 오른쪽 끝에 나오는걸 확인이 가능하다 위의 사진으로 예시를 들면 Scene1은 0번, Scene2는 1번과 같이 말이다 이제 이 번호를 가지고 씬을 불러 올 것이다.

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            SceneManager.LoadScene(1);
        }        
    }

코드가 쉬우니 설명은 넘기겠다.

현재 씬에서 다른 씬을 덮으며 불러오기

사실 LoadScene함수에 두번째 인자로는 LoadSceneMode열거형을 인자로 받을 수 있게 오버로딩 되어있다.

LoadSceneMode에는 2가지 Mode가 존재하는데 첫번째로 Additive이다.

SceneManager.LoadScene(1,LoadSceneMode.Additive);

위 코드와 같이 코드가 존재한다면 현재 씬에 1번 씬을 추가해서 불러와라 라고 해석이 된다.

하지만 저렇게 씬을 불러오면 현재 씬에 1번씬에 존재하던 메인 카메라나 빛 등이 겹치게 되면서 원하던 모습을 연출하지 못할 수 있다. 그래서 새로운 씬을 현재 씬에 덮어서 불러 올 땐 필요없는 것들은 지우는게 좋다.

그리고 다른 Mode는 Single인데 Single은 처음 방법대로 새로운 씬을 홀로 가져오는 것이다.

동기 방식, 비동기 방식

지금까지 사용한 LoadScene함수는 동기 방식으로 작동을 한다. 이게 무슨 뜻이냐면 씬을 불러오는 과정이 끝날 때 까지 다른 동작을 할 수 없다는 뜻이다. 불러오는 씬에 오브젝트들이 별로 없다면 문제가 되지 않지만 규모가 큰 게임은 씬을 불러오는데 조금이라도 시간이 걸린다. 그 시간에 게임들은 게임TIP이나 미니게임 등을 넣어서 플레이어가 심심하지 않게 해준다. 위와같이 씬을 불러오는 와중에 다른 동작을 하기 위해서는 비동기 방식의 씬 불러오기를 사용해야 한다. 비동기 방식의 씬 불러오기는 SceneManager.LoadSceneAsync함수를 사용한다. 하지만 이 함수를 제대로 쓰려면 코루틴함수와 같이 써야한다. 방벙은 아래 코드와 같다.

  void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(LoadScene());
        }        
    }
    IEnumerator LoadScene()
    {
        yield return SceneManager.LoadSceneAsync(1, LoadSceneMode.Single); ;
    }





© 2022. by KSC

Powered by sora