게임 개발을 하다 보면 씬 전환이 불가피한 경우가 많습니다. 이때 각 씬 간에 데이터를 어떻게 전달할지 고민해보셨나요? 특히 Unity를 사용하는 경우, 씬 전환 시 게임 오브젝트가 사라지는 문제는 꽤나 골칫거리입니다. 오늘은 이 문제를 해결하기 위한 강력한 도구, DontDestroyOnLoad
를 활용한 데이터 전달 방법에 대해 알아보겠습니다.
왜 DontDestroyOnLoad
인가?
Unity에서 새로운 씬이 로드될 때마다 대부분의 게임 오브젝트는 메모리에서 해제됩니다. 그러나 때로는 이전 씬에서 생성된 데이터를 다음 씬에서도 유지하고 싶을 때가 있습니다. 이럴 때 DontDestroyOnLoad
를 통해 특정 게임 오브젝트가 삭제되지 않도록 설정하면, 씬 전환 후에도 데이터를 유지할 수 있습니다.
DontDestroyOnLoad
의 기본 사용법
먼저, DontDestroyOnLoad
의 기본 사용법을 알아봅시다. 매우 간단합니다. 사용하고자 하는 게임 오브젝트의 Awake
또는 Start
메서드에서 DontDestroyOnLoad(this.gameObject);
한 줄이면 끝입니다.
public class GameManager : MonoBehaviour
{
private void Awake()
{
DontDestroyOnLoad(this.gameObject);
}
}
이렇게 하면 GameManager
오브젝트는 씬이 전환되더라도 파괴되지 않고 유지됩니다.
실제 적용 예제
예를 들어, 게임 내에서 플레이어의 점수를 씬 간에 유지하고 싶다면, PlayerScore
스크립트를 활용할 수 있습니다.
public class PlayerScore : MonoBehaviour
{
public int score;
private void Awake()
{
DontDestroyOnLoad(this.gameObject);
}
public void AddScore(int points)
{
score += points;
}
}
이렇게 하면 플레이어의 점수는 씬이 바뀌어도 유지됩니다. AddScore
메서드를 통해 점수를 추가하는 것도 가능하죠.
꿀팁: 반드시 주의해야 할 점
DontDestroyOnLoad
를 사용할 때 주의해야 할 점이 몇 가지 있습니다. 가장 큰 문제는 중복입니다. 씬이 시작될 때마다 새로운 오브젝트가 생성되어 중복될 가능성이 있습니다. 이를 방지하기 위해 싱글턴 패턴을 활용하는 것이 좋습니다.
public class GameManager : MonoBehaviour
{
private static GameManager _instance;
public static GameManager Instance
{
get { return _instance; }
}
private void Awake()
{
if (_instance != null && _instance != this)
{
Destroy(this.gameObject);
return;
}
_instance = this;
DontDestroyOnLoad(this.gameObject);
}
}
이렇게 구현하면 GameManager
는 하나의 인스턴스만 유지하게 됩니다.
결론
씬 간의 데이터 전달은 게임 개발에서 자주 발생하는 상황이며, DontDestroyOnLoad
는 이를 해결할 수 있는 강력한 도구입니다. 위에서 설명한 기본 사용법과 꿀팁을 잘 활용한다면, 씬 전환 시 데이터 유실 문제를 손쉽게 해결할 수 있을 것입니다. 앞으로 이 방법을 활용하여 더욱 효율적인 게임 개발을 경험하시길 바랍니다.