修改
This commit is contained in:
parent
f74c1b5ada
commit
0e5ea2c357
@ -19,12 +19,15 @@ namespace UnityEngine.UI
|
||||
#endif
|
||||
{
|
||||
[Serializable]
|
||||
public class ToggleEvent : UnityEvent<bool> { }
|
||||
public class ToggleEvent : UnityEvent<bool>
|
||||
{
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user