씬을 추가하고, 씬을 바꾸는 방법을 알아본다

  • 유니티에서 게임월드를 구성하는 단위
  • 프로젝트에 원하는 수만큼 씬을 포함할 수 있고 씬전환을 통해 다른 게임월드를 불러올 수 있음
  • 다중 씬을 이용하여 여러 씬을 동시에 열어 같은 게임월드에서 사용도 가능함

빌드 설정

  • 유니티에서 여러 씬을 사용하기 위해선 빌드 설정에서 씬을 포함해야 함
  • 빌드 설정에서 포함한 씬을 게임 빌드 결과물에 포함함

씬 전환

  • 프로젝트에 포함된 다른 씬을 로딩하고 기존의 씬의 내용을 삭제함
// 씬 매니저를 추가해야된다
using UnityEngine.SceneManagement;

namespace Unity
{
    public class UnityScene : MonoBehaviour
    {
		public void ChangeScene()
		{
		    SceneManager.LoadScene("SceneName");
		}

씬 추가

  • 프로젝트에 포함된 다른 씬을 로딩하고 기존의 씬의 내용을 유지함
public void AddScene()
{
    SceneManager.LoadScene("SceneName", LoadSceneMode.Additive);
}
  • 게임의 규모가 커질수록 씬 추가 시, 스터터링이 심하다
  • 그래서 씬을 불러오는 작업은 비동기식으로 따로 한다

비동기 씬 로드

  • 씬 로딩을 백그라운드로 진행하여 게임 중 멈춤이 없도록하는 비동기 방법
public void ChangeSceneASync()
{
	// 비동기식으로 씬을 로드한다
    // 반환형도 AsyncOperation
    AsyncOperation operation = SceneManager.LoadSceneAsync("SceneName");

    operation.allowSceneActivation = true;      // 씬 로딩 완료시 바로 씬 전환을 진행하는지 여부
    bool isLoaded = operation.isDone;           // 씬 로딩의 완료여부 확인
    float progress = operation.progress;        // 씬 로딩의 진행률 확인
    operation.completed += (oper) => { };       // 씬 로딩의 완료시 진행할 이벤트 추가
}
  • 씬을 Activate 안하면 progress가 0.9f 에서 멈춘다. 사실상 로딩은 끝난 상황이다

씬 언로드

  • 씬을 로딩했으니, 언로드 하는 방법도 있다
public void UnloadScene()
{
	SceneManager.GetAllScenes(); // 현재 로딩 된 모든 씬 반환
    Scene scene = SceneManager.GetSceneByName("씬이름"); // 씬이름을 반환
    //씬이 로딩되어 있는지 판별 필요
    if(scene.isLoaded ==true)
    {
    	// 비동기식으로 열려 있는 씬을 닫기 - 언로드는 무조건 비동기식으로 사용한다
    	SceneManager.UnloadSceneAsync(scene);
    }
}
  • Additive나 Single이나 씬이 언로드 되면 모든 게임 오브젝트는 Destroy 된다

Don't destroy on load

  • 씬의 전환에도 제거되지 않기 원하는 게임오브젝트의 경우 지워지지 않는 씬에 게임오브젝트로 추가하는 방법을 사용
  • Don't destroy on load 씬의 경우 씬 전환 과정 중에 삭제하지 않음
public void SetDontDestroyOnLoad()
{
    DontDestroyOnLoad(gameObject);
}

더티 플래그 패턴

  • 맵이 너무 클 경우, 전체를 불러오기에는 부담스러우니 씬으로 섹터를 나누어서 가까워지면 불러오는 식으로 구현. 멀티씬을 구성할 때 쓴다
  • 트리거 충돌체를 사용해 구현한다. 트리거가 되면 씬을 불러온다
  • 메트로베니아가 이런 식으로 구현된다
  • 록맨도 비슷하게 통로 문을 지날 때 다음맵을 불러오는 식이다
  • 오픈월드도 비슷한 느낌의 방식으로 구현된다 = 심리스

    참고
    더티플래그

맵이 복잡해지기 시작하면 로드하는 방식

  • 씬을 그래프로 관리해서 연결된 노드를 불러오는 식으로 해야될까?(나쁘지 않은 방법)
  • 유니티에서 제공하는 물리 엔진이 있으니, 트리거 충돌체를 통해서 구현하는 것이 더 간단하다 (추천방법)

유니티 디버깅

  • 프레임 디버거


  • 물리 디버거

  • 프로파일러

    • 가장 많이 쓰게 될 기능
    • 프레임, 메모리, 오디오가 얼마나 사용되고 있는지 볼 수 있다
    • 어떤 부분에서 가장 많은 성능이 사용되고 있는지 확인해서 리팩터링을 진행할 수 있다
    • Hierarchy를 선택하면 프레임 마다 어떤 연산들이 수행되는지, 시간은 얼마나 걸리는지 알 수 있다
  • IDE로 디버깅

    • 중단점을 찍고, VS에서 Unity에 연결을 누르거나 유니티에서 아래와 같은 버튼을 누른다
    Debug.LogWarning("주의");
    Debug.LogError("에러");
    • 유니티 에디터 상에서 더블클릭하면 해당 문구가 삽입된 스크립트로 이동한다

profile
개발 박살내자

0개의 댓글