[Unity]28.씬 분리와 병합

안녕하세요 유랑입니다.



오늘은 씬 분리와 병합에 대해서 알아보겠습니다.

씬 분리와 병합은 어떻게 해야되는 걸까요?




1. 씬 분리와 병합



다양한 사람들과 게임을 만들게 되면 씬 분리의 필요성이 확연해 집니다.

실제 게임을 구동할 때 씬을 병합하며 사용하는 것이져.




1-1) 프로젝트 생성



이름 작성과 템플릿을 선택 후 프로젝트를 생성해 주겠습니다

유니티 버전은 2019.2.1f1을 사용하겠습니다^^







1-2) 씬 분리



4개의 씬을 만들어 주겠습니다.

Main 씬을 제외한 나머지 씬들은 서브씬으로 사용될 예정입니다.













1-3) 씬 병합 



Main씬을 활성화 시킨 후 Lobby 씬을 추가하면 다음과 같이

두 가지의 씬이 활성화 됩니다.






코드를 통해서 이와 같이 씬을 병합해주겠습니다.





빈 오브젝트와 스크립트를 생성 후 다음과 같이 적용해 주세요ㅎㅎ





해당 코드는 딕셔너리에 각 씬에 대한 정보 값을 저장 후

로드를 통해 씬을 병합시켜주는 코드입니다.



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

public class SceneLoader : MonoBehaviour
{
    // 호출할 씬과 씬 로드 방식을 저장할 딕셔너리
    public Dictionary loadScenes = new Dictionary();

    // 호출할 씬의 정보 설정
    void InitSceneInfo()
    {
        // 호출할 씬의 정보를 딕셔너리에 추가
        loadScenes.Add("Lobby", LoadSceneMode.Additive);
        loadScenes.Add("Room", LoadSceneMode.Additive);
        loadScenes.Add("Game", LoadSceneMode.Additive);
    }

    IEnumerator Start()
    {
        InitSceneInfo();

        foreach (var _loadScene in loadScenes)
        {
            yield return StartCoroutine(LoadScene(_loadScene.Key, _loadScene.Value));
        }
    }

    IEnumerator LoadScene(string sceneName, LoadSceneMode mode)
    {
        yield return new WaitForSeconds(3.0f);

        // 기존의 씬을 언로드
        if (sceneName == "Room")
            SceneManager.UnloadSceneAsync("Lobby");
        else if (sceneName == "Game")
            SceneManager.UnloadSceneAsync("Room");

        // 씬을 로드
        SceneManager.LoadScene(sceneName, mode);
    }
}


빌드 세팅에 꼭 씬에 대한 정보를 추가해 주세요!!!





게임을 시작하면 Main씬은 계속 남아있고, 

다른 씬들이 추가 후 삭제되는 걸 확인할 수 있습니다.






1-4) FadeIn 효과



씬의 용량이 커질수록 전환시 멈춰있는 느낌을 받을 수 있습니다.

FadeIn 효과를 적용하여 자연스러운 씬 효과를 만들어 주겠습니다^^

Canvas와 Image를 각각 추가해 주세요.






이미지는 캔버스 크기에 맞게 변경 후 컬러 값은 검은색으로 바꿔 주세요.

이미지의 알파값을 이용해 페이드 효과를 주어도 되지만,

Canvas Group을 이용해 만들어 보겠습니다.





기존의 코드에 FadeIn 효과를 적용해 주겠습니다.

알파값을 변경함으로써 FadeIn 효과를 만들어 줍니다.



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

public class SceneLoader : MonoBehaviour
{
    // 호출할 씬과 씬 로드 방식을 저장할 딕셔너리
    public Dictionary loadScenes = new Dictionary();

    // 호출할 씬의 정보 설정
    void InitSceneInfo()
    {
        // 호출할 씬의 정보를 딕셔너리에 추가
        loadScenes.Add("Lobby", LoadSceneMode.Additive);
        loadScenes.Add("Room", LoadSceneMode.Additive);
        loadScenes.Add("Game", LoadSceneMode.Additive);
    }

    // CanvasGroup 컴포넌트를 저장할 변수
    public CanvasGroup fadeCg;

    // Fade In 처리 시간
    [Range(0.5f, 2.0f)]
    public float fadeDuration = 1.0f;

    IEnumerator Start()
    {
        InitSceneInfo();

        foreach (var _loadScene in loadScenes)
        {
            yield return StartCoroutine(LoadScene(_loadScene.Key, _loadScene.Value));
        }
    }

    IEnumerator LoadScene(string sceneName, LoadSceneMode mode)
    {
        yield return new WaitForSeconds(fadeDuration);

        // Fade In 함수 호출
        StartCoroutine(Fade(0.0f));

        // 기존의 씬을 언로드
        if (sceneName == "Room")
            SceneManager.UnloadSceneAsync("Lobby");
        else if (sceneName == "Game")
            SceneManager.UnloadSceneAsync("Room");

        // 씬을 로드
        SceneManager.LoadScene(sceneName, mode);
    }

    // Fade In/Out 시키는 함수
    IEnumerator Fade(float finalAlpha)
    {
        // 처음 알파값을 설정(불투명)
        fadeCg.alpha = 1.0f;

        fadeCg.blocksRaycasts = true;

        // 알파값을 조정
        while (!Mathf.Approximately(fadeCg.alpha, finalAlpha))
        {
            // MoveTowoard 함수는 Lerp 함수와 동일한 함수로 알파값을 보간함
            fadeCg.alpha = Mathf.MoveTowards(fadeCg.alpha, finalAlpha, fadeDuration * Time.deltaTime);

            yield return null;
        }
        fadeCg.blocksRaycasts = false;
    }
}



코드작성이 완료되면 FadeImage를 추가하시면 완료입니다.

FadeDuration을 변경함으로써 씬과 FadeIn 시간을 변경할 수 있습니다.








2. 마무리



오늘은 씬 분리와 병합에 대해서 배워보았습니다.

씬 분리를 통해서 각각의 기능들을 나눠놓을 수 있겠네요ㅎㅎ

오늘도 고생하셨습니다.

감사합니다.




수업자료: 28.씬 분리와 병합






댓글

Designed by JB FACTORY