오늘은 맵 전환(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 전환이 일어난다.
오늘은 여기까지 :)