使用自定义检查器扩展 Unity UI 个组件
Extending Unity UI components with custom Inspector
是否可以扩展新的统一 ui 组件,例如转换组件?因为当我尝试扩展按钮而不是转换组件时没有任何反应
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(Transform))]
public class CustomTransform : Editor
{
public override void OnInspectorGUI()
{
}
}
是的,您可以扩展 UI 组件并为它们编写自己的自定义检查器。
您只需要记住使用正确的命名空间并从正确的 Inspector 继承 class.
你当然也可以覆盖!
这里的示例是 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);
}
}
编辑 class 编辑:
P.S。 ButtonEditor 不同于 UnityEditor.UI.ButtonEditor,因为第一个来自 UnityEngine.ButtonEditor。要从 UnityEditor 访问 .UI,您需要将 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);
}
}
这里还有一个有用的link直接到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的内容稍作修改class。
是否可以扩展新的统一 ui 组件,例如转换组件?因为当我尝试扩展按钮而不是转换组件时没有任何反应
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(Transform))]
public class CustomTransform : Editor
{
public override void OnInspectorGUI()
{
}
}
是的,您可以扩展 UI 组件并为它们编写自己的自定义检查器。 您只需要记住使用正确的命名空间并从正确的 Inspector 继承 class.
你当然也可以覆盖!
这里的示例是 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);
}
}
编辑 class 编辑:
P.S。 ButtonEditor 不同于 UnityEditor.UI.ButtonEditor,因为第一个来自 UnityEngine.ButtonEditor。要从 UnityEditor 访问 .UI,您需要将 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);
}
}
这里还有一个有用的link直接到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的内容稍作修改class。