Files
Fishing2/Assets/ThirdParty/Rewired/Examples/FallbackJoystickIdentification/Scripts/FallbackJoystickIdentificationDemo.cs
2025-05-10 12:49:47 +08:00

136 lines
5.5 KiB
C#

// Copyright (c) 2014 Augie R. Maddox, Guavaman Enterprises. All rights reserved.
// This example shows how to have the user manually identify joysticks by name to assit with a Unity
// bug where joysticks cannot be associated with a Unity joystick ID without manual intervention when
// using Unity as the input source (as opposed to native input).
// NOTE: This only affects the Windows Standalone and Windows Webplayer platforms and was patched by Unity in 4.6.3p1,
// so this is no longer required in Unity 4.x versions after 4.6.3p1.
// Currently, Unity 5.x does not implement this fix yet, so this test is recommended.
namespace Rewired.Demos {
using UnityEngine;
using System.Collections.Generic;
using Rewired;
[AddComponentMenu("")]
public class FallbackJoystickIdentificationDemo : MonoBehaviour {
// Consts
private const float windowWidth = 250.0f;
private const float windowHeight = 250.0f;
private const float inputDelay = 1.0f;
// Working vars
private bool identifyRequired;
private Queue<Joystick> joysticksToIdentify;
private float nextInputAllowedTime;
private GUIStyle style;
private void Awake() {
if(!ReInput.unityJoystickIdentificationRequired) return; // this platform does not require manual joystick identificaion
// Subscribe to device change events
ReInput.ControllerConnectedEvent += JoystickConnected;
ReInput.ControllerDisconnectedEvent += JoystickDisconnected; // this event is called after joystick is fully disconnected and removed from lists
IdentifyAllJoysticks();
}
private void JoystickConnected(ControllerStatusChangedEventArgs args) {
// Identify all joysticks on connect or disconnect because ids are not reliable in Unity
IdentifyAllJoysticks();
}
private void JoystickDisconnected(ControllerStatusChangedEventArgs args) {
// Identify all joysticks on connect or disconnect because ids are not reliable in Unity
IdentifyAllJoysticks();
}
public void IdentifyAllJoysticks() {
// Reset each time in case user changes joysticks while dialog is open
Reset();
// Check if there are any joysticks
if(ReInput.controllers.joystickCount == 0) return; // no joysticks, nothing to do
// Get current Joysticks
Joystick[] joysticks = ReInput.controllers.GetJoysticks();
if(joysticks == null) return;
// Set flag to enable identification mode
identifyRequired = true;
// Create a queue out of the joysticks array
joysticksToIdentify = new Queue<Joystick>(joysticks);
// Set the time for accepting input again
SetInputDelay();
}
private void SetInputDelay() {
// Prevent user input for a period of time after each identification to handle button hold problem
nextInputAllowedTime = Time.time + inputDelay;
}
private void OnGUI() {
if(!identifyRequired) return;
if(joysticksToIdentify == null || joysticksToIdentify.Count == 0) {
Reset();
return;
}
// Draw dialog window
Rect centerWindowRect = new Rect(Screen.width * 0.5f - windowWidth * 0.5f, Screen.height * 0.5f - windowHeight * 0.5f, windowWidth, windowHeight); // create a cetered window rect
GUILayout.Window(0, centerWindowRect, DrawDialogWindow, "Joystick Identification Required"); // draw the window
GUI.FocusWindow(0); // focus the window
// Do not allow input during input delay to filter out holding a button down and assigning all joysticks to a single joystick id
if(Time.time < nextInputAllowedTime) return;
// Poll for a joystick button press to identify the joystick
if(!ReInput.controllers.SetUnityJoystickIdFromAnyButtonOrAxisPress(joysticksToIdentify.Peek().id, 0.8f, false)) {
return; // no input detected
}
// Remove the joystick from the queue now that we've used it
joysticksToIdentify.Dequeue();
// Renew the input delay time after press
SetInputDelay();
// Finish up if the queue is empty
if(joysticksToIdentify.Count == 0) {
Reset(); // done
}
}
private void DrawDialogWindow(int windowId) {
if(!identifyRequired) return; // window displays 1 frame after it is closed, so this is required to prevent null references below
// Set up a temporary style with word wrap
if(style == null) {
style = new GUIStyle(GUI.skin.label);
style.wordWrap = true;
}
// Draw the window contents
GUILayout.Space(15);
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();
return;
}
}
private void Reset() {
joysticksToIdentify = null;
identifyRequired = false;
}
}
}