2023-11-07 13:55:35 +00:00
using System.Collections ;
using System.Collections.Generic ;
using UnityEngine ;
using UnityEngine.UI ;
namespace Michsky.UI.Shift
{
public class GamepadChecker : MonoBehaviour
{
[Header("Resources")]
public VirtualCursor virtualCursor ;
public GameObject virtualCursorHelper ;
public GameObject eventSystem ;
[Header("Settings")]
[Tooltip("Always update input device. If you turn off this feature, you won't able to change the input device after start, but it might increase the performance.")]
public bool alwaysSearch = true ;
[Header("Objects")]
[Tooltip("Objects in this list will be active when gamepad is un-plugged.")]
public List < GameObject > keyboardObjects = new List < GameObject > ( ) ;
[Tooltip("Objects in this list will be active when gamepad is plugged.")]
public List < GameObject > gamepadObjects = new List < GameObject > ( ) ;
Vector3 cursorPos ;
[HideInInspector] public bool gamepadConnected ;
[HideInInspector] public bool gamepadEnabled ;
[HideInInspector] public bool keyboardEnabled ;
2023-11-24 18:39:53 +00:00
[System.Obsolete]
2023-11-07 13:55:35 +00:00
void Start ( )
{
if ( virtualCursor = = null )
{
try
{
var vCursor = ( VirtualCursor ) GameObject . FindObjectsOfType ( typeof ( VirtualCursor ) ) [ 0 ] ;
virtualCursor = vCursor ;
}
catch
{
this . enabled = false ;
Debug . LogWarning ( "<b>[Gamepad Checker]</b> There is no Virtual Cursor component attached." , this ) ;
}
}
virtualCursorHelper = virtualCursor . gameObject ;
if ( alwaysSearch = = false )
{
this . enabled = false ;
Debug . Log ( "<b>[Gamepad Checker]</b> Always Search is off. Input device won't be updated in case of disconnecting/connecting." ) ;
}
else
{
this . enabled = true ;
Debug . Log ( "<b>[Gamepad Checker]</b> Always Search is on. Input device will be updated in case of disconnecting/connecting." ) ;
}
string [ ] names = Input . GetJoystickNames ( ) ;
for ( int i = 0 ; i < names . Length ; i + + )
{
if ( names [ i ] . Length > = 1 )
gamepadConnected = true ;
else if ( names [ i ] . Length = = 0 )
gamepadConnected = false ;
}
if ( gamepadConnected = = true )
SwitchToGamepad ( ) ;
else
SwitchToKeyboard ( ) ;
}
void Update ( )
{
string [ ] names = Input . GetJoystickNames ( ) ;
for ( int i = 0 ; i < names . Length ; i + + )
{
if ( names [ i ] . Length > = 1 )
gamepadConnected = true ;
else if ( names [ i ] . Length = = 0 )
gamepadConnected = false ;
}
if ( gamepadConnected = = true & & gamepadEnabled = = true
& & keyboardEnabled = = false & & Input . mousePosition ! = cursorPos )
SwitchToKeyboard ( ) ;
else if ( gamepadConnected = = true & & gamepadEnabled = = false
& & keyboardEnabled = = true & & Input . GetKeyDown ( KeyCode . Joystick1Button0 ) )
SwitchToGamepad ( ) ;
else if ( gamepadConnected = = false & & keyboardEnabled = = false )
SwitchToKeyboard ( ) ;
}
public void SwitchToGamepad ( )
{
if ( virtualCursor = = null )
return ;
for ( int i = 0 ; i < keyboardObjects . Count ; i + + )
keyboardObjects [ i ] . SetActive ( false ) ;
for ( int i = 0 ; i < gamepadObjects . Count ; i + + )
{
gamepadObjects [ i ] . SetActive ( true ) ;
LayoutRebuilder . ForceRebuildLayoutImmediate ( gamepadObjects [ i ] . GetComponentInParent < RectTransform > ( ) ) ;
}
gamepadEnabled = true ;
keyboardEnabled = false ;
virtualCursor . enabled = true ;
virtualCursorHelper . SetActive ( true ) ;
eventSystem . SetActive ( false ) ;
Cursor . visible = false ;
cursorPos = Input . mousePosition ;
}
public void SwitchToKeyboard ( )
{
if ( virtualCursor = = null )
return ;
for ( int i = 0 ; i < gamepadObjects . Count ; i + + )
gamepadObjects [ i ] . SetActive ( false ) ;
for ( int i = 0 ; i < keyboardObjects . Count ; i + + )
{
keyboardObjects [ i ] . SetActive ( true ) ;
LayoutRebuilder . ForceRebuildLayoutImmediate ( keyboardObjects [ 0 ] . GetComponentInParent < RectTransform > ( ) ) ;
}
gamepadEnabled = false ;
keyboardEnabled = true ;
virtualCursor . enabled = false ;
virtualCursorHelper . SetActive ( false ) ;
eventSystem . SetActive ( true ) ;
Cursor . visible = true ;
}
}
}