com.alicizax.unity.ui.exten.../Runtime/UXComponent/Selectable/UXSelectable.cs

118 lines
4.3 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using UnityEngine.EventSystems;
namespace UnityEngine.UI
{
[Serializable]
public class TransitionData
{
public Graphic targetGraphic;
public Selectable.Transition transition = Selectable.Transition.ColorTint;
public ColorBlock colors = ColorBlock.defaultColorBlock;
public SpriteState spriteState;
}
public class UXSelectable : Selectable
{
[SerializeField] private List<TransitionData> m_ChildTransitions = new();
2025-12-10 11:16:55 +08:00
void StartChildColorTween(TransitionData transitionData, Color targetColor, bool instant)
{
if (transitionData.targetGraphic == null)
return;
transitionData.targetGraphic.CrossFadeColor(targetColor, instant ? 0f : transitionData.colors.fadeDuration, true, true);
}
void DoChildSpriteSwap(TransitionData transitionData, Sprite newSprite)
{
if (transitionData.targetGraphic == null)
return;
if (transitionData.targetGraphic is Image img)
img.overrideSprite = newSprite;
}
#if UNITY_EDITOR
protected override void OnValidate()
{
if (isActiveAndEnabled)
{
for (int i = 0; i < m_ChildTransitions.Count; i++)
{
DoChildSpriteSwap(m_ChildTransitions[i], null);
StartChildColorTween(m_ChildTransitions[i], Color.white, true);
}
}
base.OnValidate();
}
#endif
protected override void InstantClearState()
{
base.InstantClearState();
for (int i = 0; i < m_ChildTransitions.Count; i++)
{
switch (transition)
{
case Transition.ColorTint:
StartChildColorTween(m_ChildTransitions[i], Color.white, true);
break;
case Transition.SpriteSwap:
DoChildSpriteSwap(m_ChildTransitions[i], null);
break;
}
}
}
protected override void DoStateTransition(SelectionState state, bool instant)
{
base.DoStateTransition(state, instant);
for (int i = 0; i < m_ChildTransitions.Count; i++)
{
TransitionData transitionData = m_ChildTransitions[i];
Color tintColor;
Sprite transitionSprite;
switch (state)
{
case SelectionState.Normal:
tintColor = transitionData.colors.normalColor;
transitionSprite = null;
break;
case SelectionState.Highlighted:
tintColor = transitionData.colors.highlightedColor;
transitionSprite = transitionData.spriteState.highlightedSprite;
break;
case SelectionState.Pressed:
tintColor = transitionData.colors.pressedColor;
transitionSprite = transitionData.spriteState.pressedSprite;
break;
case SelectionState.Selected:
tintColor = transitionData.colors.selectedColor;
transitionSprite = transitionData.spriteState.selectedSprite;
break;
case SelectionState.Disabled:
tintColor = transitionData.colors.disabledColor;
transitionSprite = transitionData.spriteState.disabledSprite;
break;
default:
tintColor = Color.black;
transitionSprite = null;
break;
}
switch (transition)
{
case Transition.ColorTint:
StartChildColorTween(transitionData, tintColor * transitionData.colors.colorMultiplier, instant);
break;
case Transition.SpriteSwap:
DoChildSpriteSwap(transitionData, transitionSprite);
break;
}
}
2025-12-05 19:03:35 +08:00
}
}
}