상세 컨텐츠

본문 제목

유니티 List, 오류 및 해결

유니티/기능

by MJ_119 2024. 9. 16. 15:36

본문

유니티에서 아래의 코드로 List를 활용해서 게임오브젝트를 생성, 삭제하고 초기화 하는데, 오류가 발생함.

 

 - 주로 Q랑 R을 광클했을때 오류 발생. 천천히 하면 오류 안나타남

using System.Collections.Generic;
using UnityEngine;

public class ListTest : MonoBehaviour
{
    public List<GameObject> gameObjectslist = new List<GameObject>();
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Q))
        {
            GameObject test = new GameObject();
            gameObjectslist.Add(test);
        }

        if (Input.GetKeyDown(KeyCode.R))
        {
            for(int i = 0; i < gameObjectslist.Count; i++)
            {
                Destroy(gameObjectslist[i]);
                gameObjectslist[i] = null;
            }
            gameObjectslist.Clear();
        }
    }
}

 

 

- 원인과 해결방법을 ChatGPT에 물어봄.

 

Unity에서 발생한 오류는 주로 리스트 내 객체를 삭제할 때 SerializedProperty와 관련된 문제가 발생할 수 있습니다. 특히 객체를 파괴한 후 에디터에서 그 객체를 여전히 참조하려 할 때 문제가 생길 수 있습니다.

오류 원인

  1. GameObject 삭제 문제:
    Destroy()는 즉시 메모리에서 객체를 제거하지 않고, 그 객체를 파괴 대기 상태로 두며, 다음 프레임에서 제거합니다. 따라서 리스트의 객체를 Destroy()로 파괴한 후에 바로 null로 설정하면, Unity 에디터가 여전히 해당 객체를 참조하려 시도할 때 오류가 발생할 수 있습니다.
  2. 리스트 비우기:
    Destroy()로 파괴한 후, gameObjectslist.Clear()로 리스트를 비울 때, Unity 에디터가 삭제된 객체를 참조하려고 하면 문제를 일으킬 수 있습니다.

해결 방안 코드 : 

for (int i = 0; i < gameObjectslist.Count; i++)
{
    if (gameObjectslist[i] != null)
    {
        Destroy(gameObjectslist[i]);
        gameObjectslist[i] = null;
    }
}

 

 

 

 

이 문제는 주로 Unity 에디터에서 발생하는 오류이지만, 완성된 빌드에서도 유사한 문제가 발생할 수 있습니다. 그러나 빌드에서는 오류가 발생하지 않을 가능성이 높습니다. 그 이유는 Unity 에디터에서는 객체와 메모리 관리, 특히 SerializedProperty 시스템이 더 복잡하게 동작하기 때문입니다.

에디터에서는 오브젝트의 참조를 추적하고, 에디터 UI에서 객체의 상태를 실시간으로 업데이트하려고 시도하면서 SerializedProperty 관련 오류가 발생할 수 있습니다. 반면, 빌드된 게임에서는 이런 에디터 관련 프로세스가 실행되지 않으므로 같은 상황에서도 문제가 발생하지 않을 수 있습니다.

그러나:

  • 만약 빌드 후에도 동기화 문제로 인한 버그가 발생할 가능성이 전혀 없지는 않습니다. 빌드된 게임에서 Destroy() 함수 호출 후 오브젝트를 즉시 사용하려 하거나, 메모리 관리가 잘못 처리되면 문제가 될 수 있습니다.
  • 따라서 에디터에서만 발생하는 문제로 보일지라도 코드를 보다 안정적으로 작성하여 모든 상황에서 제대로 동작하도록 하는 것이 좋습니다.

결론

이 오류는 대부분 에디터에서 발생하는 문제일 가능성이 높지만, 완성된 빌드에서도 안정적인 동작을 보장하려면 코드를 수정하는 것이 좋습니다.

 

관련글 더보기