diff --git a/unity/Assets/UI/PersistentEventSystem.cs b/unity/Assets/UI/PersistentEventSystem.cs
index ac5133d..de9ac28 100644
--- a/unity/Assets/UI/PersistentEventSystem.cs
+++ b/unity/Assets/UI/PersistentEventSystem.cs
@@ -1,36 +1,43 @@
using UnityEngine;
using UnityEngine.EventSystems;
+using UnityEngine.SceneManagement;
namespace GameFramework
{
///
- /// 挂到 MainMenu 场景的 EventSystem 上(或和它同一个空物体上),
- /// 让 EventSystem 通过 DontDestroyOnLoad 跨场景存活。
- /// 这样 Gameplay、Scoring 等场景的按钮都能正常响应点击。
- ///
- /// 修复:当场景重复加载时(如从 Scoring 回到 MainMenu),
- /// 销毁多余的 EventSystem,保证全局只有一个。
+ /// 全局唯一的 EventSystem 管理器。
+ /// 挂到 MainMenu 场景的 EventSystem 上,让它 DontDestroyOnLoad 跨场景存活。
+ /// 每次新场景加载时自动检测并销毁多余的 EventSystem,保证全局只有一个。
///
public class PersistentEventSystem : MonoBehaviour
{
void Awake()
{
- var allSystems = FindObjectsOfType();
+ DontDestroyOnLoad(gameObject);
+ CleanupDuplicates();
- if (allSystems.Length == 0)
+ // 监听场景加载,每次新场景进来都清理一次
+ SceneManager.sceneLoaded += OnSceneLoaded;
+ }
+
+ void OnDestroy()
+ {
+ SceneManager.sceneLoaded -= OnSceneLoaded;
+ }
+
+ void OnSceneLoaded(Scene scene, LoadSceneMode mode)
+ {
+ CleanupDuplicates();
+ }
+
+ void CleanupDuplicates()
+ {
+ var allSystems = FindObjectsOfType();
+ foreach (var es in allSystems)
{
- // 场景里没有 EventSystem —— 创建一个
- var go = new GameObject("EventSystem");
- go.AddComponent();
- go.AddComponent();
- DontDestroyOnLoad(go);
- }
- else
- {
- // 保留第一个 EventSystem,销毁重复的
- DontDestroyOnLoad(allSystems[0].gameObject);
- for (int i = 1; i < allSystems.Length; i++)
- Destroy(allSystems[i].gameObject);
+ // 保留自己,销毁其他 EventSystem
+ if (es.gameObject != gameObject)
+ Destroy(es.gameObject);
}
}
}