본문 바로가기
Unity 강의/Unity Course(2) - 절대강좌! 유니티

[Unity Course 2] 12. 씬 관리

by 첨부엉. 2024. 6. 28.
반응형
위키북스 출판사 이재현 저자님의 '절대강좌! 유니티' 책을 참고하여 필기한 내용입니다.

 

지금까지 진행한 씬을 분리할 예정!

 

씬을 분리하는 이유는 협업 시 분야별로 분리하여 개발을 진행한 후 합치기 때문 

UI 개발자, 레벨 디자이너, 메인 개발자 세명이 함께 분야별로 개발을 진행하고 구동하기 전에는 합쳐서 실행함

 

Scene 분리

STAGE 안에 SpawnPointGroup 오브젝트를 하위로 넣기 그리고 Ctrl + S "저장하기"

 

Play 씬을 복제하고 이름은 Play_backup으로 변경

 

하나 더 복제하여 이름은 Level_01 으로 변경

 

Play 씬에서 STAGE 오브젝트는 삭제하기

이렇게 되면 씬에는 플레이어와 UI만 남게 되는데 이게 게임 로직 부분이 됨

Level_01 씬에서는 STAGE 오브젝트만 남겨 놓고 나머진 다 삭제하기

 

Scene 병합

UIManager.cs

using UnityEngine;
using UnityEngine.UI;               // Unity-UI를 사용하기 위해 선언한 네임스페이스
using UnityEngine.Events;           // UnityEvent 관련 API를 사용하기 위해 선언한 네임스페이스
using UnityEngine.SceneManagement;  // SceneManager를 사용하기 위해 선언한 네임스페이스

public class UIManager : MonoBehaviour
{
    // 버튼을 연결할 변수
    public Button startButton;
    public Button optionButton;
    public Button shopButton;

    private UnityAction action;

    private void Start()
    {
        // UnityAction 을 사용한 이벤트 연결 방식
        action = () => OnStartClick();
        startButton.onClick.AddListener(action);

        // 무명 메서드를 활용한 이벤트 연결 방식
        optionButton.onClick.AddListener(delegate { OnButtonClick(optionButton.name); });

        // 람다식을 활용한 이벤트 연결 방식
        shopButton.onClick.AddListener(() => OnButtonClick(shopButton.name));
    }


    public void OnButtonClick(string msg)
    {
        Debug.Log($"Click Button : {msg}");
    }

    public void OnStartClick()
    {
        SceneManager.LoadScene("Level_01");
        SceneManager.LoadScene("Play", LoadSceneMode.Additive);
    }
}

 

메서드 설명
CreateScene 새로운 빈 씬을 생성
LoadScene 씬의 이름 또는 인덱스 번호로 씬을 로드
LoadSceneAsync 씬을 비동기 방식으로 로드
MergeScenes 소스 씬을 다른 씬으로 통합한다. 소스 씬은 모든 게임오브젝트가 통합된 이후 삭제
MoveGameObjectToScene 현재 씬에 있는 특정 게임오브젝트를 다른 씬으로 이동
UnloadScene 현재 씬에 있는 모든 게임오브젝트를 삭제

 

LoadScene 함수는 새로운 씬을 호출하는 함수로 "Level_01"을 먼저 로드한후 Play 씬을 추가로 로드함

두번째 인자는 씬을 로드할 때의 옵션으로 단독 씬으로 로드할지 또는 앞서 로드된 화면에 추가로 로드할지를 결정

 

  • LoadSceneMode.Single : 기존에 로드된 씬을 모두 삭제한 후 새로운 씬을 로드
  • LoadSceneMode.Additive : 기존 씬을 삭제하지 않고 추가해서 새로운 씬 생성
public void OnStartClick()
{
    SceneManager.LoadScene("Level_01");
    SceneManager.LoadScene("Play", LoadSceneMode.Additive);
}

 

OnStartClick 은 START 버튼을 클릭했을 때 호출할 함수이므로 Start 함수의 이벤트에 연결함

private void Start()
{
    // UnityAction 을 사용한 이벤트 연결 방식
    action = () => OnStartClick();
    startButton.onClick.AddListener(action);

    // 무명 메서드를 활용한 이벤트 연결 방식
    optionButton.onClick.AddListener(delegate { OnButtonClick(optionButton.name); });

    // 람다식을 활용한 이벤트 연결 방식
    shopButton.onClick.AddListener(() => OnButtonClick(shopButton.name));
}

 

실행하게 되면 호출하려는 씬이 없다는 메세지가 뜨며 오류가 발생하게 됨

 

File - Build Settings 을 선택하여 씬을 드래그 드롭하기

게임을 실행하게되면 최상단에 위치한 씬이 가장 먼저 보이게 되고 두번째 이후 씬은 의미가 없음 

추가한 씬은 Delete 키로 삭제할 수 있고 원하는대로 드래그하여 위치를 변경할 수 있음

 

실행해서 Start 버튼을 누르게 되면 세개의 씬이 로드되는 것을 확인할 수 있다.

 

DontDestroyOnLoad 는 GameManager 를 싱글턴으로 구현했기 때문에 자동으로 생성된 씬

 

멀티 씬 에디트 기능

프로젝트 개발 시작과 동시에 씬을 분리한 상태로 작업할 경우에 유니티의 멀티 씬 에디트 기능을 사용하여 더 편리하게 개발 할 수 있음 하이러키 뷰의 여러 개 씬을 로드한 상태로 작업이 가능

 

반응형