Расширение компонентов пользовательского интерфейса 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.