인프런 커뮤니티 질문&답변

tkddlsdndb님의 프로필 이미지
tkddlsdndb

작성한 질문수

[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작

UI 개선

PoolManager Pool.OnGet에러질문드립니다.

작성

·

363

0

팝업창에서 하위 ui item 자식들을 삭제하고 생성하고를 반복하다보면 어느순간 삭제된 오브젝트를 참조했다고 Pool.OnGet에서 오류가 출력됩니다.

void OnGet(GameObject go)에 go는 null값이들어오는데 이유를 모르겠습니다. 버튼을 누르면 모든자식을 DestroyChilds를 통해 삭제하고 makesubitem을 통해서 다시 여러개를 출력합니다.

어떻게 null값이 나오는지 모르겠습니다.

 

 

오류내용은 아래와같습니다,

MissingReferenceException: The object of type 'GameObject' 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.

Pool.OnGet (UnityEngine.GameObject go)

답변 1

0

안녕하세요 tkddlsdndb 님, 인프런 AI 인턴이에요.

오류 내용을 보면 ‘GameObject’ 형식의 오브젝트가 이미 파괴되었지만 여전히 액세스를 시도하고 있다는 내용입니다. 이 문제는 삭제된 오브젝트를 참조하려고 할 때 발생하는 것으로 보입니다.

해결 방법은 두 가지입니다:
1. OnGet 함수 내부에서 ‘go’ 오브젝트가 null 인지 확인하는 코드를 추가할 수 있습니다. null 체크를 통해 오브젝트가 파괴되었는지 여부를 확인하고 오류를 방지할 수 있습니다.
예를 들면, 다음과 같이 null 체크를 할 수 있습니다:

void OnGet(GameObject go)
{
    if (go != null)
    {
        // 오브젝트를 정상적으로 사용하는 코드
    }
    else
    {
        // null일 경우 처리할 코드
    }
}
  1. 오브젝트를 파괴하기 전에 해당 오브젝트를 사용하는 모든 부분에서 해당 오브젝트가 null 인지 체크해야 합니다. 오브젝트가 null 이면 해당 오브젝트를 사용하지 않도록 코드를 수정해야 합니다.

이러한 방법으로 문제를 해결할 수 있습니다. 추가적인 도움이 필요하시면 언제든지 물어보세요. 감사합니다!

tkddlsdndb님의 프로필 이미지
tkddlsdndb
질문자

한가지 더 궁굼한점이있습니다.! object pooling은 destroy할 때 active에 대해서 false 하는걸로 알고있는데 왜 파괴가 됐는지 null체크로 확인해야하는 건지 모르겠습니다.

tkddlsdndb님의 프로필 이미지
tkddlsdndb

작성한 질문수

질문하기