U3D 사용자 정의 Inspector 항목에 저장된 이벤트가 트리거되지 않은 솔루션

5030 단어
1. 문제 설명 및 해결 방안
1.1.설명
U3D 편집기 플러그인을 만드는 부분만 시작해야 합니다.
이 문제는 UI 플러그인을 만들 때 Inspector 패널에서 수동으로 값을 수정한 후 U3D 편집기 자체의 수정 이벤트가 트리거되지 않아 저장할 수 없고 취소할 수 없었기 때문입니다.
수정 이벤트가 트리거된 구체적인 표현은 파일 이름의 맨 오른쪽에 별표 '*' 가 있습니다. 현재 대부분의 텍스트 편집기에서 내용 변화도 기본적으로 이와 같습니다.
1.2.솔루션
두 가지 솔루션을 살펴보겠습니다.
(아래에서 수정할 객체는 PlayerControl 유형의 obj 변수입니다.)
public class PlayerControl : MonoBehaviour {
    public int intVal = 0;
    public List<int> listVal = new List<int>();
}

1. UnityEngine의 Undo 클래스, 예를 들어 obj에서 int 유형의 구성원 변수인 intVal 수정:
using UnityEditor;

public class test : Editor {

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        var obj = target as PlayerControl;
        Undo.RecordObject(obj,"obj change");
        obj.intVal = 1;
    }
}

그러나 obj의 구성원 변수가 인용 형식이고 변동할 때 인용이 변하지 않으면 RecordObject가 적용되지 않습니다.예를 들어 List 유형의 변수는 원소를 추가했다. 이 변수는 시작 메모리 주소는 변하지 않았지만 크기가 증가했다. 이 때 두 번째 방법을 사용하거나 대상을 다시 실례화해야 한다.
using System.Collections.Generic;
using UnityEditor;

public class test : Editor {

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        var obj = target as PlayerControl;
        Undo.RecordObject(obj,"obj change");
        // obj.listVal.Add(1); //       Undo
        obj.listVal = new List<int>(obj.listVal);
        obj.listVal.Add(1);
    }
}

2. EditorUtility 클래스의 SetDirty를 사용하여 변경된 객체를 표시합니다.
using UnityEditor;

public class test : Editor {

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        var obj = target as PlayerControl;
        obj.listVal.Add(1);
        EditorUtility.SetDirty(obj);
    }
}

U3D 자체의 취소 시스템이 구체적으로 차량 보존인지, 위의 두 가지 방식이 각각의 좋고 나쁨을 말하기 어렵다.
2. 요약
다른 사람의 물건을 사용할 때(엔진, 라이브러리), 설명 문서와 인터페이스를 많이 보고, 특히 관련 클래스를 돕는 인터페이스(클래스명은 Helper, Tool, Utility 등 어휘 포함)를 포함한다.

좋은 웹페이지 즐겨찾기