형들 안녕! 유니티 뉴비야
게임 프로토를 만들고 있는데
이제 인게임 씬 하나 얼출 돌아갈랑 말랑 하거든,
열심히 만들다가 씬로드 해서 다시 처음부터 게임을 테스트 해볼려고 했더니 null나면서 갑자기 터지는거야..
1. 하스스톤 같은 덱빌드 게임 메인씬임
2. 게임 시작하고 1초후에 덱매니져가 카드를 생성해서 지정된 타켓 오브젝트(댁매니져 하위에 있는 오브젝트임) 위치에 이동시킴 [SerializeField] Transform cardSpawnPoint; 로 손으로 연결해둠
3. 열심히 게임을 함
4. 중간에 씬을 재로드! SceneManager.LoadScene(sceneName);
5. 게임 시작하고 1초후에 덱매니져가 카드를 생성해서 지정된 타켓 오브젝트(댁매니져 하위에 있는 오브젝트임) 위치에 이동시킬려고 하는데 transform null 뜸
프리팹상에서는 잘 연결되어 있어 보임, 눈으로는 그렇게 보임.
MissingReferenceException: The object of type 'Transform' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
6. 씬에서 봤을때는 하위 오브젝트에 타겟 오브젝트가 다 있음 ㅠㅠ
머가 문제인거야?
간단한 프로토는 여러번 만들었는데 이런 경우는 처음이라 버전은 2022.3.9f1 이에욤.
고견좀 알려주심사.. ㅜㅜ
알려주심 이번주 로또 1등하실듯
디버그 중단점을 찍어보는 게 빠름
내생각엔 1.덱매니져가 싱글톤이다 2. 전 씬을 죽이면서 타겟 오브젝트가 null이 된다 3. 현 씬에서 전 씬의 null인 트랜스폼을 불러와서 크래시 인 것 같음
고수네 동의한다 sceneLoad 할 때 이전 씬에 있던 레퍼런스들 다 해제해주는 게 안전하다
DontDestroyOnload로 해놓은 게임매니저 같은 클래스가 재로드된 씬에 있으면 재로드할 때마다 하나 더 생성 -> 그놈도 Don'tDestroyOnLoad임 -> 이전에 있던 매니저는 Don'tDestroyOnLoad되어 있어서 안 파괴되고 쌓여서 오류뜸
혹은 게임매니저가 타깃을 물고있을때 재로드하면 거기에 맞춰서 새로운 타깃을 찾아서 물도록 초기화를 해줘야 하는데 그게 빠져있어서 null이 뜨는거일수도 있슴.
호시타형 내 옆에 있는거 아냐? 정확해. 일럴떄 싱글톤을 막 쓰면 안되는건가요?
내가 싱글톤 개념을 전혀 잘 모르고 있는거 같네. 어떻게 해결해야 하는거지 ㅠ 싱글톤을 쓰지 말아야 하나.
싱글톤 쓰는 건 괜찮은데 레퍼런스 문제가 안 생기게 하는 게 중요함 LoadScene하고 초기화할 때 레퍼런스 다시 다 할당 해주는 지 확인해봐 저 형이 말한대로 이미 사라진 씬의 오브젝트를 레퍼런스로 가지고 있으니 null이 뜨는 걸로 추정되니까
1. 싱글톤은 재로드하는 씬에 넣지 말고 별개의 씬에서 생성한 다음 재로드할 씬으로 들어가기. ->일반적으론 실제 게임에서 그대로 재로드할 일은 없을테니 문제없지만, 같은 이유로 반복적으로 들어갔다 나갔다가 하는 씬에는 싱글톤 오브젝트를 넣지 말기(나는 시작화면에서 생성하는데 시작화면으로 나갈 수 있는 게임이라면 그 전에 인트로라든가 다른 씬에 넣어주면 됨) 2. 싱글톤에서 필수적으로 뭐 해줘야 하는 일이 있으면 해당 작업들을 별개 함수로 빼주고 void Initialize() { 할일 } void Awake() { Initialize() } 이런 식으로 구분한 다음 재로드할때 Initialize() 함수를 호출해주면 될듯
덱매니져가 초기화 안되는 거 같은데. 앞에서 말한 것 처럼 덱매니져가 싱글톤으로 DontDestroyOnload 되어 있어서 생기는 문제일수도 있음. 덱매니져를 DontDestroyOnload 하면 씬을 바꿔도 덱매니져가 파괴되지 않는데 덱매니져에 연결되어있는 [SerializeField] Transform cardSpawnPoint; 가 파괴되어서 오류가 생긴걸로 보임. 주먹구식으로 한다면 덱매니져에 있는 DontDestroyOnload 을 지우면 되겠다만. 내가 코드를 뜯어본건 아니라서 오류 생길수도 있음
고마워 형들 먼가 살짝 감이 오네.
호시타형은 이번주 로또 1등하고 ㅇㅇ형이랑 사슴발레리나 형은 연금복권 1등해!