diff --git a/Runtime/UXComponent/Group/UXToggle.cs b/Runtime/UXComponent/Group/UXToggle.cs index 3bc60fe..0a5bf96 100644 --- a/Runtime/UXComponent/Group/UXToggle.cs +++ b/Runtime/UXComponent/Group/UXToggle.cs @@ -19,12 +19,15 @@ namespace UnityEngine.UI #endif { [Serializable] - public class ToggleEvent : UnityEvent { } + public class ToggleEvent : UnityEvent + { + } public Toggle.ToggleTransition toggleTransition = Toggle.ToggleTransition.Fade; public Graphic graphic; [SerializeField] private UXGroup m_Group; + public UXGroup group { get { return m_Group; } @@ -37,10 +40,12 @@ namespace UnityEngine.UI public ToggleEvent onValueChanged = new ToggleEvent(); - [Tooltip("Is the toggle currently on or off?")] - [SerializeField] private bool m_IsOn; + [Tooltip("Is the toggle currently on or off?")] [SerializeField] + private bool m_IsOn; - protected UXToggle() { } + protected UXToggle() + { + } #if UNITY_EDITOR protected override void OnValidate() @@ -60,8 +65,13 @@ namespace UnityEngine.UI #endif } - public virtual void LayoutComplete() { } - public virtual void GraphicUpdateComplete() { } + public virtual void LayoutComplete() + { + } + + public virtual void GraphicUpdateComplete() + { + } protected override void OnDestroy() { @@ -147,6 +157,25 @@ namespace UnityEngine.UI Set(value, false); } +// 在 UXToggle 类内(建议放在类底部较靠近 Set 和 PlayEffect 的位置)加入: + +// 覆盖 DoStateTransition,保证 isOn 时视觉上总是 Selected(除非 Disabled) + protected override void DoStateTransition(Selectable.SelectionState state, bool instant) + { + // 如果被禁用,照常显示 Disabled + if (state == Selectable.SelectionState.Disabled) + { + base.DoStateTransition(state, instant); + return; + } + + // 当 isOn 为 true 时,总是以 Selected 的样式渲染(但不改变 EventSystem 的真实 selection) + if (m_IsOn) + state = Selectable.SelectionState.Selected; + + base.DoStateTransition(state, instant); + } + void Set(bool value, bool sendCallback = true) { if (m_IsOn == value) @@ -163,13 +192,23 @@ namespace UnityEngine.UI } PlayEffect(toggleTransition == Toggle.ToggleTransition.None); + if (sendCallback) { UISystemProfilerApi.AddMarker("Toggle.value", this); onValueChanged.Invoke(m_IsOn); } + + // 触发选择态视觉刷新(当 isOn 为 true 显示 Selected,false 时回到 normal/hover/... 的计算结果) + // instant 参数:如果 ToggleTransition 是 None 我们使用 instant,为保持和原来 PlayEffect 一致。 + bool instant = (toggleTransition == Toggle.ToggleTransition.None); + // 传入的 state:当 isOn 为 true,DoStateTransition 会将其替换为 Selected; + // 当 isOn 为 false,使用 currentSelectionState 以让正常的鼠标/键盘状态生效。 + var stateToApply = m_IsOn ? Selectable.SelectionState.Selected : currentSelectionState; + DoStateTransition(stateToApply, instant); } + private void PlayEffect(bool instant) { if (graphic == null) @@ -183,6 +222,7 @@ namespace UnityEngine.UI graphic.CrossFadeAlpha(m_IsOn ? 1f : 0f, instant ? 0f : 0.1f, true); } + protected override void Start() { PlayEffect(true);