유니티 에러 Assertion failed on expression: '!(o->TestHideFlag(Object::kDontSaveInEditor) && (options & kAllowDontSaveObjectsToBePersistent) == 0)' 해결

Unity 에러 메시지

csharp
Assertion failed on expression: '!(o->TestHideFlag(Object::kDontSaveInEditor) && (options & kAllowDontSaveObjectsToBePersistent) == 0)'

이 에러는 Unity가 DontSaveInEditor 플래그가 설정된 오브젝트를 잘못 저장하거나 처리하려고 할 때 발생합니다. HideFlags는 Unity 오브젝트의 저장 여부, 표시 여부 등을 제어하는 플래그인데, 이 중 DontSaveInEditor는 에디터에서 저장되지 않도록 설정하는 플래그입니다.

이 에러는 주로 Editor 스크립트나 도구, 혹은 플러그인에서 잘못된 방식으로 오브젝트를 생성하거나 관리할 때 나타납니다.

유니티 오류메세지 Assertion failed on expression:


에러 원인

  1. DontSaveInEditor 플래그의 잘못된 사용

    • 임시 오브젝트를 만들 때 DontSaveInEditor 플래그를 설정했지만, 이 오브젝트를 적절히 삭제하지 않고 그대로 두었을 가능성이 큽니다.
    • Unity가 이런 오브젝트를 저장하려고 시도하면 에러가 발생합니다.
  2. Editor 스크립트 문제

    • 커스텀 에디터 도구나 스크립트에서 임시 오브젝트를 생성한 뒤 올바르게 정리(cleanup)하지 않을 경우 발생할 수 있습니다.
  3. 숨겨진 오브젝트의 잘못된 상태 변경

    • HideFlags가 설정된 오브젝트(Prefab, ScriptableObject 등)가 Unity의 저장 시스템과 충돌할 수 있습니다.
  4. 서드파티 플러그인 또는 패키지 문제

    • 외부 플러그인이나 Unity Asset Store에서 다운로드한 패키지가 문제의 원인일 수 있습니다.

해결 방법

1. 문제가 되는 오브젝트 확인

  • 콘솔 메시지에 나오는 스택 트레이스를 확인하여 어떤 스크립트나 오브젝트가 문제인지 확인하세요.
  • 스택 트레이스가 불분명하다면, 에디터에서 사용 중인 커스텀 스크립트나 툴을 하나씩 비활성화하면서 문제의 원인을 좁혀나가세요.

2. HideFlags 사용법 점검

  • 직접 작성한 스크립트나 사용하는 서드파티 툴에서 HideFlags.DontSaveInEditor 플래그를 사용하는 부분을 점검하세요.
  • 임시 오브젝트는 사용 후 반드시 삭제해야 합니다.

예를 들어, 아래와 같은 방식으로 임시 오브젝트를 생성하고 정리해야 합니다.

csharp
GameObject tempObject = new GameObject("TempObject"); tempObject.hideFlags = HideFlags.DontSaveInEditor | HideFlags.HideAndDontSave; // 오브젝트 사용 후 반드시 정리 Object.DestroyImmediate(tempObject);

3. Unity 캐시 삭제 (Library 재생성)

  • 때로는 Unity의 캐시 데이터가 손상되어 문제가 발생할 수 있습니다.
  • 해결 방법:
    1. Unity를 종료합니다.
    2. 프로젝트 폴더에서 Library 폴더를 삭제합니다.
    3. Unity를 다시 열어, 에셋을 재임포트합니다.

4. 서드파티 플러그인 또는 패키지 확인

  • 외부 플러그인이나 패키지를 사용 중이라면 최신 버전으로 업데이트하세요.
  • 해당 플러그인의 개발자 문서나 포럼에서 동일한 문제가 보고되었는지 확인하세요.

5. 디버깅 및 문제 해결

  • 스크립트에서 오브젝트가 생성되고 삭제되는 과정을 디버깅 로그로 추적하세요.
  • 예를 들어:
    csharp
    Debug.Log("Temp object created: " + tempObject.name); Debug.Log("Temp object destroyed: " + tempObject.name);

임시 해결 방법

즉각적인 해결이 어렵다면, 오브젝트 생성 로직을 아래와 같이 감싸 문제를 회피할 수 있습니다.

csharp
#if UNITY_EDITOR // 임시 오브젝트 생성 로직 #endif

이 방법은 에디터에서만 실행되도록 제한해 에러를 방지합니다.


요약

  1. HideFlags.DontSaveInEditor를 사용하는 스크립트를 점검하세요.
  2. 생성된 임시 오브젝트는 반드시 삭제하세요.
  3. 문제가 지속된다면 Unity의 Library 폴더를 삭제하고 캐시를 재생성하세요.
  4. 서드파티 플러그인을 최신 상태로 유지하세요.


댓글 쓰기

0 댓글