148 lines
4.9 KiB
C#
148 lines
4.9 KiB
C#
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;
|
|
|
|
[System.Obsolete]
|
|
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;
|
|
}
|
|
}
|
|
} |