목록

UnityEditor Setdirty

version - unity 2018.3.2f1


—문제발생 - PlayMode시 참조하고 있던 변수가 실종

  • Create4Triangle 클릭 시 DirectionHandler변수에 생성된 Transform참조하도록 해주도록 Funtion기능 작성했는데

setdirty-2

  • play시 해당 참조 객체 실종되는 어이없는 상황 발생

setdirty-1


—추측 - Editor데이터 reset되는거 같다

  • 해당 변수(Transform)을 SerializeField해서 사용했고, 사용자 class가 아니라 기본제공 property인데 해당 값만 실종.

  • 몇몇 구글링질문에서도 직렬화나 [ExecuteInEditMode]등 사용해보라 해서 했는데 잘 안됨


—해결 - EditorUtility.SetDirty

  • 구글링 폭풍검색중 SetDirty 키워드 발견

EditorUtility.SetDirty() 공식 도큐먼트 내용으로는
target객체를 더러움으로 표시 합니다. (비 장면 객체에만 적합).
참고 : ”Unity 5.3 이전에는 더러운 것으로 표시하는 주된 방법이었습니다.
5.3 이후부터 Multi-Scene Editing이 도입됨에 따라이 기능은 더 이상 장면의 오브젝트 수정에 사용되어서는 안됩니다.
대신 개체를 변경하기 전에 Undo.RecordObject 를 사용해야 합니다.
이것은 객체의 Scene을 dirty로 표시하고 편집기에서 undo 항목을 제공합니다.
” 실행 취소 항목이 추가되지 않은 Scene 내의 파일을 수정할 때는 EditorSceneManager.MarkSceneDirty를 사용하십시오.
또한 SerializedObject.FindProperty , SerializedObject.Update , EditorGUILayout.PropertyField 및 SerializedObject.ApplyModifiedProperties를 사용하십시오.
사용자 정의 편집기를 사용하여 구성 요소 또는 에셋의 일련 화 된 등록 정보를 수정할 때.
수정되면 구성 요소 또는 애셋이 ‘더티’로 표시되고 생성 된 실행 취소 상태가됩니다.
비 장면 객체가 다른 방법으로 수정되고 실행 취소 항목이 추가되지 않으면 나머지 사용 (거의 사용되지 않음)이 발생합니다. 이 방법의 사용은 거의 없습니다.
더티 플래그는 디스크에 저장해야하는 변경된 에셋을 찾기 위해 내부적으로 사용됩니다.

  • 해당 문서 내용인데, 먼 소린지는 자세히 이해는 못했지만 대략 유추해보면 Undo관련 클래스에서 오브젝트 실행 취소등 관리하는데 그게 잘 작동이 안된거 같다.
    (serializedobject는 자동으로 undo기능 생성된다고 어디서 들은거 같긴한데.. 이건 나중에 자세히 찾아보자)

  • Inspector Editor 코드(아까 참조 하도록 만드는 Funtion기능)
    마지막줄에 EditorUtility.SetDirty일단 삽입

setdirty-4

-> 작동 잘된다. 정확한 내부적원인은 뭔지 모르겠지만, 어차피 Editor상태에서만 실행되는 코드이므로.. 일단 이렇게 마무리..


—참고

비슷한 현상겪은 사이트