HumanoidControl_Free/Editor/Tools/Input/ControllerInput_Editor.cs
Pascal Serrarens 17741d862a First commit
2022-01-12 10:50:57 +01:00

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();
}
}
}