Quick answer: One EventSystem global, marked DontDestroyOnLoad. Remove EventSystem GameObjects from additive scenes.

Bootstrap scene + Additive UI scene. Both have an EventSystem. UI works in editor, breaks after additive load.

The Fix

BootstrapScene:
  GameObject EventSystem (with EventSystem + InputSystemUIInputModule)
    DontDestroyOnLoad(this) on Awake

AdditiveScenes:
  Remove EventSystem GameObjects entirely

// Optional bootstrap guard
void Awake() {
    var all = FindObjectsOfType<EventSystem>();
    if (all.Length > 1) {
        foreach (var es in all)
            if (es != this.GetComponent<EventSystem>())
                Destroy(es.gameObject);
    }
}

Single global event system means consistent input routing. DontDestroyOnLoad survives scene transitions.

Verifying

Console clean. UI clicks land consistently across additive scene swaps.

“One EventSystem. UI consistent.”

Related Issues

For UI Graphic Raycaster, see Raycaster. For TMP InputField caret, see TMP caret.

One EventSystem. UI consistent.