[Unity] 사용자 정의 편집기 리치 관리자 사용

17084 단어 UnityC#
Unity는 일반적인 스크립트 외에도 다양한 확장 검사기의 편리한 기능을 제공합니다.
그 중 하나는 '사용자 정의 편집기' 다.
전체 편집기 스크립트여기 되게 소중한 자료가 있어요.에 관해서는 꼭 보십시오.

기본형


맞춤형 편집기의 기본은 이렇다.
(참고로 별말씀이지만 편집기 스크립트는 Editor라는 디렉터리에 저장됩니다(디렉터리의 위치는 임의입니다)
AnyClassNameInspector.cs
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(AnyClassName))]
public class AnyClassNameInspector : Editor
{
    //
}
위에서 말한 바와 같이CustomEditorAttribute를 이용하여 상속Editor류의 반을 창설한다.
이렇게 하면 typeof 에서 교부된 클래스가 검사기에 나타날 때, 이 사용자 정의 편집기 클래스를 적용하여 자유롭게 사용자 정의를 할 수 있습니다.

사용자 정의 검사기 GUI


검사기의 GUI는 다시 쓰기OnInspectorGUI로 사용자 정의할 수 있습니다.
아주 간단한 샘플은 아래와 같습니다.
AnyClassNameInspector.cs
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(AnyClassName))]
public class AnyClassNameInspector : Editor
{
    AnyClassName anyClassName = null;

    void OnEnable()
    {
        // AnyClassNameコンポーネントを取得
        anyClassName = target as anyClassName;
    }

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        EditorGUILayout.LabelField("hoge", anyClassName.anyProperty.ToString());
    }
}
target는 속성을 정의하고 typeof에 지정된 카테고리의 참조를 해당 속성에 전달합니다.
이것을 적절하게 분배한 후에 이 분류의 실례 변수로부터 GUI를 적절하게 반영하여 대략적인 절차가 된다.

EditorGUI 클래스


주로 검사자에 GUI를 표시하는 클래스에 사용됩니다.
검사기를 확장할 때 반드시 배워야 할 과정입니다.
Unity UI를 만들 때 사용하는GUI 클래스의 편집기 버전을 고려하면 이해하기 쉽다고 생각합니다.

Editor GUILyout 등급


근거문서
EditorGUI의 자동 레이아웃 버전
이런 거.

상용품


제작 검사기의 GUI에는 자주 사용하거나 나중에 생각나는 것들이 대충 적혀 있다.
  • EditorGUILayout.ObjectField
    객체를 참조하는 필드입니다.이것은 드래그 앤 드롭으로 등록된 일반 항목입니다.

  • ↑ 이런 느낌.
    EditorGUILayout.ObjectField(null, typeof(Object), false);
    EditorGUILayout.ObjectField(null, typeof(GameObject), false);
    
    // レイアウト情報付き
    var options = new []{ GUILayout.Width(64), GUILayout.Height(64) };
    EditorGUILayout.ObjectField(null, typeof(Texture), false, options);
    
  • EditorGUILayout.LabelField
    이른바 라벨.
  • 위와 조합하면 이런 느낌이에요.
  • EditorGUILayout.HorizontalScope
    수평으로 조를 나누다.가로 및 세로 정렬이 가장 좋은 GUI를 구성할 때는 가로 및 세로 요소 등을 사용합니다.사용 방법은 다음과 같다.
  • using (new EditorGUILayout.HorizontalScope()) {
        EditorGUILayout.LabelField("any label");
        EditorGUILayout.LabelField("some label");
    }
    
    위에서 설명한 대로 사용using 범위에 나열된 GUI 요소는 가로로 배치됩니다.
    위 샘플에 적용하면 이런 느낌입니다.
  • EditorGUILayout.Popup
    이른바 팝업 UI를 구성합니다.
    사용인상은 이런느낌↓
  • public override void OnInspectorGUI()
    {
        int index = 0;
        string[] list = new string[]{ "hoge", "fuga", "foo", "bar" };
        // `selectedIndex`には選択された新しいindexが格納される
        int selectedIndex = EditorGUILayout.Popup(index, list);
    }
    

    선택한 enum 값으로 설정할 수 있는 속성 표시 수정


    가능한 경우 선택된enum의 값에 따라 설정 가능한 속성을 변경하고 싶은 경우가 있습니다.
    이럴 때 사용할 수 있는 설정 방법.
    public enum AnyType
    {
        TypeA,
        TypeB,
        TypeC,
        TypeD,
    }
    
    public class AnyClass : MonoBehaviour
    {
        [SerializeField]
        public AnyType AnyType;
    
        [SerializeField][HideInInspector]
        private string _anyName = "";
    
        [SerializeField][HideInInspector]
        private bool _anyBool = false;
    
        [SerializeField][HideInInspector]
        private Vector3 _anyVector = Vector3.zero;
    
        [SerializeField][HideInInspector]
        private float _anyFloat = 0f;
    
        // ... actual define.
    }
    
    #if UNITY_EDITOR
    [CustomEditor(typeof(AnyClass))]
    public class AnyClassInspector : Editor
    {
        private AnyClass _target;
        private SerializedProperty _anyNameProperty;
        private SerializedProperty _anyBoolProperty;
        private SerializedProperty _anyFloatProperty;
        private SerializedProperty _anyVectorProperty;
    
        private void OnEnable()
        {
            _target = target as AnyClass;
    
            // 各種Propertyを取得する
            _anyNameProperty = serializedObject.FindProperty("_anyName");
            _anyBoolProperty = serializedObject.FindProperty("_anyBool");
            _anyFloatProperty = serializedObject.FindProperty("_anyFloat");
            _anyVectorProperty = serializedObject.FindProperty("_anyVector");
        }
    
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
    
            // シリアライズされたPropertyを更新しておく
            serializedObject.Update();
    
            switch (_target.AnyType)
            {
                case AnyType.TypeA:
                    EditorGUILayout.PropertyField(_anyNameProperty);
                    break;
                case AnyType.TypeB:
                    EditorGUILayout.PropertyField(_anyNameProperty);
                    EditorGUILayout.PropertyField(_anyBoolProperty);
                    break;
                case AnyType.TypeC:
                    EditorGUILayout.PropertyField(_anyNameProperty);
                    EditorGUILayout.PropertyField(_anyFloatProperty);
                    break;
                case AnyType.TypeD:
                    EditorGUILayout.PropertyField(_anyNameProperty);
                    _anyVectorProperty.vector3Value = EditorGUILayout.Vector3Field(_anyVectorProperty.displayName, _anyVectorProperty.vector3Value);
                    break;
            }
    
            // 更新された値を適用する
            serializedObject.ApplyModifiedProperties();
        }
    }
    #end
    

    기억하면 편한 녀석

  • EditorGUIUtility
    1행의 높이, 현재 시야의 크기 등'알고 싶다'는 반을 제공한다.
  • EditorGUI.indentLevel
    EditorGUI의 들여쓰기 수준입니다.
    정수EditorGUI.indentLevel++;면 그 아래 포석에서 축진을 하나 더 넣고, 반대--면 축진 수준이 하나 내려가는 느낌으로 간단하게 사용할 수 있다.
  • 좋은 웹페이지 즐겨찾기