목록

UnityEditor PrefabSceneMark

Prefab관련 작업중 생긴 문제 해결방안기록

version - unity 2018.3.2f1


—문제발생 - PrefabEditorSceneView에서 해당 Script의 Property수정 시 수정 반영이 안됨

  • Editor속성 값 변경해도 Save마크 활성화가 안됨..
    (변경되었다고 인식을 못함)

-> Prefab변경 사항이 저장이 안되므로 PrefabEditorScene에서 나가면 변경했던 Property가 초기화된다.

prefabscenemark-1

아래 TileShape부분 이미지 교체했는데도 변경사항 인식이 안된다.

prefabscenemark-2


—추측 및 방법강구

기본 제공 property들은 잘되는데 사용자정의 serialize class가 가끔 그런듯? 데이터 변경인식 못하지 왜

배열로 만들어서그런가?? - 나중에 확인 일단

여러가지 시도..

1. 전에 포스트한 EditorUtility.SetDirty(target) 이용 => 문서에도 나와있듯이, 우리가 원하는 PrefabEditorSceneView에서는 안먹힌다.
유니티 도큐먼트 참고
”Unity 5.3 이전에는 더러운 것으로 표시하는 주된 방법이었습니다. 5.3 이후부터 Multi-Scene Editing이 도입됨에 따라이 기능은 더 이상 장면의 오브젝트 수정에 사용되어서는 안됩니다. 대신 개체를 변경하기 전에 Undo.RecordObject 를 사용해야 합니다. 이것은 객체의 Scene을 dirty로 표시하고 편집기에서 undo 항목을 제공합니다. ” 실행 취소 항목이 추가되지 않은 Scene 내의 파일을 수정할 때는 EditorSceneManager.MarkSceneDirty를 사용하십시오 .


2. 위에서 제시된 EditorSceneManager.MarkSceneDirty이용해 강제로 씬을 더럽혀본다.
EndChangeCheck함수 이용해 변경사항 생길 시 MarkSceneDirty강제 호출 코드 작성

// 변경사항 발생시 처리 -> EditorGUI.EndChangeCheck는 이상하게 변경사항 잘 잡음.
 if (EditorGUI.EndChangeCheck())
	UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene());

-> 그냥 EditorScene에서는 더럽혀지지만, PrefabEditorSceneView에서는 안됨


3. 원본 PrefabAsset에 접근해 현재 변경된 Prefqb으로 강제로 데이터 덮어써보자.

// 원본 에셋 path가져오기
string _path = UnityEditor.Experimental.SceneManagement.PrefabStageUtility.GetPrefabStage(pavedStructure.gameObject).prefabAssetPath;
// 원본 에셋 게임오브젝트 접근
GameObject _rootGo = PrefabUtility.LoadPrefabContents(_path);
// 변경사항 세이브되도록
PrefabUtility.SaveAsPrefabAsset(_rootGo, _path);
// 잡아둔 프리팹 언로드
PrefabUtility.UnloadPrefabContents(_rootGo);

-> 안되네, PrefabUtility.LoadPrefabContents는 나중에 prefab인스턴스 생성 안하고 데이터수정할 때 쓰인다고 하므로 알아두자


—해결 - 강제로 PrefabEditorSceneView 더럽히기

  • 생각해보니 추측2번 방법에의 MarkSceneDirty인자를 PrefabEditorSceneView로 가져오면 될거같다.
    (프리팹 씬뷰의 씬을 가져온다 추측2에서는 그냥 에디터상의 씬뷰를 가져와서 안되었던것)
// 다행히 Experimental.SceneManagement.PrefabStageUtility통해 접근가능.
// 현재 Prefab의 씬뷰을 넣어주자.
// 일단, 나는 Apply버튼으로 만들었다.
UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEditor.Experimental.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage().scene);

-> 이제 EndChangeCheck같이 변경사항감지 할 수 있는 함수를 이용해 변경 시 해당 씬뷰를 더럽히면된다.

prefabscenemark-4

프리팹 데이터 수정후 당연히 저장 될줄 알고 나갔는데…
작업해놓은게 저장이 안돼 잃은경우가 가끔 있어 빡쳤었는데 해결되서 다행이다.

prefabscenemark-5

이제 저장 안하고 실수로 나가도 변경사항 저장할 것인지에 대한 팝업도 뜬다.