Unity Tutorial_6_(Scene, 맵 이동)

GonoBae
6 min readSep 12, 2021

--

오늘은 맵 전환(Scene 전환)에 대해 알아보자

다음과 같이 Scene 을 만들어주고

더블클릭해 들어가고 새로운 맵의 Sprite 를 넣어주자

이 맵은 바닥을 따로 만들어주지 않을 것이기 때문에

바닥은 Box Collider2D 를 통해 만들어준다.

이제 GameScene 에서 NextScene 으로 이동할 위치를 설정해주자

GameScene 의 오른쪽 끝을 Portal

NextScene 의 적절한 위치에 StartPoint 를 만들어준다.

이제 Script 를 만들어주어야 한다.

Portal 과 StartPoint 의 Script 를 짜주자

Portal 의 경우

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Portal : MonoBehaviour
{
public string transferMapName;
private Player thePlayer;
// Start is called before the first frame update
void Start()
{
if (thePlayer == null)
thePlayer = FindObjectOfType<Player>();
}
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.CompareTag("Player"))
{
thePlayer.currentMapName = transferMapName;
SceneManager.LoadScene(transferMapName);
}
}
}

Portal 의 경우 충돌이 아닌 Trigger 방식으로 처리하므로

Player 와 물리처리가 생기면 Unity 에서 입력한 transferMapName 으로

Scene 이 이동한다.

그리고 전환된 Scene 의 이름을 Player 의 currentMapName에 저장한다.

다음은 StartPoint

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StartPoint : MonoBehaviour
{
public string startPoint;
private Player thePlayer;
// Start is called before the first frame update
void Start()
{
if (thePlayer == null)
thePlayer = FindObjectOfType<Player>();
if(startPoint == thePlayer.currentMapName)
{
thePlayer.transform.position = transform.position;
}
}
}

StartPoint 는 말 그대로 Player 가 맵을 이동해왔을 때

시작하는 곳을 말합니다.

그러면 Scene이 전환되면 Player 를 해당 위치로 옮겨주어야 한다.

그래서 startPoint 변수에 입력된 값과 Player 의 currentMapName 이

일치한다면 Player 를 StartPoint 주소로 옮긴다.

이렇게 Portal 과 StartPoint 에 Script 를 넣고

변수를 NextScene 이라고 입력한다.

그리고 몇 가지 설정을 추가하자

Unity File → Build Settings 에 가보면 Scenes In Build 라는 항목이 있다.

여기에 Game / NextScene 이 모두 추가되어 있어야 하므로

SampleScene 은 지워주고 NextScene 을 Drag & Drop 해주자

그리고 Scene 전환 시 가장 중요한 점은 데이터의 유지이다.

Player 는 Game 이라는 Scene 에서 만들어준 데이터이기 때문에

Scene 을 전환하면 사라지게 된다.

그래서 Player 의 Start 함수에 다음과 같이 기입한다.

DontDestroyOnLoad(gameObject);

코드 그래로 파괴하지말라는 뜻인데

데이터 유지를 도와준다.

다음으로 카메라 설정을 살짝 수정해주자

Scene 이 이동하면 각각의 Scene에 배치된 Camera 에 의해 충돌이 발생한다.

이를 방지하고자 Next Scene의 MainCamera 를 삭제한다.

그리고 CameraMgr Script 를 살짝 수정한다.

static public CameraMgr instance; // 변수 추가
private void Awake()
{
if (instance == null)
{
DontDestroyOnLoad(gameObject);
instance = this;
}
else
{
Destroy(gameObject);
}
}

다음과 같은 방식을 SingleTon 방식이라고 하는데

문제점과 이를 해결해야 하는 이유에 대해서는

더 나은 설명을 위해 다음 글에서 알아보도록 한다.

이제 Test 해보면 다음과 같이 Scene 전환이 일어난다.

오늘은 여기까지 :)

--

--