2014-06-08 3 views
2

사용자 지정 편집기 (EditorWindow 확장)를 만들었습니다. 이 편집기를 사용하면 선택한 객체를 편집 할 수 있습니다.사용자 지정 편집기에서 개체를 편집 한 후 "실행 취소"

문제는 그 내가 CTRL/가 CMD + Z는 아무것도 실시하지 않습니다, 그것은 역사에서 추적 아니에요을 눌러 편집기 패널의 버튼을 누른 후.

사용자 정의 편집기 패널에서 트리거 된 동작을 추적 할 수있는 명령이 있습니까?

답변

3

이렇게 할 수는 있지만 유니티가 스크립트에 의해 수정 된 개체를 자동으로 추적하지 않기 때문에 어떤 개체를 기록할지 편집자에게 알려야합니다. 모든 직렬화 된 속성에 대해 Unity의 실행 취소 시스템에 의존 할 수 있습니다.

단계는 :

  1. 사용 Undo.RecordObject 여기

변형대로

  • 플래그 대상물을 상기 대상물의 serializedproperty
  • 사용 EditorUtility.SetDirty 수정 수정하기 전에 물체를 추적 간단한 예 :

    public class TestWindow : EditorWindow { 
    
        static Transform anObjTransform; 
        void OnGUI() 
        { 
    
         anObjTransform = EditorGUILayout.ObjectField ("selected object", anObjTransform, typeof(Transform), true) as Transform; 
    
         if (anObjTransform != null && GUILayout.Button("MOVE RIGHT")) 
         { 
          Undo.RecordObject(anObjTransform, "move"); 
          anObjTransform.Translate(anObjTransform.right * 10f); 
    
          EditorUtility.SetDirty(anObjTransform); 
         } 
        } 
        [MenuItem ("Test/Test Window")] 
        private static void Init() { 
         EditorWindow.GetWindow<TestWindow>(); 
    
        } 
    } 
    
  • +0

    'static anObjectTransform'을'static string aString'으로,'EditorGUILayout.ObjectField'를'EditorGUILayout.TextField'로 변경하십시오. 이제 어떻게 실행 취소가 작동합니까? – gman

    +0

    @gmam : 게시 된 예제가 약간 잘못된 것임을 알고 있습니다. 실행 취소 시스템은 객체 직렬화에 의존하므로 대개 비 정적 직렬화 가능 필드가 필요합니다. aString이 직렬화 된 클래스의 멤버이면 직렬화 된 속성을 검색 할 수 있습니다. 직렬화되지 않은 클래스 (EditorWindow)의 정적 문자열 필드를 사용하면 어쨌든 실행 취소를 사용하지 않는다고 생각합니다. 저장되지 않을 게임 객체에 첨부 된 구성 요소 안에 필드를 배치하는 것을 고려할 수 있습니다. – Heisenbug

    관련 문제