게임 개발을 하다 보면 씬 전환이 불가피한 경우가 많습니다. 이때 각 씬 간에 데이터를 어떻게 전달할지 고민해보셨나요? 특히 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는 이를 해결할 수 있는 강력한 도구입니다. 위에서 설명한 기본 사용법과 꿀팁을 잘 활용한다면, 씬 전환 시 데이터 유실 문제를 손쉽게 해결할 수 있을 것입니다. 앞으로 이 방법을 활용하여 더욱 효율적인 게임 개발을 경험하시길 바랍니다.