티스토리 뷰
서론
RPG게임 개발을 하던 중 한가지 문제점을 발견했다. 옵션, 스킬 등 UI창의 정보는 씬을 넘어가도 유지되어야 하는데
씬을 넘어가면 모든 데이터가 초기화되었다. PlayerPrefs에 저장해 두었기 때문에 씬을 넘어갈 때마다 값을 불러와서 초기화하는 방법이 있지만 매번 값을 설정하기가 불편하고 볼륨 같은 값의 경우 저장해두지도 않았기 때문에 dontdestroy를 사용하기로 하였다.
DontDestroy란?
dontDestroy를 사용하려면 다음과 같이 오브젝트에 DontDestroy 설정을 해주면 된다. 현재 게임에는 캔버스만 설정해 두었지만 앞으로 더 늘어날 가능성이 있어 배열 형태로 선언해 두었다.
인트로 씬의 모습이다. System이라는 이름의 캔버스가 씬이 아니라 dontdestroy에 종속되어 있는 모습을 알 수 있다.
Canvas2의 경우 인트로 씬에서 활용할 UI를 위해 따로 구분지어 두었다.
다른 씬으로 넘어가더라도 dontDestroy의 오브젝트들은 없어지지 않고 유지되는 것을 볼 수 있다.
문제점
1. 중복 오브젝트
dontDestroy를 설정한 씬으로 다시 돌아오면 이전의 오브젝트는 남아있는 상태로 오브젝트가 하나 더 추가된다. 따라서 dontDestroy를 설정한 씬으로 다시 이동할 경우에는 중복되는 오브젝트를 검사하여 삭제하는 방식으로 오브젝트 관리가 필요하다.
또 다른 방법으로는 dontDestroy오브젝트 생성만을 위한 씬을 하나 생성해서 게임을 시작하자 마자 오브젝트를 생성 후 인트로 씬으로 넘어가서 다시는 생성 씬으로 도달할 수 없도록 하는 방법도 존재한다.
2. 오브젝트 수정
dontDestroy오브젝트에 무언가 추가하거나 삭제할 때 발생하는 문제이다. GameObject.Find("오브젝트명")함수를 사용해 dontDestroy오브젝트에 현재 씬의 오브젝트를 가져와 활용할 수 있다.
3. 오브젝트 삽입
두 번째 문제와 경우가 반대인데, dontDestroy오브젝트를 다른 씬에서 가져와 사용하고 싶을 때 발생하는 문제이다.
해결 방법 또한 2번 과 마찬가지로 find함수를 이용해 dontDestroy오브젝트를 호출해 사용하면 된다.
결론
옵션, 캐릭터 정보 등 모든 씬에서 활용해야 하는 정보의 경우 dontDestroy를 적극적으로 활용하도록 하자.
필자의 경우 모든 기능을 단순 오브젝트로 생성했다가 문제점을 이제서야 깨닫고 전부 수정을 완료했다.
'프로그래밍 문제풀이 > 프로그래밍 공부' 카테고리의 다른 글
스크립트로 빙판길 구현하기 (0) | 2023.05.30 |
---|---|
PlayerPrefs를 활용한 코드 최적화 (0) | 2023.05.19 |
Inspector를 사용한 스크립트 간소화 (0) | 2023.04.26 |
PlayerPrefs (0) | 2023.04.21 |
Tilemap(SwapTile, SetTile) (2) | 2023.04.17 |