editor部分脚本设为私有,避免污染补全上下文。

添加按钮的重写结构
This commit is contained in:
2026-04-21 14:28:37 +08:00
parent eb7bdfccc3
commit 2c5bee8677
12 changed files with 291 additions and 8 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ using Object = UnityEngine.Object;
namespace XericUIEditor.Core.Vessel
{
[CustomPropertyDrawer(typeof(ObjectVessel<,>))]
public class ObjectVessel2Property : ObjectVesselPropertyBase
internal class ObjectVessel2Property : ObjectVesselPropertyBase
{
private Type property0Type = typeof(Object);
private Type property1Type = typeof(Object);
+1 -1
View File
@@ -8,7 +8,7 @@ using Object = UnityEngine.Object;
namespace XericUIEditor.Core.Vessel
{
[CustomPropertyDrawer(typeof(ObjectVessel<,,>))]
public class ObjectVessel3Property : ObjectVesselPropertyBase
internal class ObjectVessel3Property : ObjectVesselPropertyBase
{
private Type property0Type = typeof(Object);
private Type property1Type = typeof(Object);
+1 -1
View File
@@ -7,7 +7,7 @@ using Object = UnityEngine.Object;
namespace XericUIEditor.Core.Vessel
{
[CustomPropertyDrawer(typeof(ObjectVessel<>))]
public class ObjectVesselProperty : ObjectVesselPropertyBase
internal class ObjectVesselProperty : ObjectVesselPropertyBase
{
private Type property0Type = typeof(Object);
private string originTooltip = null;
@@ -5,7 +5,7 @@ using XericUI.Core.Vessel;
namespace XericUIEditor.Core.Vessel
{
public class ObjectVesselPropertyBase : PropertyDrawer
internal class ObjectVesselPropertyBase : PropertyDrawer
{
/// <summary>
/// 递归获取实际的泛型类型(处理嵌套情况)
@@ -7,7 +7,7 @@ namespace XericUIEditor.OverrideLayout
{
[CustomEditor(typeof(XericHorizontalOrVerticalLayoutGroup), true)]
[CanEditMultipleObjects]
public class XericHorizontalOrVerticalLayoutGroupEditor : HorizontalOrVerticalLayoutGroupEditor
internal class XericHorizontalOrVerticalLayoutGroupEditor : HorizontalOrVerticalLayoutGroupEditor
{
SerializedProperty ignoreInvisible;
SerializedProperty enableListScreening;
@@ -7,7 +7,7 @@ namespace XericUIEditor.OverrideLayout
{
[CustomEditor(typeof(XericScrollRect), true)]
[CanEditMultipleObjects]
public class XericScrollRectEditor : ScrollRectEditor
internal class XericScrollRectEditor : ScrollRectEditor
{
SerializedProperty m_EnableAutoActiveByMaskVisible;
SerializedProperty m_layoutGroup;
+62
View File
@@ -0,0 +1,62 @@
using UnityEditor;
using UnityEditor.UI;
using XericUI.OverrideUI;
namespace XericUIEditor.OverrideUI
{
[CustomEditor(typeof(XericButton), true)]
[CanEditMultipleObjects]
/// <summary>
/// Custom Editor for the Button Component.
/// Extend this class to write a custom editor for a component derived from Button.
/// </summary>
internal class XericButtonEditor : SelectableEditor
{
SerializedProperty m_OnClickProperty;
SerializedProperty m_TextProperty;
SerializedProperty m_EnableTextColorTransitionProperty;
SerializedProperty m_TextTransitionColorModeProperty;
SerializedProperty m_enableTextContextTransitionProperty;
SerializedProperty m_textTransitionContextModeProperty;
protected override void OnEnable()
{
base.OnEnable();
m_OnClickProperty = serializedObject.FindProperty("m_OnClick");
m_TextProperty = serializedObject.FindProperty("m_text");
m_EnableTextColorTransitionProperty = serializedObject.FindProperty("m_enableTextColorTransition");
m_TextTransitionColorModeProperty = serializedObject.FindProperty("m_textTransitionColorMode");
m_enableTextContextTransitionProperty = serializedObject.FindProperty("m_enableTextContextTransition");
m_textTransitionContextModeProperty = serializedObject.FindProperty("m_textTransitionContextMode");
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
EditorGUILayout.Space();
serializedObject.Update();
EditorGUILayout.PropertyField(m_TextProperty);
EditorGUILayout.PropertyField(m_EnableTextColorTransitionProperty);
if (m_EnableTextColorTransitionProperty.boolValue)
{
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(m_TextTransitionColorModeProperty);
EditorGUI.indentLevel--;
}
EditorGUILayout.PropertyField(m_enableTextContextTransitionProperty);
if (m_enableTextContextTransitionProperty.boolValue)
{
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(m_textTransitionContextModeProperty);
EditorGUI.indentLevel--;
}
EditorGUILayout.PropertyField(m_OnClickProperty);
serializedObject.ApplyModifiedProperties();
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 00e32f6988bf41f29169c1660bcf009f
timeCreated: 1776646534
+3 -1
View File
@@ -3,8 +3,9 @@ using UnityEditor.SceneManagement;
using UnityEditor.UI;
using UnityEngine;
using UnityEngine.UI;
using XericUI;
namespace XericUI
namespace XericUIEditor.OverrideUI
{
[CustomEditor(typeof(XericToggle))]
internal class XericToggleEditor : SelectableEditor
@@ -68,6 +69,7 @@ namespace XericUI
EditorGUILayout.PropertyField(m_TransitionProperty);
EditorGUILayout.PropertyField(m_GraphicProperty);
EditorGUILayout.PropertyField(m_TextProperty);
EditorGUILayout.PropertyField(m_EnableTextColorTransitionProperty);
if (m_EnableTextColorTransitionProperty.boolValue)
+204
View File
@@ -0,0 +1,204 @@
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using XericUI.Helper;
namespace XericUI.OverrideUI
{
public class XericButton : Button
{
#if dUI_TextMeshPro
public TMP_Text m_text;
public string TextContent
{
get => m_text != null ? m_text.text ?? string.Empty : string.Empty;
set { if(m_text) m_text.text = value; }
}
public Color TextColor
{
get => m_text != null ? m_text.color : Color.black;
set { if(m_text) m_text.color = value; }
}
#else
public Text m_text;
public string TextContent
{
get => m_text.text;
set => m_text.text = value;
}
public Color TextColor
{
get => m_text.color;
set => m_text.color = value;
}
#endif
public bool m_enableTextColorTransition = true;
public ColorBlock m_textTransitionColorMode = ColorBlock.defaultColorBlock;
public bool m_enableTextContextTransition = false;
public AnimationTriggers m_textTransitionContextMode = new AnimationTriggers()
{
normalTrigger = "button_normal",
highlightedTrigger = "button_highlight",
pressedTrigger = "button_pressed",
selectedTrigger = "button_selected",
disabledTrigger = "button_disabled",
};
public ColorBlock TextTransitionColorMode
{
get => m_textTransitionColorMode;
set => m_textTransitionColorMode = value;
}
protected override void DoStateTransition(SelectionState state, bool instant)
{
if (!gameObject.activeInHierarchy)
return;
Color tintColor;
Sprite transitionSprite;
string triggerName;
Color textColor;
string transitionName;
switch (state)
{
case SelectionState.Normal:
tintColor = colors.normalColor;
textColor = m_textTransitionColorMode.normalColor;
transitionSprite = null;
triggerName = animationTriggers.normalTrigger;
transitionName = m_textTransitionContextMode.normalTrigger;
break;
case SelectionState.Highlighted:
tintColor = colors.highlightedColor;
textColor = m_textTransitionColorMode.highlightedColor;
transitionSprite = spriteState.highlightedSprite;
triggerName = animationTriggers.highlightedTrigger;
transitionName = m_textTransitionContextMode.highlightedTrigger;
break;
case SelectionState.Pressed:
tintColor = colors.pressedColor;
textColor = m_textTransitionColorMode.pressedColor;
transitionSprite = spriteState.pressedSprite;
triggerName = animationTriggers.pressedTrigger;
transitionName = m_textTransitionContextMode.pressedTrigger;
break;
case SelectionState.Selected:
tintColor = colors.selectedColor;
textColor = m_textTransitionColorMode.selectedColor;
transitionSprite = spriteState.selectedSprite;
triggerName = animationTriggers.selectedTrigger;
transitionName = m_textTransitionContextMode.selectedTrigger;
break;
case SelectionState.Disabled:
tintColor = colors.disabledColor;
textColor = m_textTransitionColorMode.disabledColor;
transitionSprite = spriteState.disabledSprite;
triggerName = animationTriggers.disabledTrigger;
transitionName = m_textTransitionContextMode.disabledTrigger;
break;
default:
tintColor = Color.black;
textColor = Color.white;
transitionSprite = null;
triggerName = string.Empty;
transitionName = m_textTransitionContextMode.normalTrigger;
break;
}
switch (transition)
{
case Transition.ColorTint:
StartColorTween(tintColor * colors.colorMultiplier, instant);
break;
case Transition.SpriteSwap:
DoSpriteSwap(transitionSprite);
break;
case Transition.Animation:
TriggerAnimation(triggerName);
break;
}
if (m_enableTextColorTransition)
TextColor = textColor;
if (m_enableTextContextTransition)
TextContent = transitionName;
}
void StartColorTween(Color targetColor, bool instant)
{
if (targetGraphic == null)
return;
targetGraphic.CrossFadeColor(targetColor, instant ? 0f : colors.fadeDuration, true, true);
}
void DoSpriteSwap(Sprite newSprite)
{
if (image == null)
return;
image.overrideSprite = newSprite;
}
void TriggerAnimation(string triggername)
{
#if PACKAGE_ANIMATION
if (transition != Transition.Animation || animator == null || !animator.isActiveAndEnabled || !animator.hasBoundPlayables || string.IsNullOrEmpty(triggername))
return;
animator.ResetTrigger(animationTriggers.normalTrigger);
animator.ResetTrigger(animationTriggers.highlightedTrigger);
animator.ResetTrigger(animationTriggers.pressedTrigger);
animator.ResetTrigger(animationTriggers.selectedTrigger);
animator.ResetTrigger(animationTriggers.disabledTrigger);
animator.SetTrigger(triggername);
#endif
}
#region 组件替换
#if UNITY_EDITOR
[UnityEditor.MenuItem("CONTEXT/Button/Replace To XericButton", true)]
private static bool ValidateReplaceToXeric(UnityEditor.MenuCommand command)
=> command.context is Button and not XericButton;
[UnityEditor.MenuItem("CONTEXT/Button/Replace To XericButton", false, 10)]
private static void ReplaceToXeric(UnityEditor.MenuCommand command)
=> command.ReplaceCommandContext<Button, XericButton,
(Graphic targetGraphic, ButtonClickedEvent onClick)>(
o =>
(o.targetGraphic, o.onClick),
(t, d) =>
{
t.targetGraphic = d.targetGraphic;
t.onClick = d.onClick;
});
[UnityEditor.MenuItem("CONTEXT/Button/Replace To Button", true)]
private static bool ValidateReplaceToUnity(UnityEditor.MenuCommand command)
=> command.context is XericButton;
[UnityEditor.MenuItem("CONTEXT/Button/Replace To Button", false, 10)]
private static void ReplaceToUnity(UnityEditor.MenuCommand command)
=> command.ReplaceCommandContext<XericButton, Button,
(Graphic targetGraphic, ButtonClickedEvent onClick)>(
o =>
(o.targetGraphic, o.onClick),
(t, d) =>
{
t.targetGraphic = d.targetGraphic;
t.onClick = d.onClick;
});
#endif
#endregion
}
}
+3
View File
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8bdce41790b144b78cce0334f2df1e13
timeCreated: 1776645582
+10 -1
View File
@@ -77,6 +77,7 @@ namespace XericUI
Sprite transitionSprite;
string triggerName;
Color textColor;
string transitionName;
switch (state)
{
@@ -85,36 +86,42 @@ namespace XericUI
textColor = m_textTransitionColorMode.normalColor;
transitionSprite = null;
triggerName = animationTriggers.normalTrigger;
transitionName = m_textTransitionContextMode.normalTrigger;
break;
case SelectionState.Highlighted:
tintColor = colors.highlightedColor;
textColor = m_textTransitionColorMode.highlightedColor;
transitionSprite = spriteState.highlightedSprite;
triggerName = animationTriggers.highlightedTrigger;
transitionName = m_textTransitionContextMode.highlightedTrigger;
break;
case SelectionState.Pressed:
tintColor = colors.pressedColor;
textColor = m_textTransitionColorMode.pressedColor;
transitionSprite = spriteState.pressedSprite;
triggerName = animationTriggers.pressedTrigger;
transitionName = m_textTransitionContextMode.pressedTrigger;
break;
case SelectionState.Selected:
tintColor = colors.selectedColor;
textColor = m_textTransitionColorMode.selectedColor;
transitionSprite = spriteState.selectedSprite;
triggerName = animationTriggers.selectedTrigger;
transitionName = m_textTransitionContextMode.selectedTrigger;
break;
case SelectionState.Disabled:
tintColor = colors.disabledColor;
textColor = m_textTransitionColorMode.disabledColor;
transitionSprite = spriteState.disabledSprite;
triggerName = animationTriggers.disabledTrigger;
transitionName = m_textTransitionContextMode.disabledTrigger;
break;
default:
tintColor = Color.black;
textColor = Color.black;
textColor = Color.white;
transitionSprite = null;
triggerName = string.Empty;
transitionName = m_textTransitionContextMode.normalTrigger;
break;
}
@@ -133,6 +140,8 @@ namespace XericUI
if (m_enableTextColorTransition)
TextColor = isOn ? m_textTransitionColorMode.selectedColor : textColor;
if (m_enableTextContextTransition)
TextContent = transitionName;
}