[Basic] 오브젝트 파괴하지 않고 씬 불러오기



새로운 씬을 불러올 때 내가 원하는 오브젝트를 파괴하지 않고 새로운 씬을 불러오는 방법이 있다.

그것은 바로! DontDestroyOnLoad이다.

사용방법을 알아보자!

우선 확인하기 위한 셋팅을 좀 해보자.

image

이게 Scene1의 모습이고,

image

이게 Scene2의 모습이다. 이제 여기서 스페이스바를 눌렀을 때 Scene1의 스피어 오브젝트는 파괴되지 않고 Scene2를 불러오는 법을 설명하겠다.

새로운 씬을 불러 올 때 파괴되지 않았으면 하는 오브젝트에 다음과 같은 스크립트를 붙여주면 된다.

    private void Awake()
    {
        DontDestroyOnLoad(gameObject);
    }

위 코드의 결과로 다음과 같은 결과가 나온다.

image

위 사진과 같이 Scene2에 원래는 없더 스피어 오브젝트가 남은 상태로 씬이 불러와졌다. 그럼 저 스피어 오브젝트는 파괴할 수 없을까? 아니다 방법이 있다! 바로 평상시와 같이 Destroy함수를 사용하면 파괴가 가능하다!

하지만 이렇게 DontDestroyLoad를 써서 오브젝트가 새로운 씬을 불러올 때 파괴되지 않게 하는 방법에는 주의사항이 있다.

주의 사항

1)원래 DontDestroy오브젝트가 있던 씬에서 새로운 씬을 불러오고 다시 원래 DontDestroy오브젝트가 있는 씬을 부를 때를 생각해보자.

image

DontDestroy오브젝트는 게임이 시작 되었을 때 DontDestroyLoad영역에 넣어지기 때문에 새로운 씬을 불러도 파괴되지 않는다. 하지만 여기서 문제가 생긴다 한 번 새로운 씬을 불렀다가 다시 원래의 씬을 불러오도록 코드를 작성하고 반복해서 실행해 보겠다.

image

위 사진과같이 오브젝트가 계속 추가 되는 것을 볼 수 있다. 이러면 우리가 생각한 모습이 나오지 못할 수 있다. 그럼 해결책이 제시하겠다.

해결책

중복 오브젝트 검사 후 파괴하기

우리가 DontDestroy오브젝트를 만드는 이유는 게임 안에서 단하나만 존재하길 원할 떄 사용한다. 그래서 오브젝트가 중복 되는지 검사해서 중복 되는 오브젝트들을 파괴하여 하나의 DontDestroy오브젝트만 남기는 것이다.

코드로 살펴보자.

    private void Awake()
    {
        var objs = FindObjectsOfType<DontDestroy>();
        if (objs.Length == 1)
        {
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }

우선 DontDestroy타입으로 되어 있는 오브젝트들을 다 FindObjectsOfType로 찾아내서 objs에 넣어두고

objs의 길이가 1이면 즉 DontDestroy오브젝트가 하나라면 그 DontDestroyLoad영역에 넣고 1이 아니라면 그 오브젝트를 파괴하는 것이다.




© 2022. by KSC

Powered by sora