Расширение компонентов пользовательского интерфейса Unity с помощью специального инспектора

Можно ли расширить новые компоненты Uni UI, такие как, например, компонент преобразования? Потому что ничего не происходит, когда я пытаюсь расширить кнопку вместо компонента преобразования

using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(Transform))]
public class CustomTransform : Editor
{
    public override void OnInspectorGUI()
    {            
    }
}

2 ответа

Решение

Да, вы можете расширить компоненты пользовательского интерфейса и написать их собственный инспектор. Вам просто нужно помнить, чтобы использовать правильные пространства имен, а также наследовать от правильного класса Inspector.

Вы можете, конечно, переопределить тоже!.

Примером здесь является UISegmentedControlButton

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;

public class UISegmentedControlButton : Button {

public Sprite offSprite;
public Sprite onSprite;
public Color offTextColor = Color.white;
public Color onTextColor = Color.white;

private bool isSelected;
public bool IsSelected {
    get {
        return isSelected;
    }
    set {
        isSelected = value;

        Text text = this.transform.GetComponentInChildren<Text>();

        if (value) {
            this.GetComponent<Image>().sprite = onSprite;
            text.color = onTextColor;
        } else {
            this.GetComponent<Image>().sprite = offSprite;
            text.color = offTextColor;
        }
    }
}




public override void OnPointerClick(PointerEventData eventData) {

    this.transform.parent.GetComponent<UISegmentedControl>().SelectSegment(this);
    base.OnPointerClick(eventData);
}

}

И редактор класса для него:

PS ButtonEditor отличается от UnityEditor.UI.ButtonEditor, поскольку первый из них - от UnityEngine.ButtonEditor. Чтобы получить доступ к.UI из UnityEditor, вам нужно поместить ваш скрипт Editor в папку Editor.

using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using System.Collections;

[CustomEditor(typeof(UISegmentedControlButton))]
public class UISegmentedControlButtonEditor : UnityEditor.UI.ButtonEditor {


public override void OnInspectorGUI() {

    UISegmentedControlButton component = (UISegmentedControlButton)target;

    base.OnInspectorGUI();

    component.onSprite = (Sprite)EditorGUILayout.ObjectField("On Sprite", component.onSprite, typeof(Sprite), true);
    component.onTextColor = EditorGUILayout.ColorField("On text colour", component.onTextColor);
    component.offSprite = (Sprite)EditorGUILayout.ObjectField("Off Sprite", component.offSprite, typeof(Sprite), true);
    component.offTextColor = EditorGUILayout.ColorField("Off text colour", component.offTextColor);

}
}

Также здесь есть полезная ссылка непосредственно на источник Unity UI

https://bitbucket.org/Unity-Technologies/ui/src

И небольшое доказательство того, что это работает:

Пробовал приведенный выше пример, но EditorGUILayout.ObjectField становится пустым, когда я выхожу из префаба, в который я поместил свой объект.

Однако этот метод работает без обнуления поля.

      using Game.Ui.Views.DialoguePanel;
using UnityEditor;
using UnityEditor.UI;

namespace Editor
{
    [CustomEditor(typeof(MyButtonExtension))]
    public class MyButtonExtensionDrawer : ButtonEditor
    {
        SerializedProperty m_testObject;
        
        protected override void OnEnable()
        {
            base.OnEnable();
            m_testObject = serializedObject.FindProperty("testObject");
        }
        
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            EditorGUILayout.Space();
            
            serializedObject.Update();
            EditorGUILayout.PropertyField(m_testObject);
            serializedObject.ApplyModifiedProperties();
        }
    }
}

По сути, это всего лишь немного измененное содержимое класса ButtonEditor.

Другие вопросы по тегам