어제 테스트할때 잘 됐던 기능들이 Null Reference Exception 라는 오류가 발생하며 갑자기 작동되지 않았다..
코드를 아무리 봐도 문제가 없고, 예외처리까지 모두 되어있는데 문제가 해결되지 않아서
게임씬으로 이동 후 오브젝트를 보려고 했는데 오브젝트가 보이질 않았다.
게임오브젝트를 다시 만들고 스크립트를 컴포넌트에 추가해도 계속해서 없어졌다.
그때 깨달았다, 아 이건 이 스크립트가 어디 숨어있다…
그래서 하이어라키창에 검색해봤더니 “Score” 스크립트가 뜬금없이 FireSpawner에 들어가있었다 !
커밋 내용에 씬을 건든 흔적이 있을때 의심했어야하는데... 그래도 이런 배우는 과정에서 이런건 항상 좋은 거름이 된다고 생각한다.
문제설명
문제 : 팀 프로젝트중 Game씬으로 전환 시 ScoreBoard 오브젝트가 사라짐
증상 : Game씬이 로드될 떄 ScoreBoard 오브젝트가 사라지고 점수시스템에는 이상이 없지만, 게임이 끝나고 Score스크립트에서 호출되는 함수쪽에서 "Null Reference Exception" 에러가 발생했음, Score에 DontDestroyOnLoad 기능을 넣어 파괴되지 않게 만들었더니 "DontDestroyOnLoad only works for root GameObjects or components on root GameObjects." 라는 오류 발생
환경 설명
OS : Windows11
Unity 버젼 : 2022.3.17f1
증상 분석
디버그 로그 : "DontDestroyOnLoad only works for root GameObjects or components on root GameObjects."
분석 : 해당 디버그로그를 보고 "Score" 스크립트가 올바른 오브젝트에 있지 않거나, 씬을 로드할때 중복 생성되고 있을 수 있음
가능성 정리
1. 올바르지 않은 오브젝트에 "Score" 스크립트를 추가해뒀을 수 있음
2. 씬을 로드할때 "Score"스크립트를 가진 오브젝트가 중복 생성됨
3. 코드에 문제가 있어서 오브젝트가 의도치 않게 파괴됨
해결
1. 하이어라키창에서 "Score"를 검색하여 "Score"스크립트를 컴포넌트로 가지고 있는 오브젝트를 검색
2. 오브젝트를 확인해보니 "FireSpawner" 오브젝트에 "Score" 스크립트가 컴포넌트로 추가되어 있었고, 해당 컴포넌트를 제거하여 해결 및 테스트 완료.
앞으로 발생하지 않기 위해선 ?
1. 팀원들에게 알맞은 오브젝트 및 스크립트 네이밍을 권장하기
2. 깃허브의 History를 보고 어떤 내용을 수정했는지 알 수 있는 역량 강화하기
3. 팀원의 Dev머지를 금지시키고 무조건 팀장 혹은 담담자에게 컨펌을 받은 후 머지하기