From 801252f2e1e667a89c93bb9cb91a078b619ff432 Mon Sep 17 00:00:00 2001 From: Hari Chandra Annem Date: Tue, 5 Aug 2025 21:32:11 +0530 Subject: [PATCH 1/4] Added test for UI navigation when localMultiPlayerRoot is set null. Added a new test to verify UI navigation and submit actions using a gamepad when the event system's playerRoot (localMultiPlayerRoot) is set and when it is null. Ensures navigation and submit functionality work correctly in both scenarios. --- Assets/Tests/InputSystem/Plugins/UITests.cs | 75 +++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/Assets/Tests/InputSystem/Plugins/UITests.cs b/Assets/Tests/InputSystem/Plugins/UITests.cs index 288ecfd75a..d5f3c72514 100644 --- a/Assets/Tests/InputSystem/Plugins/UITests.cs +++ b/Assets/Tests/InputSystem/Plugins/UITests.cs @@ -2764,6 +2764,81 @@ public void UI_ClickDraggingMouseDoesNotAllocateGCMemory() }, Is.Not.AllocatingGCMemory()); } + [UnityTest] + [Category("UI")] + public IEnumerator UI_CanNavigateUI_WithLocalMultiPlayerRoot_Null_UsingGamepads() + { + // Setup navigation + var gamepad = InputSystem.AddDevice(); + var scene = CreateTestUI(makeSelectable: true); + + // Create actions for navigation + var asset = ScriptableObject.CreateInstance(); + var map = asset.AddActionMap("map"); + var moveAction = map.AddAction("move", type: InputActionType.Value, binding: "/leftStick"); + var submitAction = map.AddAction("submit", type: InputActionType.Button, binding: "/buttonSouth"); + + // Assign actions to the UI module + scene.uiModule.move = InputActionReference.Create(moveAction); + scene.uiModule.submit = InputActionReference.Create(submitAction); + map.Enable(); + + // Test 1: Assign localMultiPlayerRoot to a value + scene.eventSystem.playerRoot = scene.parentGameObject; + + // Initial selection + scene.eventSystem.SetSelectedGameObject(scene.leftGameObject); + yield return null; + + // Move right + Set(gamepad.leftStick, new Vector2(1, 0)); + yield return null; + + Assert.That(scene.eventSystem.currentSelectedGameObject, Is.SameAs(scene.rightGameObject),"Right navigation did not work when localMultiPlayerRoot was set"); + + // Move left + Set(gamepad.leftStick, Vector2.zero); + yield return null; + Set(gamepad.leftStick, new Vector2(-1, 0)); + yield return null; + + Assert.That(scene.eventSystem.currentSelectedGameObject, Is.SameAs(scene.leftGameObject),"Left navigation did not work when localMultiPlayerRoot was set"); + + // Reset stick position + Set(gamepad.leftStick, Vector2.zero); + yield return null; + + // Test 2: With localMultiPlayerRoot set to null + scene.eventSystem.playerRoot = null; + + // Reset selection + scene.eventSystem.SetSelectedGameObject(scene.leftGameObject); + yield return null; + + // Move right + Set(gamepad.leftStick, new Vector2(1, 0)); + yield return null; + + Assert.That(scene.eventSystem.currentSelectedGameObject, Is.SameAs(scene.rightGameObject),"Right navigation did not work when localMultiPlayerRoot was null"); + + // Move left + Set(gamepad.leftStick, Vector2.zero); + yield return null; + Set(gamepad.leftStick, new Vector2(-1, 0)); + yield return null; + + Assert.That(scene.eventSystem.currentSelectedGameObject, Is.SameAs(scene.leftGameObject),"Left navigation did not work when localMultiPlayerRoot was null"); + + // Submit + PressAndRelease(gamepad.buttonSouth); + yield return null; + + Assert.That(scene.leftChildReceiver.events, Has.Exactly(1).With.Property("type").EqualTo(EventType.Submit),"Submit event was not received when localMultiPlayerRoot was null"); + + // Checking that localMultiPlayerRoot is null + Assert.AreEqual(null, scene.uiModule.localMultiPlayerRoot); + } + [UnityTest] [Category("UI")] // Check that two players can have separate UI, and that both selections will stay active when From dbf2e696fb54766792548d6a746b4d3c599c8576 Mon Sep 17 00:00:00 2001 From: Hari Chandra Annem Date: Tue, 5 Aug 2025 21:34:53 +0530 Subject: [PATCH 2/4] Remove null check for m_PlayerRoot in InitializePlayerRoot. --- .../InputSystem/Plugins/UI/MultiplayerEventSystem.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Plugins/UI/MultiplayerEventSystem.cs b/Packages/com.unity.inputsystem/InputSystem/Plugins/UI/MultiplayerEventSystem.cs index be68155123..31dceb30a7 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Plugins/UI/MultiplayerEventSystem.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Plugins/UI/MultiplayerEventSystem.cs @@ -49,8 +49,6 @@ protected override void OnDisable() private void InitializePlayerRoot() { - if (m_PlayerRoot == null) return; - var inputModule = GetComponent(); if (inputModule != null) inputModule.localMultiPlayerRoot = m_PlayerRoot; From fa5f3efadcf5fb1c938333f29f778cb07a95c025 Mon Sep 17 00:00:00 2001 From: Ashwin Gopal <68984963+AswinRajGopal@users.noreply.github.com> Date: Thu, 7 Aug 2025 16:20:46 +0530 Subject: [PATCH 3/4] Ran unity-meta format for UITest.cs to fix CI failures. --- Assets/Tests/InputSystem/Plugins/UITests.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Assets/Tests/InputSystem/Plugins/UITests.cs b/Assets/Tests/InputSystem/Plugins/UITests.cs index d5f3c72514..101471f671 100644 --- a/Assets/Tests/InputSystem/Plugins/UITests.cs +++ b/Assets/Tests/InputSystem/Plugins/UITests.cs @@ -2793,17 +2793,17 @@ public IEnumerator UI_CanNavigateUI_WithLocalMultiPlayerRoot_Null_UsingGamepads( // Move right Set(gamepad.leftStick, new Vector2(1, 0)); yield return null; - - Assert.That(scene.eventSystem.currentSelectedGameObject, Is.SameAs(scene.rightGameObject),"Right navigation did not work when localMultiPlayerRoot was set"); + + Assert.That(scene.eventSystem.currentSelectedGameObject, Is.SameAs(scene.rightGameObject), "Right navigation did not work when localMultiPlayerRoot was set"); // Move left Set(gamepad.leftStick, Vector2.zero); yield return null; Set(gamepad.leftStick, new Vector2(-1, 0)); yield return null; - - Assert.That(scene.eventSystem.currentSelectedGameObject, Is.SameAs(scene.leftGameObject),"Left navigation did not work when localMultiPlayerRoot was set"); - + + Assert.That(scene.eventSystem.currentSelectedGameObject, Is.SameAs(scene.leftGameObject), "Left navigation did not work when localMultiPlayerRoot was set"); + // Reset stick position Set(gamepad.leftStick, Vector2.zero); yield return null; @@ -2818,8 +2818,8 @@ public IEnumerator UI_CanNavigateUI_WithLocalMultiPlayerRoot_Null_UsingGamepads( // Move right Set(gamepad.leftStick, new Vector2(1, 0)); yield return null; - - Assert.That(scene.eventSystem.currentSelectedGameObject, Is.SameAs(scene.rightGameObject),"Right navigation did not work when localMultiPlayerRoot was null"); + + Assert.That(scene.eventSystem.currentSelectedGameObject, Is.SameAs(scene.rightGameObject), "Right navigation did not work when localMultiPlayerRoot was null"); // Move left Set(gamepad.leftStick, Vector2.zero); @@ -2827,13 +2827,13 @@ public IEnumerator UI_CanNavigateUI_WithLocalMultiPlayerRoot_Null_UsingGamepads( Set(gamepad.leftStick, new Vector2(-1, 0)); yield return null; - Assert.That(scene.eventSystem.currentSelectedGameObject, Is.SameAs(scene.leftGameObject),"Left navigation did not work when localMultiPlayerRoot was null"); + Assert.That(scene.eventSystem.currentSelectedGameObject, Is.SameAs(scene.leftGameObject), "Left navigation did not work when localMultiPlayerRoot was null"); // Submit PressAndRelease(gamepad.buttonSouth); yield return null; - Assert.That(scene.leftChildReceiver.events, Has.Exactly(1).With.Property("type").EqualTo(EventType.Submit),"Submit event was not received when localMultiPlayerRoot was null"); + Assert.That(scene.leftChildReceiver.events, Has.Exactly(1).With.Property("type").EqualTo(EventType.Submit), "Submit event was not received when localMultiPlayerRoot was null"); // Checking that localMultiPlayerRoot is null Assert.AreEqual(null, scene.uiModule.localMultiPlayerRoot); From 7ae1dc7b42e606b899b15218bfe5468041d1bff0 Mon Sep 17 00:00:00 2001 From: hannem-rythmos Date: Thu, 7 Aug 2025 19:29:19 +0530 Subject: [PATCH 4/4] Update CHANGELOG.md --- Packages/com.unity.inputsystem/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Packages/com.unity.inputsystem/CHANGELOG.md b/Packages/com.unity.inputsystem/CHANGELOG.md index 5d522c7ffd..7a81e18078 100644 --- a/Packages/com.unity.inputsystem/CHANGELOG.md +++ b/Packages/com.unity.inputsystem/CHANGELOG.md @@ -12,6 +12,7 @@ however, it has to be formatted properly to pass verification tests. ### Added - Exposed MediaPlayPause, MediaRewind, MediaForward keys on Keyboard. +- Fixed an issue where `InputSystemUIInputModule.localMultiPlayerRoot` could not be set to `null` when using `MultiplayerEventSystem`. [ISXB-1610](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-1610) ## [1.14.2] - 2025-08-05