490 lines
17 KiB
C#
490 lines
17 KiB
C#
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace Passer {
|
|
using Humanoid;
|
|
|
|
[CustomEditor(typeof(ControllerInput))]
|
|
public class ControllerInput_Editor : Editor {
|
|
protected ControllerInput controllerInput;
|
|
|
|
protected HumanoidControl humanoid;
|
|
|
|
#region Enable
|
|
|
|
protected virtual void OnEnable() {
|
|
controllerInput = (ControllerInput)target;
|
|
|
|
if (controllerInput.leftInputEvents == null || controllerInput.leftInputEvents.Length != 13)
|
|
controllerInput.InitializeLeftInputEvents();
|
|
if (controllerInput.rightInputEvents == null || controllerInput.rightInputEvents.Length != 13)
|
|
controllerInput.InitializeRightInputEvents();
|
|
|
|
for (int i = 0; i < controllerInput.leftInputEvents.Length; i++) {
|
|
if (controllerInput.leftInputEvents[i].events == null || controllerInput.leftInputEvents[i].events.Count == 0) {
|
|
controllerInput.leftInputEvents[i].events.Add(new ControllerEventHandler(controllerInput.gameObject, EventHandler.Type.Never));
|
|
}
|
|
}
|
|
for (int i = 0; i < controllerInput.rightInputEvents.Length; i++) {
|
|
if (controllerInput.rightInputEvents[i].events == null || controllerInput.rightInputEvents[i].events.Count == 0) {
|
|
controllerInput.rightInputEvents[i].events.Add(new ControllerEventHandler(controllerInput.gameObject, EventHandler.Type.Never));
|
|
}
|
|
}
|
|
|
|
serializedObject.Update();
|
|
humanoid = controllerInput.GetComponent<HumanoidControl>();
|
|
SerializedProperty humanoidProp = serializedObject.FindProperty("humanoid");
|
|
humanoidProp.objectReferenceValue = humanoid;
|
|
serializedObject.ApplyModifiedProperties();
|
|
|
|
InitController();
|
|
CheckHandlerLabels();
|
|
}
|
|
|
|
protected virtual void CheckHandlerLabels() {
|
|
string[] leftLabels = defaultLeft;
|
|
string[] rightLabels = defaultRight;
|
|
if (controllerInput.leftInputEvents.Length < 13) {
|
|
for (int i = 0; i < 3; i++) {
|
|
leftLabels[i] = defaultLeft[i];
|
|
rightLabels[i] = defaultRight[i];
|
|
}
|
|
for (int i = 3; i < 10; i++) {
|
|
leftLabels[i] = defaultLeft[i + 3];
|
|
rightLabels[i] = defaultRight[i + 3];
|
|
}
|
|
}
|
|
|
|
if (humanoid != null) {
|
|
//#if hOCULUS && (UNITY_STANDALONE_WIN || UNITY_ANDROID)
|
|
// if (humanoid.oculus.enabled) {
|
|
// if (controllerInput.leftInputEvents.Length < 13) {
|
|
// for (int i = 0; i < 3; i++) {
|
|
// leftLabels[i] = oculusLeft[i];
|
|
// rightLabels[i] = oculusRight[i];
|
|
// }
|
|
// for (int i = 3; i < 10; i++) {
|
|
// leftLabels[i] = oculusLeft[i + 3];
|
|
// rightLabels[i] = oculusRight[i + 3];
|
|
// }
|
|
// }
|
|
// else {
|
|
// leftLabels = oculusLeft;
|
|
// rightLabels = oculusRight;
|
|
// }
|
|
// }
|
|
// else
|
|
//#endif
|
|
//#if hOPENVR && (UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX)
|
|
// if (humanoid.openVR.enabled) {
|
|
// if (controllerInput.leftInputEvents.Length < 13) {
|
|
// for (int i = 0; i < 3; i++) {
|
|
// leftLabels[i] = openVRLeft[i];
|
|
// rightLabels[i] = openVRRight[i];
|
|
// }
|
|
// for (int i = 3; i < 10; i++) {
|
|
// leftLabels[i] = openVRLeft[i + 3];
|
|
// rightLabels[i] = openVRRight[i + 3];
|
|
// }
|
|
// }
|
|
// else {
|
|
// leftLabels = openVRLeft;
|
|
// rightLabels = openVRRight;
|
|
// }
|
|
// }
|
|
// else
|
|
//#endif
|
|
#if hWINDOWSMR && UNITY_WSA_10_0
|
|
if (humanoid.mixedReality.enabled) {
|
|
if (controllerInput.leftInputEvents.Length < 13) {
|
|
for (int i = 0; i < 3; i++) {
|
|
leftLabels[i] = windowsMRLeft[i];
|
|
rightLabels[i] = windowsMRRight[i];
|
|
}
|
|
for (int i = 3; i < 10; i++) {
|
|
leftLabels[i] = windowsMRLeft[i + 3];
|
|
rightLabels[i] = windowsMRRight[i + 3];
|
|
}
|
|
}
|
|
else {
|
|
leftLabels = windowsMRLeft;
|
|
rightLabels = windowsMRRight;
|
|
}
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
;
|
|
}
|
|
}
|
|
else
|
|
switch (controllerInput.gameController) {
|
|
case GameControllers.Xbox:
|
|
//if (controllerInput.leftInputEvents.Length < 13) {
|
|
// for (int i = 0; i < 3; i++) {
|
|
// leftLabels[i] = xboxLeft[i];
|
|
// rightLabels[i] = xboxRight[i];
|
|
// }
|
|
// for (int i = 3; i < 10; i++) {
|
|
// leftLabels[i] = xboxLeft[i + 3];
|
|
// rightLabels[i] = xboxRight[i + 3];
|
|
// }
|
|
//}
|
|
//else {
|
|
leftLabels = xboxLeft;
|
|
rightLabels = xboxRight;
|
|
//}
|
|
break;
|
|
}
|
|
|
|
for (int i = 0; i < controllerInput.leftInputEvents.Length; i++)
|
|
controllerInput.leftInputEvents[i].label = leftLabels[i];
|
|
for (int i = 0; i < controllerInput.rightInputEvents.Length; i++)
|
|
controllerInput.rightInputEvents[i].label = rightLabels[i];
|
|
}
|
|
|
|
#region Labels
|
|
|
|
readonly string[] defaultLeft = {
|
|
"Stick Vertical",
|
|
"Stick Horizontal",
|
|
"Stick Button",
|
|
"Touchpad Vertical",
|
|
"Touchpad Horizontal",
|
|
"Touchpad Button",
|
|
"Button 1",
|
|
"Button 2",
|
|
"Button 3",
|
|
"Button 4",
|
|
"Trigger 1",
|
|
"Trigger 2",
|
|
"Option"
|
|
};
|
|
readonly string[] defaultRight = {
|
|
"Stick Vertical",
|
|
"Stick Horizontal",
|
|
"Stick Button",
|
|
"Touchpad Vertical",
|
|
"Touchpad Horizontal",
|
|
"Touchpad Button",
|
|
"Button 1",
|
|
"Button 2",
|
|
"Button 3",
|
|
"Button 4",
|
|
"Trigger 1",
|
|
"Trigger 2",
|
|
"Option"
|
|
};
|
|
|
|
readonly string[] xboxLeft = {
|
|
"Vertical",
|
|
"Horizontal",
|
|
"Stick Button",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"Bumper",
|
|
"Trigger",
|
|
"Back"
|
|
};
|
|
readonly string[] xboxRight = {
|
|
"Vertical",
|
|
"Horizontal",
|
|
"Stick Button",
|
|
"",
|
|
"",
|
|
"",
|
|
"A",
|
|
"B",
|
|
"X",
|
|
"Y",
|
|
"Bumper",
|
|
"Trigger",
|
|
"Start"
|
|
};
|
|
|
|
#if hOCULUS
|
|
readonly string[] oculusLeft = {
|
|
"Vertical",
|
|
"Horizontal",
|
|
"Stick Button",
|
|
"",
|
|
"",
|
|
"",
|
|
"X",
|
|
"Y",
|
|
"",
|
|
"",
|
|
"Trigger 1",
|
|
"Trigger 2",
|
|
"Menu"
|
|
};
|
|
readonly string[] oculusRight = {
|
|
"Vertical",
|
|
"Horizontal",
|
|
"Stick Button",
|
|
"",
|
|
"",
|
|
"",
|
|
"A",
|
|
"B",
|
|
"",
|
|
"",
|
|
"Trigger 1",
|
|
"Trigger 2",
|
|
""
|
|
};
|
|
#endif
|
|
|
|
#if hOPENVR
|
|
readonly string[] openVRLeft = {
|
|
"Stick Vertical",
|
|
"Stick Horizontal",
|
|
"Stick Button",
|
|
"Touchpad Vertical",
|
|
"Touchpad Horizontal",
|
|
"Touchpad Button",
|
|
"A",
|
|
"B",
|
|
"",
|
|
"",
|
|
"Trigger",
|
|
"Grip",
|
|
"Menu"
|
|
};
|
|
readonly string[] openVRRight = {
|
|
"Stick Vertical",
|
|
"Stick Horizontal",
|
|
"Stick Button",
|
|
"Touchpad Vertical",
|
|
"Touchpad Horizontal",
|
|
"Touchpad Button",
|
|
"A",
|
|
"B",
|
|
"",
|
|
"",
|
|
"Trigger",
|
|
"Grip",
|
|
"Menu"
|
|
};
|
|
#endif
|
|
|
|
#if hWINDOWSMR && UNITY_WSA_10_0
|
|
readonly string[] windowsMRLeft = {
|
|
"Stick Vertical",
|
|
"Stick Horizontal",
|
|
"Stick Button",
|
|
"Touchpad Vertical",
|
|
"Touchpad Horizontal",
|
|
"Touchpad Button",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"Select",
|
|
"Grab",
|
|
"Menu"
|
|
};
|
|
readonly string[] windowsMRRight = {
|
|
"Stick Vertical",
|
|
"Stick Horizontal",
|
|
"Stick Button",
|
|
"Touchpad Vertical",
|
|
"Touchpad Horizontal",
|
|
"Touchpad Button",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"Select",
|
|
"Grab",
|
|
"Menu"
|
|
};
|
|
#endif
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
#region Disable
|
|
|
|
protected virtual void OnDisable() {
|
|
ControllerEventHandlers.Cleanup(controllerInput.leftInputEvents);
|
|
ControllerEventHandlers.Cleanup(controllerInput.rightInputEvents);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Inspector
|
|
|
|
protected int selectedLeft = -1;
|
|
protected int selectedRight = -1;
|
|
protected int selectedSub = -1;
|
|
|
|
protected bool showLeft = true;
|
|
protected bool showRight = true;
|
|
|
|
public override void OnInspectorGUI() {
|
|
serializedObject.Update();
|
|
|
|
SerializedProperty humanoidProp = serializedObject.FindProperty("humanoid");
|
|
if (humanoidProp.objectReferenceValue != null)
|
|
FingerMovementsInspector();
|
|
|
|
ControllerInspector();
|
|
|
|
serializedObject.ApplyModifiedProperties();
|
|
}
|
|
|
|
protected void FingerMovementsInspector() {
|
|
GUIContent text = new GUIContent(
|
|
"Finger Movements",
|
|
"Implements finger movements using controller input"
|
|
);
|
|
|
|
SerializedProperty fingerMovementsProp = serializedObject.FindProperty("fingerMovements");
|
|
fingerMovementsProp.boolValue = EditorGUILayout.Toggle(text, fingerMovementsProp.boolValue);
|
|
}
|
|
|
|
#region Controller
|
|
|
|
protected SerializedProperty fingerMovementsProp;
|
|
protected SerializedProperty leftEventsProp;
|
|
protected SerializedProperty rightEventsProp;
|
|
|
|
protected virtual void InitController() {
|
|
|
|
leftEventsProp = serializedObject.FindProperty("leftInputEvents");
|
|
rightEventsProp = serializedObject.FindProperty("rightInputEvents");
|
|
}
|
|
|
|
protected virtual void ControllerInspector() {
|
|
GameControllerInspector();
|
|
|
|
showLeft = EditorGUILayout.Foldout(showLeft, "Left", true);
|
|
if (showLeft) {
|
|
for (int i = 0; i < controllerInput.leftInputEvents.Length; i++) {
|
|
ControllerEvent_Editor.EventInspector(
|
|
leftEventsProp.GetArrayElementAtIndex(i),
|
|
ref selectedLeft, ref selectedSub
|
|
);
|
|
}
|
|
if (selectedLeft >= 0)
|
|
selectedRight = -1;
|
|
}
|
|
|
|
showRight = EditorGUILayout.Foldout(showRight, "Right");
|
|
if (showRight) {
|
|
for (int i = 0; i < controllerInput.rightInputEvents.Length; i++) {
|
|
ControllerEvent_Editor.EventInspector(
|
|
rightEventsProp.GetArrayElementAtIndex(i),
|
|
ref selectedRight, ref selectedSub
|
|
);
|
|
}
|
|
if (selectedRight >= 0)
|
|
selectedLeft = -1;
|
|
}
|
|
}
|
|
|
|
protected void GameControllerInspector() {
|
|
SerializedProperty gameControllerProp = serializedObject.FindProperty("gameController");
|
|
|
|
GUIContent text = new GUIContent(
|
|
"Game Controller",
|
|
"The type of Game Controller used."
|
|
);
|
|
gameControllerProp.intValue = (int)(GameControllers)EditorGUILayout.EnumPopup(text, (GameControllers)gameControllerProp.intValue);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
}
|
|
|
|
[InitializeOnLoad]
|
|
class InputManager {
|
|
static InputManager() {
|
|
EnforceInputManagerBindings();
|
|
}
|
|
|
|
private static void EnforceInputManagerBindings() {
|
|
#if !UNITY_2021_2_OR_NEWER
|
|
try {
|
|
BindAxis(new Axis() { name = "Axis 3", axis = 2, });
|
|
BindAxis(new Axis() { name = "Axis 4", axis = 3, });
|
|
BindAxis(new Axis() { name = "Axis 5", axis = 4, });
|
|
BindAxis(new Axis() { name = "Axis 6", axis = 5, });
|
|
BindAxis(new Axis() { name = "Axis 7", axis = 6, });
|
|
BindAxis(new Axis() { name = "Axis 8", axis = 7, });
|
|
BindAxis(new Axis() { name = "Axis 9", axis = 8, });
|
|
BindAxis(new Axis() { name = "Axis 10", axis = 9, });
|
|
BindAxis(new Axis() { name = "Axis 11", axis = 10, });
|
|
BindAxis(new Axis() { name = "Axis 12", axis = 11, });
|
|
BindAxis(new Axis() { name = "Axis 13", axis = 12, });
|
|
}
|
|
catch {
|
|
Debug.LogError("Failed to apply Humanoid input manager bindings.");
|
|
}
|
|
#endif
|
|
}
|
|
|
|
private class Axis {
|
|
public string name = System.String.Empty;
|
|
public string descriptiveName = System.String.Empty;
|
|
public string descriptiveNegativeName = System.String.Empty;
|
|
public string negativeButton = System.String.Empty;
|
|
public string positiveButton = System.String.Empty;
|
|
public string altNegativeButton = System.String.Empty;
|
|
public string altPositiveButton = System.String.Empty;
|
|
public float gravity = 0.0f;
|
|
public float dead = 0.001f;
|
|
public float sensitivity = 1.0f;
|
|
public bool snap = false;
|
|
public bool invert = false;
|
|
public int type = 2;
|
|
public int axis = 0;
|
|
public int joyNum = 0;
|
|
}
|
|
|
|
private static void BindAxis(Axis axis) {
|
|
SerializedObject serializedObject = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/InputManager.asset")[0]);
|
|
SerializedProperty axesProperty = serializedObject.FindProperty("m_Axes");
|
|
|
|
SerializedProperty axisIter = axesProperty.Copy();
|
|
axisIter.Next(true);
|
|
axisIter.Next(true);
|
|
while (axisIter.Next(false)) {
|
|
if (axisIter.FindPropertyRelative("m_Name").stringValue == axis.name) {
|
|
// Axis already exists. Don't create binding.
|
|
return;
|
|
}
|
|
}
|
|
|
|
axesProperty.arraySize++;
|
|
serializedObject.ApplyModifiedProperties();
|
|
|
|
SerializedProperty axisProperty = axesProperty.GetArrayElementAtIndex(axesProperty.arraySize - 1);
|
|
axisProperty.FindPropertyRelative("m_Name").stringValue = axis.name;
|
|
axisProperty.FindPropertyRelative("descriptiveName").stringValue = axis.descriptiveName;
|
|
axisProperty.FindPropertyRelative("descriptiveNegativeName").stringValue = axis.descriptiveNegativeName;
|
|
axisProperty.FindPropertyRelative("negativeButton").stringValue = axis.negativeButton;
|
|
axisProperty.FindPropertyRelative("positiveButton").stringValue = axis.positiveButton;
|
|
axisProperty.FindPropertyRelative("altNegativeButton").stringValue = axis.altNegativeButton;
|
|
axisProperty.FindPropertyRelative("altPositiveButton").stringValue = axis.altPositiveButton;
|
|
axisProperty.FindPropertyRelative("gravity").floatValue = axis.gravity;
|
|
axisProperty.FindPropertyRelative("dead").floatValue = axis.dead;
|
|
axisProperty.FindPropertyRelative("sensitivity").floatValue = axis.sensitivity;
|
|
axisProperty.FindPropertyRelative("snap").boolValue = axis.snap;
|
|
axisProperty.FindPropertyRelative("invert").boolValue = axis.invert;
|
|
axisProperty.FindPropertyRelative("type").intValue = axis.type;
|
|
axisProperty.FindPropertyRelative("axis").intValue = axis.axis;
|
|
axisProperty.FindPropertyRelative("joyNum").intValue = axis.joyNum;
|
|
serializedObject.ApplyModifiedProperties();
|
|
}
|
|
}
|
|
|
|
} |