Quick answer: You have more than one EventSystem in your scene, usually caused by DontDestroyOnLoad carrying one across scenes while the new scene has its own. Add a singleton guard that destroys duplicates on Awake, or remove the EventSystem from scenes that get loaded additively.
Here is how to fix the multiple EventSystem instances warning in Unity. You load a new scene and suddenly UI buttons stop responding, selections flicker, or the console spams “There are 2 event systems in the scene. Please ensure there is always exactly one event system in the scene.” The UI worked perfectly in the first scene, but something about the scene transition created a duplicate EventSystem that is now competing for input.
The Symptom
The console shows the warning about multiple EventSystem instances. UI elements may stop responding to clicks or may respond intermittently. In some cases, hover states flicker because two EventSystems are both running raycasts and fighting over which element is “selected.” Navigation with keyboard or gamepad may jump between elements unpredictably.
The warning usually appears after a scene transition. The first scene works fine. The moment you load the second scene (either additively or as a replacement), the duplicate appears.
What Causes This
1. DontDestroyOnLoad creates a persistent copy. Your first scene has an EventSystem. A script on it (or on a parent canvas) calls DontDestroyOnLoad. When the second scene loads, it has its own EventSystem in its hierarchy. Now both exist: one in DontDestroyOnLoad, one in the new scene.
2. Additive scene loading. Each additively loaded scene may include its own EventSystem. Unlike single scene loading, additive loading does not remove existing objects. Multiple EventSystems accumulate.
3. Prefab instantiation. A UI prefab that includes an EventSystem (perhaps created from a complete canvas hierarchy) gets instantiated alongside the scene’s existing EventSystem.
The Fix
Option 1: Singleton guard component. Add this component to the EventSystem GameObject in every scene. It ensures only one survives:
using UnityEngine;
using UnityEngine.EventSystems;
public class EventSystemSingleton : MonoBehaviour
{
private static EventSystemSingleton instance;
void Awake()
{
if (instance != null && instance != this)
{
Debug.Log("Destroying duplicate EventSystem");
Destroy(gameObject);
return;
}
instance = this;
DontDestroyOnLoad(gameObject);
}
}
Option 2: Remove EventSystem from additive scenes. If you use additive scene loading, keep the EventSystem only in your base/persistent scene. Remove it from all scenes that get loaded additively. Those scenes will use the existing EventSystem automatically.
Option 3: Runtime cleanup. If you cannot control which scenes have EventSystems (third-party assets, for example), clean up at load time:
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;
public class EventSystemCleaner : MonoBehaviour
{
void OnEnable()
{
SceneManager.sceneLoaded += OnSceneLoaded;
}
void OnDisable()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
}
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
var systems = FindObjectsByType<EventSystem>(FindObjectsSortMode.None);
for (int i = 1; i < systems.Length; i++)
{
Destroy(systems[i].gameObject);
}
}
}
“One EventSystem per application, not per scene. Treat it like a singleton manager — it lives in your persistent root and every scene benefits from it.”
Why This Works
Unity’s EventSystem is designed to be a singleton. It manages input module state, selected GameObject tracking, and raycast results globally. When two exist, they both run their update loops, both cast rays, and both try to manage selection state. The result is unpredictable because the order in which they execute depends on internal Unity scheduling. By ensuring only one exists at all times, you eliminate the race condition and restore deterministic UI behavior.
Related Issues
If your UI stops responding after a scene load even with a single EventSystem, check that the Input Module component (Standalone or InputSystem) is present and configured. See Fix: Unity PlayerInput Component Not Receiving Input for input system configuration.
If DontDestroyOnLoad creates duplicates of other managers too, apply the same singleton pattern to audio managers, game managers, and other persistent objects.
One EventSystem. One. Use a singleton guard and stop chasing ghost input bugs.