using System.Collections.Generic; using UnityEngine; namespace Rewired.Demos; [AddComponentMenu("")] public class FallbackJoystickIdentificationDemo : MonoBehaviour { private const float windowWidth = 250f; private const float windowHeight = 250f; private const float inputDelay = 1f; private bool identifyRequired; private Queue joysticksToIdentify; private float nextInputAllowedTime; private GUIStyle style; private void Awake() { if (ReInput.unityJoystickIdentificationRequired) { ReInput.ControllerConnectedEvent += JoystickConnected; ReInput.ControllerDisconnectedEvent += JoystickDisconnected; IdentifyAllJoysticks(); } } private void JoystickConnected(ControllerStatusChangedEventArgs args) { IdentifyAllJoysticks(); } private void JoystickDisconnected(ControllerStatusChangedEventArgs args) { IdentifyAllJoysticks(); } public void IdentifyAllJoysticks() { Reset(); if (ReInput.controllers.joystickCount != 0) { Joystick[] joysticks = ReInput.controllers.GetJoysticks(); if (joysticks != null) { identifyRequired = true; joysticksToIdentify = new Queue(joysticks); SetInputDelay(); } } } private void SetInputDelay() { nextInputAllowedTime = Time.time + 1f; } private void OnGUI() { if (!identifyRequired) { return; } if (joysticksToIdentify == null || joysticksToIdentify.Count == 0) { Reset(); return; } Rect screenRect = new Rect((float)Screen.width * 0.5f - 125f, (float)Screen.height * 0.5f - 125f, 250f, 250f); GUILayout.Window(0, screenRect, DrawDialogWindow, "Joystick Identification Required"); GUI.FocusWindow(0); if (!(Time.time < nextInputAllowedTime) && ReInput.controllers.SetUnityJoystickIdFromAnyButtonOrAxisPress(joysticksToIdentify.Peek().id, 0.8f, positiveAxesOnly: false)) { joysticksToIdentify.Dequeue(); SetInputDelay(); if (joysticksToIdentify.Count == 0) { Reset(); } } } private void DrawDialogWindow(int windowId) { if (identifyRequired) { if (style == null) { style = new GUIStyle(GUI.skin.label); style.wordWrap = true; } GUILayout.Space(15f); GUILayout.Label("A joystick has been attached or removed. You will need to identify each joystick by pressing a button on the controller listed below:", style); Joystick joystick = joysticksToIdentify.Peek(); GUILayout.Label("Press any button on \"" + joystick.name + "\" now.", style); GUILayout.FlexibleSpace(); if (GUILayout.Button("Skip")) { joysticksToIdentify.Dequeue(); } } } private void Reset() { joysticksToIdentify = null; identifyRequired = false; } }