Unity中如何引用最后交互的GameObject?EventSystem方法是否过时?
问题解决方案与解答
一、记录最后点击的GameObject并实现显示/隐藏逻辑
最直接且灵活的方式是自行维护一个全局变量来存储最后被点击的物体,完全自定义逻辑,不会和其他系统冲突。以下是具体实现代码:
给每个需要点击的物体(A、B、C等)挂载如下脚本:
using UnityEngine; using UnityEngine.EventSystems; public class ClickableObject : MonoBehaviour, IPointerClickHandler { // 静态变量存储最后一次点击的物体 private static GameObject _lastClickedObject; public void OnPointerClick(PointerEventData eventData) { // 隐藏上一个点击物体的所有子物体 if (_lastClickedObject != null && _lastClickedObject != gameObject) { ToggleChildrenActive(_lastClickedObject, false); } // 显示当前点击物体的所有子物体 ToggleChildrenActive(gameObject, true); // 更新最后点击的物体记录 _lastClickedObject = gameObject; } // 辅助方法:批量设置子物体的激活状态 private void ToggleChildrenActive(GameObject parent, bool isActive) { foreach (Transform child in parent.transform) { child.gameObject.SetActive(isActive); } } }
这种方案的优势:逻辑独立,不依赖Unity的EventSystem选中机制,避免和UI交互的选中状态(比如按钮导航)产生冲突,完全适配你的场景需求。
二、关于EventSystem.SetSelectedGameObject的疑问
EventSystem.SetSelectedGameObject并未过时,它的核心用途是标记UI系统中的选中元素(比如按钮、输入框、下拉菜单),用于UI导航、提交等交互逻辑。
如果你的可点击物体是UI元素,也可以用它来实现需求,但存在局限性:若场景中有其他UI组件依赖选中状态(比如菜单按钮的高亮),会干扰你的逻辑。对于3D物体的点击场景,更建议使用上面自定义静态变量的方案,逻辑更清晰且无冲突风险。
若一定要用EventSystem的方式,代码示例如下:
using UnityEngine; using UnityEngine.EventSystems; public class ClickableUIObject : MonoBehaviour, IPointerClickHandler { public void OnPointerClick(PointerEventData eventData) { GameObject lastSelected = EventSystem.current.currentSelectedGameObject; if (lastSelected != null && lastSelected != gameObject) { ToggleChildrenActive(lastSelected, false); } ToggleChildrenActive(gameObject, true); EventSystem.current.SetSelectedGameObject(gameObject); } private void ToggleChildrenActive(GameObject parent, bool isActive) { foreach (Transform child in parent.transform) { child.gameObject.SetActive(isActive); } } }
内容的提问来源于stack exchange,提问作者melbel
相关产品推荐
相关产品推荐

