Unity版本更新后运行时生成重复EventSystem的问题求助
解决Unity升级后EventSystem重复生成及场景切换输入失效问题
解决方案1:全局单例EventSystem(推荐)
- 保留层级面板中原有EventSystem,确认它包含
EventSystem核心组件和对应平台的输入模块(如PC端的Standalone Input Module、移动端的Touch Input Module) - 给该EventSystem挂载以下单例脚本,确保它在场景切换时不被销毁,且全局唯一:
using UnityEngine; using UnityEngine.EventSystems; public class SingletonEventSystem : MonoBehaviour { private static SingletonEventSystem _instance; void Awake() { if (_instance != null && _instance != this) { Destroy(gameObject); return; } _instance = this; DontDestroyOnLoad(gameObject); } }
- 配置完成后,无论切换到哪个场景,都会复用同一个EventSystem,既不会出现重复生成的冲突,也不会在返回初始场景时丢失输入功能。
解决方案2:场景加载时自动检测生成EventSystem
如果需要保留禁用原有EventSystem的操作,可以在全局持久化对象上添加检测脚本,确保每个场景加载后都有可用的EventSystem:
using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.SceneManagement; public class EventSystemAutoGenerator : MonoBehaviour { void Start() { EnsureEventSystemExists(); } void OnSceneLoaded(Scene scene, LoadSceneMode mode) { EnsureEventSystemExists(); } void OnEnable() { SceneManager.sceneLoaded += OnSceneLoaded; } void OnDisable() { SceneManager.sceneLoaded -= OnSceneLoaded; } void EnsureEventSystemExists() { if (FindObjectOfType<EventSystem>() == null) { var eventSystemObj = new GameObject("EventSystem"); eventSystemObj.AddComponent<EventSystem>(); eventSystemObj.AddComponent<StandaloneInputModule>(); // 移动端项目可添加此行: // eventSystemObj.AddComponent<TouchInputModule>(); } } }
- 将此脚本挂在一个设置了
DontDestroyOnLoad的GameObject上(比如全局管理对象),每次场景加载完成后会自动检查并生成缺失的EventSystem。
问题原因说明
Unity 2020及以上版本新增了自动生成EventSystem的逻辑:当场景中检测不到带有有效输入模块的EventSystem时,会自动创建一个。而2019版本无此机制,所以升级后出现了重复生成的情况。禁用原有EventSystem后,切换场景时新场景不会重复生成EventSystem(之前自动生成的实例已随场景销毁),最终导致菜单无法接收输入。
内容的提问来源于stack exchange,提问作者Robin King
相关产品推荐
相关产品推荐

