유니티
유니티 에러 Assertion failed on expression: '!(o->TestHideFlag(Object::kDontSaveInEditor) && (options & kAllowDontSaveObjectsToBePersistent) == 0)' 해결
12월 01, 2024
Unity 에러 메시지
csharpAssertion failed on expression: '!(o->TestHideFlag(Object::kDontSaveInEditor) && (options & kAllowDontSaveObjectsToBePersistent) == 0)'
이 에러는 Unity가 DontSaveInEditor
플래그가 설정된
오브젝트를 잘못 저장하거나 처리하려고 할 때 발생합니다.
HideFlags
는 Unity 오브젝트의 저장 여부, 표시 여부
등을 제어하는 플래그인데, 이 중 DontSaveInEditor
는
에디터에서 저장되지 않도록 설정하는 플래그입니다.
이 에러는 주로 Editor 스크립트나 도구, 혹은 플러그인에서 잘못된 방식으로 오브젝트를 생성하거나 관리할 때 나타납니다.
에러 원인
-
DontSaveInEditor
플래그의 잘못된 사용-
임시 오브젝트를 만들 때
DontSaveInEditor
플래그를 설정했지만, 이 오브젝트를 적절히 삭제하지 않고 그대로 두었을 가능성이 큽니다. - Unity가 이런 오브젝트를 저장하려고 시도하면 에러가 발생합니다.
-
임시 오브젝트를 만들 때
-
Editor 스크립트 문제
- 커스텀 에디터 도구나 스크립트에서 임시 오브젝트를 생성한 뒤 올바르게 정리(cleanup)하지 않을 경우 발생할 수 있습니다.
-
숨겨진 오브젝트의 잘못된 상태 변경
-
HideFlags
가 설정된 오브젝트(Prefab, ScriptableObject 등)가 Unity의 저장 시스템과 충돌할 수 있습니다.
-
-
서드파티 플러그인 또는 패키지 문제
- 외부 플러그인이나 Unity Asset Store에서 다운로드한 패키지가 문제의 원인일 수 있습니다.
해결 방법
1. 문제가 되는 오브젝트 확인
- 콘솔 메시지에 나오는 스택 트레이스를 확인하여 어떤 스크립트나 오브젝트가 문제인지 확인하세요.
- 스택 트레이스가 불분명하다면, 에디터에서 사용 중인 커스텀 스크립트나 툴을 하나씩 비활성화하면서 문제의 원인을 좁혀나가세요.
2. HideFlags
사용법 점검
-
직접 작성한 스크립트나 사용하는 서드파티 툴에서
HideFlags.DontSaveInEditor
플래그를 사용하는 부분을 점검하세요. - 임시 오브젝트는 사용 후 반드시 삭제해야 합니다.
예를 들어, 아래와 같은 방식으로 임시 오브젝트를 생성하고 정리해야 합니다.
csharpGameObject tempObject = new GameObject("TempObject");
tempObject.hideFlags = HideFlags.DontSaveInEditor | HideFlags.HideAndDontSave;
// 오브젝트 사용 후 반드시 정리
Object.DestroyImmediate(tempObject);
3. Unity 캐시 삭제 (Library 재생성)
- 때로는 Unity의 캐시 데이터가 손상되어 문제가 발생할 수 있습니다.
-
해결 방법:
- Unity를 종료합니다.
-
프로젝트 폴더에서
Library
폴더를 삭제합니다. - Unity를 다시 열어, 에셋을 재임포트합니다.
4. 서드파티 플러그인 또는 패키지 확인
- 외부 플러그인이나 패키지를 사용 중이라면 최신 버전으로 업데이트하세요.
- 해당 플러그인의 개발자 문서나 포럼에서 동일한 문제가 보고되었는지 확인하세요.
5. 디버깅 및 문제 해결
- 스크립트에서 오브젝트가 생성되고 삭제되는 과정을 디버깅 로그로 추적하세요.
-
예를 들어:
csharp
Debug.Log("Temp object created: " + tempObject.name); Debug.Log("Temp object destroyed: " + tempObject.name);
임시 해결 방법
즉각적인 해결이 어렵다면, 오브젝트 생성 로직을 아래와 같이 감싸 문제를 회피할 수 있습니다.
csharp#if UNITY_EDITOR
// 임시 오브젝트 생성 로직
#endif
이 방법은 에디터에서만 실행되도록 제한해 에러를 방지합니다.
요약
-
HideFlags.DontSaveInEditor
를 사용하는 스크립트를 점검하세요. - 생성된 임시 오브젝트는 반드시 삭제하세요.
-
문제가 지속된다면 Unity의
Library
폴더를 삭제하고 캐시를 재생성하세요. - 서드파티 플러그인을 최신 상태로 유지하세요.
댓글 쓰기
0 댓글