Unity/기초 예제

유니티 씬 전환시 오브젝트 유지하기 DontDestroyOnLoad 간단한 예제 유니티 기초

최애뎡 2021. 6. 21. 21:37
728x90
반응형

이번 예제는 씬 전환 포스팅에 이어서 진행됩니다.

유니티에서 새로운 씬을 로드하게 되면 앞서 사용하던 씬의 내용은 사라지게 됩니다.
그런데 여기서 RPG 게임을 생각해 보면
Player처럼 새로운 씬이 시작되었을 때 Player 오브젝트를 다시 생성할 필요 없이 앞 씬에 있던 Player가 사라지지만 않아도 됩니다.  씬이 바뀌었다 해서 바뀐 씬에 또다시 Player을 만들 필요가 없다는 얘기죠? 이처럼 씬이 전환되었을 때도 없애지 말고 유지하고 싶은 오브젝트들이 있을 겁니다.
이를 위해 유니티는 DontDestroyOnLoad를 제공하고 있습니다.
그런데 DontDestroyOnLoad을 사용하면서 한가지 유의할 점이 있습니다.
바로 DontDestroyOnLoad를 사용할 오브젝트는 항상 최상위 오브젝트여야 한다는 점입니다.
DontDestroyOnLoad를 적용한 오브젝트가 어떠한 오브젝트의 하위 오브젝트일 경우
그 오브젝트는 DontDestroyOnLoad가 적용되지 않습니다.

일단 앞서 만든 게임에서 다른 씬을 만들기 위해 새로운 씬을 생성하도록 하겠습니다.

01. Scenes 폴더에 새로운 씬을 만들어줍니다.
(저는 Stage_2로 이름 지었습니다.)

새로 만든 씬에 편하게 Stage를 만들어주기 위해 Main 신으로 가서 Stage만 복사한 뒤

Stage_2 씬으로 와서 붙여넣기를 해줍니다.
Stage_2는 새로 만든 씬이라 Main Camera의 설정이 기본값이여서
Game뷰 화면이 Main 씬과는 다르게 보이게 됩니다. 
Stage_2 씬의 Main Camera Trnasform을  
Main 씬의 Main Camera의 Transform과 
똑같이 하면
Main 씬과 동일하게 보기가 편해집니다.

Stage_2인 만큼 Boxes 안에 Cube들을 복 붙 하여 추가하고 위치를 조절해줍니다.
그리고 Stage_2를 클리어한 뒤에는 Main 씬으로 돌아가기 위해

Stage_2 씬의 Stage 오브젝트에 LoadScene 스크립트를 추가한 뒤 Main을 넣어줍니다.
그렇다면 여기서 생각해봐야 할 점은
Main 씬에서 Stage_2 씬으로 갈 때에는 3개의 Cube를 제거하면 되고
Stage_2 씬에서 Main 씬으로 갈 때에는 5개의 Cube를 제거하면 됩니다.

Main 씬과 Stage_2의 씬을 구별하기 위해 bool형 변수를 선언하여 줍니다.
그리고 Update() 구문 안에 if 문을 사용하여
상황에 맞게 씬을 로드해주면 됩니다.
Update() 부분을 이해하고 나시면 9번 줄에 bool형 변수를
왜 static으로 선언하였는지 느낌이 오실 텐데요!?
bool형 변수를 static으로 선언하지 않았다면 씬을 로드하였을 때
Update() 안 if 문에서 변경하였던 bool 변수의 값이 저장되지 않고
처음 설정했던 값으로 돼있을 것입니다. 이를 방지하기 위해
static을 이용하여 변수의 생명 주기를 바꿔주시면 됩니다.
static의 경우 프로그램이 시작할 때 생성되고 프로그램이 종료할 때 소멸되기 때문에
새로이 씬을 로드해도 if 문에서 변경하였던 변수의 값이 유지되는 것입니다.
이제 완성된 Stage_2 씬을 사용하기 위해 Build Settings에 들어간 뒤

Add Open Scenes 버튼을 클릭하여 씬을 추가해줍니다.
자 이제 씬이 잘 넘어가나 확인해볼까요?

Main 씬으로 돌아가고 Player에 있는 LoadScene에서 Load될 씬의 이름을 Stage_2로 해줍니다.
그런 뒤 실행을 하게 되면

이처럼 3개의 Cube를 없앴을 때 Stage_2 씬으로 넘어가는 걸 확인하실 수 있습니다.
(Stage_2 씬으로 넘어갈 때 화면이 어두워지는 것을 방지하기 위해
씬 전환 포스팅을 참고하여 Stage_2 씬에서 설정을 해줍시다!)

이제 Stage_2 씬이 로드될 때 Player 오브젝트를 유지하기 위해
새로운 스크립트를 작성해보도록 하겠습니다.

이 코딩의 부분은

https://docs.unity3d.com/kr/530/ScriptReference/Object.DontDestroyOnLoad.html

 

Unity - 스크립팅 API: Object.DontDestroyOnLoad

When loading a new level all objects in the scene are destroyed, then the objects in the new level are loaded. In order to preserve an object during level loading call DontDestroyOnLoad on it. If the object is a component or game object then its entire tra

docs.unity3d.com

을 참고했습니다.


이제 작성한 이 스크립트를 유지하고 싶은 오브젝트인 Player에게 적용하도록 하겠습니다.

이렇게 적용을 한 뒤 Player에 있는 LoadScene 스크립트를 제거해주시고

요로코롬 Stage에 다시 적용시켜 주겠습니다.
이유는 후에 Player 오브젝트가 유지되어 Stage_2 씬으로 넘어갈 때
LoadScene 스크립트가 Stage_2 씬에 있는 Stage에도 있고 Player에도 있기 때문에
오류나 원하지 않는 결과가 나올 수 있어 이를 미연에 방지하기 위함입니다.
이제 플레이를 해보면

이렇게 Player 오브젝트는 유지되면서 씬이 전환되는 것을 보실 수 있습니다.
이를 잠시 전체적 화면으로 보면

플레이 버튼을 누르면 Hierarchy에 DontDestroyOnLoad 안에 Player가 속해있는 걸 보실 수 있으며

씬이 전환되었을 때도 유지가 되는 것을 확인하실 수 있습니다.

반응형