본문 바로가기
Unity 유니티 기초강의

유니티 unity 씬 로브 및 전환

by 만사오케이프로 2022. 5. 17.
반응형

1. 씬 (Scene)

게임 설계를 어떻게 하느냐에 따라 하나의 씬으로 게임을 만들수도 있고 여러개의 씬으로 만들수도 있습니다.

미니게임같은경우 하니의 씬으로 로고, 타이틀, 로비, 게임 등을 한씬에 담아서 만들기도하며 규모가 있는게임경우

여러씬을 나눠 개발됩니다.

하나의씬으로 할까 여러개의 씬으로 할까의 기준이 애매하긴 합니다. 간단한 기준을 정하면 게임 및 로비에 리소스가

많이 들어갈 경우(모델링 및 텍스쳐) 게임이 느려지거나 게임이 꺼질수 있습니다. 

 

2. 씬 전환 (Scene transition) 

유니티에는 SceneManager 클래스가 있습니다. SceneManager를 사용해 씬 전환을 제어할수 있습니다. 씬 전환에는 방동기화 방식과 비동기화 방식이 있습니다.

 

동기화 방식

씬 로드시 현재 작업중인 내용을 멈추고 다음씬을 로드합니다.

 

비동기화 방식

씬로드시 현재 작업중이 내용을 진행하면서 다음 씬을 로드합니다.

 

3. 씬 로드 동기화 방식 LoadScene

씬 로드시 Single과 Addictive 모드가 있습니다.

 

LoadSceneMode.Single

현재 씬을 종료하고, 다음 씬을 로드합니다.

 

LoadSceneMode.Addictive

현재 씬을 종료하지 않고 다른 씬을 불러 2개의 씬이 있게 합니다.

 

4. 씬 로드 방법 LoadScene

File / Build Settings / Scenes in Build 에서 로드할 씬들을 넣어줍니다. 

위쪽 씬부터 0번이 부여되고 차례대로 씬 번호가 부여됩니다.

 

 

씬은 Name 또는 씬번호 값으로 로드 할수 있습니다.

 

using UnityEngine;
using UnityEngine.SceneManagement;

public class Scene1 : MonoBehaviour
{
    public void OnClickNextScene()
    {
        SceneManager.LoadScene("Scene2"); //LoadSceneMode.Single 옵션이 디폴트 이다.
        
        SceneManager.LoadScene("Scene2", LoadSceneMode.Single); 
        
        SceneManager.LoadScene("Scene2", LoadSceneMode.Additive);
        
        SceneManager.LoadScene(1);
        
        SceneManager.LoadScene(1, LoadSceneMode.Single); 
        
        SceneManager.LoadScene(1, LoadSceneMode.Additive);
    }
}

LoadSceneMode.Addictive로드 할경우 2개의 씬이 공존한다.

 

5. 씬 로드 비동기화 방식 LoadSceneAsync

LoadSceneAsynce()는 비동기적으로 Scene을 로드할수 있습니다. 씬과 씬 사이에 시간이 많이 필요한경우 중간 많이 사용됩니다.

씬에서 씬으로 넘어걸때 다음씬이 클경우 오랫동안 멈추고 다음 씬이 나옵니다. 그래서 중간에 로딩화면을 만들어 씬이 완성된후 로딩화면을 꺼줍니다. 

 

LoadSceneAsync()은 AsyncOperation 클래스를 리턴 값으로 전달합니다. AsyncOperation 반환 클래스로 여러 정보를 알수 있습니다. 주요 정보만 살표보겠습니다.

 

isDone : 씬 로딩완료시 TRUE로 반환됩니다.

progress : 씬 로딩 진행도를 0~1.0 값으로 나타내 줍니다. 0부터 시작하여 완료시 1.0이 됩니다.

 

using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Scene1 : MonoBehaviour
{
    public void OnClickNextScene()
    {
        StartCoroutine(LoadingScene());
    }

    IEnumerator LoadingScene()
    {
        AsyncOperation loading = SceneManager.LoadSceneAsync("Scene2");

        while (!loading.isDone) //씬 로딩 완료시 로딩완료시 완료된다.
        {
            yield return null;
        }
    }
}
 
반응형

댓글