为何触发UnityEngine.UI.Button时EventSystem.currentSelectedGameObject未更新?
问题场景
- 涉及三类核心代码模块:
SelectedManager:负责在currentSelected为空时查找其他可选对象SaveConfig:处理配置数据的保存逻辑BaseSelected:所有可选对象的父类基类
- 触发
_cancel或_confirm按钮时,日志输出currentSelectedGameObject为null,但在EventSystem的调试面板中,该字段明确指向对应的触发按钮
排查方向
日志输出时机偏差
核对日志打印的代码位置:是否在按钮点击事件的执行流程中,currentSelectedGameObject的赋值尚未完成,或是已被后续逻辑清空。比如是否在OnClick事件触发前就打印了日志,或是事件处理中存在异步逻辑,导致日志打印时值还未更新。SelectedManager的逻辑干扰
检查SelectedManager的代码,看是否存在按钮触发时自动重置currentSelected的逻辑。比如在同一帧内,SelectedManager的检测逻辑先于日志执行,将currentSelectedGameObject置空。BaseSelected的状态同步问题
确认BaseSelected类是否维护了独立的选中状态字段,且未与EventSystem的currentSelectedGameObject同步。比如按钮作为BaseSelected的子类实例,其内部状态更新滞后于EventSystem的状态变化。事件执行顺序冲突
在Unity的事件系统中,查看按钮OnClick事件与SelectedManager更新逻辑(如Update/LateUpdate)的执行顺序。如果SelectedManager的逻辑在日志打印之后执行,会导致面板显示最终状态,但日志输出的是中间空值状态。变量引用的同步问题
确认日志打印的是直接获取EventSystem.current.currentSelectedGameObject,还是引用了自定义变量。如果是自定义变量,可能存在未实时同步的情况,比如引用了之前的空值,未及时获取EventSystem的最新状态。
内容的提问来源于stack exchange,提问作者Nolep Skuy

