본문 바로가기
개발/Unity

Unity)다중 Scene 로드 및 처리(Scene Additive)

by 테샤르 2020. 4. 9.

다중 Scene 로드 및 처리(Scene Additive)

 

 

Unity에서는 기본적으로 Single Scene의 형태이다.

 

하지만 작업하다 보면 Scene을 여러 개 중복해서 사용해야 하는 경우가 생긴다. 본인의 경우에서는 NavMesh를 사용하는 상황인데 NavMesh는 Scene당 1개(Only One) 이기 때문에 여러 가지 NavMesh를 사용하기 위해서는 결국 맵 신을 Attach 해서 NavMesh를 교체하는 방법을 사용하고 있다.

 

반응형

그 외 여러 가지 기타 상황에 의거해서 Scene을 여러 개 사용하는 경우도 있다. (인게임/아웃 게임 구분)하는 

CDN으로 맵을 분리하는 경우 등등..

 using UnityScene = UnityEngine.SceneManagement;

UnityEngine의 SceneManager를 Import 하고 사용해야한다.

실제 사용 코드는 다음과 같다.\

<코드>

 public void AdditiveScene(eSCENE_TYPE _sceneType)
 {
   this.SetState(eSCENE_MANAGER_STATE.LOAD);

  string sceneName = this.GetTypeToString(_sceneType);
  this.m_CurrentScene.StartCoroutine(LoadUnityScene(sceneName, UnityScene.LoadSceneMode.Additive));
}
private IEnumerator LoadUnityScene(string _name, UnityScene.LoadSceneMode mode)
{
    this.SetState(eSCENE_MANAGER_STATE.LOAD);
    UnityScene.SceneManager.LoadScene(_name, mode);
    yield return new WaitForSeconds(0.5f);
    UnityScene.Scene loadScene = UnityScene.SceneManager.GetSceneByName(_name);

    if(null == this.m_DicSubScene){
    this.m_DicSubScene = new Dictionary<string, UnityScene.Scene>();
    }

    this.m_DicSubScene.Add(_name,loadScene);
    Logger.LogFormat("[SceneManager] AddtiveScene : {0}", UnityScene.SceneManager.GetActiveScene().name);
    this.SetState(eSCENE_MANAGER_STATE.LOAD_END);
}
private IEnumerator LoadUnitySceneAsync(string _sceneName, UnityScene.LoadSceneMode mode)
{
	yield return UnityScene.SceneManager.LoadSceneAsync(_sceneName, mode);
}
private IEnumerator UnLoadUnitySceneAsync(string _sceneName)
{
  this.m_DicSubScene.Remove(_sceneName);
  yield return UnityScene.SceneManager.UnloadSceneAsync(_sceneName);
}

기본적으로 Scene을 로드를 하면 바로 사용할 수 없다. 실제 로드가 한 프레임 이상 기다려야 하기 때문에 코루틴(Coroutine)으로 로드하는 것을 추천드린다.

반응형

 

private void SetActiveScene(UnityScene.Scene _scene){
	UnityScene.SceneManager.SetActiveScene(_scene);
}

Unity 구조상 Scene 이 Active 되는 건 한 개 밖에 없어서 여러 가지 Scene을 사용하려면

스왑 해서 ActiveScene을 변경해줘야 한다.

 

개인적으로는 위의 Main Scene에 Sub Scene을 Attach 해서 사용하는 구조를 추천드린다. Scene은 Destroy 되는 순간 메모리를 해제하는 이점도 있고 분리가 되어있어서 협업하고 재사용하기도 편하고 좋다.

 

반응형

댓글