fix
This commit is contained in:
parent
418db1838e
commit
c25f3f46d6
@ -38,7 +38,6 @@ public class UXButton : UXSelectable, IButton, IPointerClickHandler, ISubmitHand
|
|||||||
private bool _mTogSelected;
|
private bool _mTogSelected;
|
||||||
private Coroutine _resetRoutine;
|
private Coroutine _resetRoutine;
|
||||||
private Coroutine _deferredDeselectRoutine;
|
private Coroutine _deferredDeselectRoutine;
|
||||||
private Coroutine _deferredLockRoutine; // 新增:用于 Focus 延迟锁定的协程
|
|
||||||
private WaitForSeconds _waitFadeDuration;
|
private WaitForSeconds _waitFadeDuration;
|
||||||
|
|
||||||
// 静态锁(用于 normal 模式点击后的“保持 Selected”并能转移)
|
// 静态锁(用于 normal 模式点击后的“保持 Selected”并能转移)
|
||||||
@ -119,10 +118,6 @@ public class UXButton : UXSelectable, IButton, IPointerClickHandler, ISubmitHand
|
|||||||
{
|
{
|
||||||
if (_resetRoutine != null)
|
if (_resetRoutine != null)
|
||||||
StopCoroutine(_resetRoutine);
|
StopCoroutine(_resetRoutine);
|
||||||
if (_deferredDeselectRoutine != null)
|
|
||||||
StopCoroutine(_deferredDeselectRoutine);
|
|
||||||
if (_deferredLockRoutine != null)
|
|
||||||
StopCoroutine(_deferredLockRoutine);
|
|
||||||
base.OnDestroy();
|
base.OnDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -379,36 +374,15 @@ public class UXButton : UXSelectable, IButton, IPointerClickHandler, ISubmitHand
|
|||||||
// 等一帧,保证 EventSystem 更新 currentSelectedGameObject
|
// 等一帧,保证 EventSystem 更新 currentSelectedGameObject
|
||||||
yield return null;
|
yield return null;
|
||||||
|
|
||||||
// 当前选中对象(可能为 null)
|
bool selectionIsNull = EventSystem.current == null || EventSystem.current.currentSelectedGameObject == null;
|
||||||
var currentSelected = EventSystem.current != null ? EventSystem.current.currentSelectedGameObject : null;
|
|
||||||
|
|
||||||
if (currentSelected == null)
|
if (selectionIsNull)
|
||||||
{
|
{
|
||||||
// 没有任何选中对象:清理锁
|
// 统一走封装入口清理锁
|
||||||
SetLockedButton(null);
|
SetLockedButton(null);
|
||||||
m_IsFocusLocked = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 如果有选中对象,检查它是否属于一个 UXButton(可能是子对象)
|
|
||||||
var selectedBtn = currentSelected.GetComponentInParent<UXButton>();
|
|
||||||
|
|
||||||
if (selectedBtn == null)
|
// 额外保证本实例的本地标志被清掉(以防极端顺序仍然残留)
|
||||||
{
|
m_IsFocusLocked = false;
|
||||||
// 新选中对象不是 UXButton 的组成部分:清理锁
|
|
||||||
SetLockedButton(null);
|
|
||||||
m_IsFocusLocked = false;
|
|
||||||
}
|
|
||||||
else if (selectedBtn != this)
|
|
||||||
{
|
|
||||||
// 新选中对象属于另一个 UXButton:把锁转给那个按钮
|
|
||||||
// (即便目标的 OnSelect 也可能会做这件事,这里直接转能避免时序问题)
|
|
||||||
SetLockedButton(selectedBtn);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// selectedBtn == this:焦点仍然在自己上,不需要清理
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_deferredDeselectRoutine = null;
|
_deferredDeselectRoutine = null;
|
||||||
@ -598,7 +572,6 @@ public class UXButton : UXSelectable, IButton, IPointerClickHandler, ISubmitHand
|
|||||||
if (!IsInteractable())
|
if (!IsInteractable())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// 先发起选中请求
|
|
||||||
if (EventSystem.current != null)
|
if (EventSystem.current != null)
|
||||||
{
|
{
|
||||||
EventSystem.current.SetSelectedGameObject(gameObject, new BaseEventData(EventSystem.current));
|
EventSystem.current.SetSelectedGameObject(gameObject, new BaseEventData(EventSystem.current));
|
||||||
@ -606,32 +579,9 @@ public class UXButton : UXSelectable, IButton, IPointerClickHandler, ISubmitHand
|
|||||||
|
|
||||||
m_IsNavFocused = true;
|
m_IsNavFocused = true;
|
||||||
|
|
||||||
// 停掉已有的延迟锁协程(如果有)
|
if ((s_LockedButton != null && s_LockedButton != this) || s_LockedButton == null)
|
||||||
if (_deferredLockRoutine != null)
|
|
||||||
{
|
|
||||||
StopCoroutine(_deferredLockRoutine);
|
|
||||||
_deferredLockRoutine = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果已经成为 EventSystem 的 selected,则立即锁定;否则延迟一帧再确认并锁定
|
|
||||||
if (IsStillSelected())
|
|
||||||
{
|
{
|
||||||
SetLockedButton(this);
|
SetLockedButton(this);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
_deferredLockRoutine = StartCoroutine(DeferredLockAfterFocus());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private IEnumerator DeferredLockAfterFocus()
|
|
||||||
{
|
|
||||||
// 等一帧,让 EventSystem 完成 selected 的更新和分发(OnDeselect/OnSelect 等)
|
|
||||||
yield return null;
|
|
||||||
|
|
||||||
if (IsStillSelected())
|
|
||||||
SetLockedButton(this);
|
|
||||||
|
|
||||||
_deferredLockRoutine = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user