editor部分脚本设为私有,避免污染补全上下文。
添加按钮的重写结构
This commit is contained in:
@@ -8,7 +8,7 @@ using Object = UnityEngine.Object;
|
|||||||
namespace XericUIEditor.Core.Vessel
|
namespace XericUIEditor.Core.Vessel
|
||||||
{
|
{
|
||||||
[CustomPropertyDrawer(typeof(ObjectVessel<,>))]
|
[CustomPropertyDrawer(typeof(ObjectVessel<,>))]
|
||||||
public class ObjectVessel2Property : ObjectVesselPropertyBase
|
internal class ObjectVessel2Property : ObjectVesselPropertyBase
|
||||||
{
|
{
|
||||||
private Type property0Type = typeof(Object);
|
private Type property0Type = typeof(Object);
|
||||||
private Type property1Type = typeof(Object);
|
private Type property1Type = typeof(Object);
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ using Object = UnityEngine.Object;
|
|||||||
namespace XericUIEditor.Core.Vessel
|
namespace XericUIEditor.Core.Vessel
|
||||||
{
|
{
|
||||||
[CustomPropertyDrawer(typeof(ObjectVessel<,,>))]
|
[CustomPropertyDrawer(typeof(ObjectVessel<,,>))]
|
||||||
public class ObjectVessel3Property : ObjectVesselPropertyBase
|
internal class ObjectVessel3Property : ObjectVesselPropertyBase
|
||||||
{
|
{
|
||||||
private Type property0Type = typeof(Object);
|
private Type property0Type = typeof(Object);
|
||||||
private Type property1Type = typeof(Object);
|
private Type property1Type = typeof(Object);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using Object = UnityEngine.Object;
|
|||||||
namespace XericUIEditor.Core.Vessel
|
namespace XericUIEditor.Core.Vessel
|
||||||
{
|
{
|
||||||
[CustomPropertyDrawer(typeof(ObjectVessel<>))]
|
[CustomPropertyDrawer(typeof(ObjectVessel<>))]
|
||||||
public class ObjectVesselProperty : ObjectVesselPropertyBase
|
internal class ObjectVesselProperty : ObjectVesselPropertyBase
|
||||||
{
|
{
|
||||||
private Type property0Type = typeof(Object);
|
private Type property0Type = typeof(Object);
|
||||||
private string originTooltip = null;
|
private string originTooltip = null;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using XericUI.Core.Vessel;
|
|||||||
|
|
||||||
namespace XericUIEditor.Core.Vessel
|
namespace XericUIEditor.Core.Vessel
|
||||||
{
|
{
|
||||||
public class ObjectVesselPropertyBase : PropertyDrawer
|
internal class ObjectVesselPropertyBase : PropertyDrawer
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 递归获取实际的泛型类型(处理嵌套情况)
|
/// 递归获取实际的泛型类型(处理嵌套情况)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ namespace XericUIEditor.OverrideLayout
|
|||||||
{
|
{
|
||||||
[CustomEditor(typeof(XericHorizontalOrVerticalLayoutGroup), true)]
|
[CustomEditor(typeof(XericHorizontalOrVerticalLayoutGroup), true)]
|
||||||
[CanEditMultipleObjects]
|
[CanEditMultipleObjects]
|
||||||
public class XericHorizontalOrVerticalLayoutGroupEditor : HorizontalOrVerticalLayoutGroupEditor
|
internal class XericHorizontalOrVerticalLayoutGroupEditor : HorizontalOrVerticalLayoutGroupEditor
|
||||||
{
|
{
|
||||||
SerializedProperty ignoreInvisible;
|
SerializedProperty ignoreInvisible;
|
||||||
SerializedProperty enableListScreening;
|
SerializedProperty enableListScreening;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ namespace XericUIEditor.OverrideLayout
|
|||||||
{
|
{
|
||||||
[CustomEditor(typeof(XericScrollRect), true)]
|
[CustomEditor(typeof(XericScrollRect), true)]
|
||||||
[CanEditMultipleObjects]
|
[CanEditMultipleObjects]
|
||||||
public class XericScrollRectEditor : ScrollRectEditor
|
internal class XericScrollRectEditor : ScrollRectEditor
|
||||||
{
|
{
|
||||||
SerializedProperty m_EnableAutoActiveByMaskVisible;
|
SerializedProperty m_EnableAutoActiveByMaskVisible;
|
||||||
SerializedProperty m_layoutGroup;
|
SerializedProperty m_layoutGroup;
|
||||||
|
|||||||
@@ -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,8 +3,9 @@ using UnityEditor.SceneManagement;
|
|||||||
using UnityEditor.UI;
|
using UnityEditor.UI;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
|
using XericUI;
|
||||||
|
|
||||||
namespace XericUI
|
namespace XericUIEditor.OverrideUI
|
||||||
{
|
{
|
||||||
[CustomEditor(typeof(XericToggle))]
|
[CustomEditor(typeof(XericToggle))]
|
||||||
internal class XericToggleEditor : SelectableEditor
|
internal class XericToggleEditor : SelectableEditor
|
||||||
@@ -68,6 +69,7 @@ namespace XericUI
|
|||||||
|
|
||||||
EditorGUILayout.PropertyField(m_TransitionProperty);
|
EditorGUILayout.PropertyField(m_TransitionProperty);
|
||||||
EditorGUILayout.PropertyField(m_GraphicProperty);
|
EditorGUILayout.PropertyField(m_GraphicProperty);
|
||||||
|
|
||||||
EditorGUILayout.PropertyField(m_TextProperty);
|
EditorGUILayout.PropertyField(m_TextProperty);
|
||||||
EditorGUILayout.PropertyField(m_EnableTextColorTransitionProperty);
|
EditorGUILayout.PropertyField(m_EnableTextColorTransitionProperty);
|
||||||
if (m_EnableTextColorTransitionProperty.boolValue)
|
if (m_EnableTextColorTransitionProperty.boolValue)
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8bdce41790b144b78cce0334f2df1e13
|
||||||
|
timeCreated: 1776645582
|
||||||
@@ -77,6 +77,7 @@ namespace XericUI
|
|||||||
Sprite transitionSprite;
|
Sprite transitionSprite;
|
||||||
string triggerName;
|
string triggerName;
|
||||||
Color textColor;
|
Color textColor;
|
||||||
|
string transitionName;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@@ -85,36 +86,42 @@ namespace XericUI
|
|||||||
textColor = m_textTransitionColorMode.normalColor;
|
textColor = m_textTransitionColorMode.normalColor;
|
||||||
transitionSprite = null;
|
transitionSprite = null;
|
||||||
triggerName = animationTriggers.normalTrigger;
|
triggerName = animationTriggers.normalTrigger;
|
||||||
|
transitionName = m_textTransitionContextMode.normalTrigger;
|
||||||
break;
|
break;
|
||||||
case SelectionState.Highlighted:
|
case SelectionState.Highlighted:
|
||||||
tintColor = colors.highlightedColor;
|
tintColor = colors.highlightedColor;
|
||||||
textColor = m_textTransitionColorMode.highlightedColor;
|
textColor = m_textTransitionColorMode.highlightedColor;
|
||||||
transitionSprite = spriteState.highlightedSprite;
|
transitionSprite = spriteState.highlightedSprite;
|
||||||
triggerName = animationTriggers.highlightedTrigger;
|
triggerName = animationTriggers.highlightedTrigger;
|
||||||
|
transitionName = m_textTransitionContextMode.highlightedTrigger;
|
||||||
break;
|
break;
|
||||||
case SelectionState.Pressed:
|
case SelectionState.Pressed:
|
||||||
tintColor = colors.pressedColor;
|
tintColor = colors.pressedColor;
|
||||||
textColor = m_textTransitionColorMode.pressedColor;
|
textColor = m_textTransitionColorMode.pressedColor;
|
||||||
transitionSprite = spriteState.pressedSprite;
|
transitionSprite = spriteState.pressedSprite;
|
||||||
triggerName = animationTriggers.pressedTrigger;
|
triggerName = animationTriggers.pressedTrigger;
|
||||||
|
transitionName = m_textTransitionContextMode.pressedTrigger;
|
||||||
break;
|
break;
|
||||||
case SelectionState.Selected:
|
case SelectionState.Selected:
|
||||||
tintColor = colors.selectedColor;
|
tintColor = colors.selectedColor;
|
||||||
textColor = m_textTransitionColorMode.selectedColor;
|
textColor = m_textTransitionColorMode.selectedColor;
|
||||||
transitionSprite = spriteState.selectedSprite;
|
transitionSprite = spriteState.selectedSprite;
|
||||||
triggerName = animationTriggers.selectedTrigger;
|
triggerName = animationTriggers.selectedTrigger;
|
||||||
|
transitionName = m_textTransitionContextMode.selectedTrigger;
|
||||||
break;
|
break;
|
||||||
case SelectionState.Disabled:
|
case SelectionState.Disabled:
|
||||||
tintColor = colors.disabledColor;
|
tintColor = colors.disabledColor;
|
||||||
textColor = m_textTransitionColorMode.disabledColor;
|
textColor = m_textTransitionColorMode.disabledColor;
|
||||||
transitionSprite = spriteState.disabledSprite;
|
transitionSprite = spriteState.disabledSprite;
|
||||||
triggerName = animationTriggers.disabledTrigger;
|
triggerName = animationTriggers.disabledTrigger;
|
||||||
|
transitionName = m_textTransitionContextMode.disabledTrigger;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
tintColor = Color.black;
|
tintColor = Color.black;
|
||||||
textColor = Color.black;
|
textColor = Color.white;
|
||||||
transitionSprite = null;
|
transitionSprite = null;
|
||||||
triggerName = string.Empty;
|
triggerName = string.Empty;
|
||||||
|
transitionName = m_textTransitionContextMode.normalTrigger;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,6 +140,8 @@ namespace XericUI
|
|||||||
|
|
||||||
if (m_enableTextColorTransition)
|
if (m_enableTextColorTransition)
|
||||||
TextColor = isOn ? m_textTransitionColorMode.selectedColor : textColor;
|
TextColor = isOn ? m_textTransitionColorMode.selectedColor : textColor;
|
||||||
|
if (m_enableTextContextTransition)
|
||||||
|
TextContent = transitionName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user