Working on it

This commit is contained in:
2020-04-18 18:14:51 +10:00
commit a3b19da551
236 changed files with 16300 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
{
"name": "CarbonInputEditor",
"references": [
"CarbonInputRuntime"
],
"includePlatforms": [
"Editor"
],
"excludePlatforms": []
}

View File

@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: ab534325c08e0cc448eb1dbec063ebf2
timeCreated: 1565201685
licenseType: Store
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,155 @@
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
namespace CarbonInput {
/// <summary>
/// Editor extension used to initialize the Unity Input axes.
/// </summary>
public static class CarbonInputMapper {
/// <summary>
/// Deadzone for Unity axis.
/// </summary>
private const float Dead = 0.1f;
/// <summary>
/// Sensitivity for Unity axis.
/// </summary>
private const float Sensitivity = 1.0f;
/// <summary>
/// Helper class, used to manage the settings for a single axis
/// </summary>
public class JoystickAxis {
public string Name;
public int Axis;
public int JoyNum;
public JoystickAxis(string name, int axis, int joyNum) {
this.Name = name;
this.Axis = axis;
this.JoyNum = joyNum;
}
}
#if UNITY_2018_3_OR_NEWER
/// <summary>
/// Provides the project settings entry for CarbonInput
/// </summary>
[SettingsProvider]
static SettingsProvider CreateSettingsProvider() {
var provider = new SettingsProvider("Project/CarbonInputSettings", SettingsScope.Project, new []{"Carbon", "Input", "CarbonInput", "Axis", "Axes"}) {
label = "CarbonInput",
guiHandler = searchContext => {
if(GUILayout.Button("Create Carbon Input Axes") && EditorUtility.DisplayDialog("Init CarbonInput", "This will modify the InputManager settings by adding a bunch of axes.", "OK", "Cancel"))
AddCarbonAxes();
if(GUILayout.Button("Remove Carbon Input Axes") && EditorUtility.DisplayDialog("Remove CarbonInput", "This will modify the InputManager settings by removing all axes named \"cin_Axis*\".", "OK", "Cancel"))
RemoveCarbonAxes();
}
};
return provider;
}
#else
/// <summary>
/// Initializes CarbonInput by setting up all unity axes.
/// </summary>
[MenuItem("Edit/Project Settings/Carbon Input/Create Carbon Input Axes")]
static void Init() {
if(EditorUtility.DisplayDialog("Init CarbonInput", "This will modify the InputManager settings by adding a bunch of axes.", "OK", "Cancel"))
AddCarbonAxes();
}
/// <summary>
/// Removes all generated unity axes.
/// </summary>
[MenuItem("Edit/Project Settings/Carbon Input/Remove Carbon Input Axes")]
static void Clear() {
if(EditorUtility.DisplayDialog("Remove CarbonInput", "This will modify the InputManager settings by removing all axes named \"cin_Axis*\".", "OK", "Cancel"))
RemoveCarbonAxes();
}
#endif
/// <summary>
/// Creates a new mapping used for keyboards.
/// </summary>
[MenuItem("Assets/Create/Carbon Input/Keyboard Mapping", false, 1)]
static void NewFallbackMapping() {
SaveInNewFile(CarbonController.CreateFallback(), "Keyboard");
}
/// <summary>
/// Helper method, used to store the given asset in a new file
/// </summary>
/// <param name="asset"></param>
private static void SaveInNewFile(ScriptableObject asset, string name) {
string dir = "Assets";
if(Selection.activeObject != null)
dir = AssetDatabase.GetAssetPath(Selection.activeObject);
int id = 0;
string file;
do {
file = Path.Combine(dir, name + id++ + ".asset");
} while(File.Exists(file));
AssetDatabase.CreateAsset(asset, file);
Selection.activeObject = asset;
EditorUtility.FocusProjectWindow();
}
/// <summary>
/// Removes all generated axes
/// </summary>
private static void RemoveCarbonAxes() {
SerializedObject serializedObject = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/InputManager.asset")[0]);
SerializedProperty axesProperty = serializedObject.FindProperty("m_Axes");
for(int i = axesProperty.arraySize - 1; i >= 0; i--) {
SerializedProperty prop = axesProperty.GetArrayElementAtIndex(i);
prop.Next(true);
if(prop.stringValue.StartsWith(CarbonController.Tag)) axesProperty.DeleteArrayElementAtIndex(i);
}
serializedObject.ApplyModifiedProperties();
}
/// <summary>
/// Generates all axes.
/// </summary>
private static void AddCarbonAxes() {
RemoveCarbonAxes(); // clean up first
// Any, Player One, ..., Player Eight
for(int id = 0; id < CarbonController.PlayerIndices; id++) {
for(int i = 0; i < CarbonController.InputAxisCount; i++)
//cin_AxisID_I example: cin_Axis0_00 => axis 0 for any joystick
AddAxis(new JoystickAxis(CarbonController.CreateName(id, i), i, id));
}
}
/// <summary>
/// Adds a single unity axis to the InputManager.
/// </summary>
/// <param name="axis"></param>
private static void AddAxis(JoystickAxis axis) {
SerializedObject serializedObject = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/InputManager.asset")[0]);
SerializedProperty axesProperty = serializedObject.FindProperty("m_Axes");
axesProperty.arraySize++;
serializedObject.ApplyModifiedProperties();
SerializedProperty axisProperty = axesProperty.GetArrayElementAtIndex(axesProperty.arraySize - 1);
SetAxis(axisProperty, axis);
serializedObject.ApplyModifiedProperties();
}
/// <summary>
/// Sets the values of a single axis.
/// </summary>
/// <param name="axisProperty"></param>
/// <param name="axis"></param>
private static void SetAxis(SerializedProperty axisProperty, JoystickAxis axis) {
axisProperty.Next(true);
axisProperty.stringValue = axis.Name;
do {
switch(axisProperty.name) {
case "dead": axisProperty.floatValue = Dead; break;
case "sensitivity": axisProperty.floatValue = Sensitivity; break;
case "type": axisProperty.intValue = 2; break; // 2 = Joystick Axis
case "axis": axisProperty.intValue = axis.Axis; break;
case "joyNum": axisProperty.intValue = axis.JoyNum; break;
}
} while(axisProperty.Next(false));
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 634cb37e51c70014eb137d98ce2e7150
timeCreated: 1455632895
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,159 @@
using UnityEngine;
using UnityEditor;
namespace CarbonInput {
/// <summary>
/// Editor for <see cref="CarbonController"/>.
/// </summary>
[CustomEditor(typeof(CarbonController))]
public class CarbonMappingEditor : Editor {
/// <summary>
/// Foldout buttons
/// </summary>
private bool showButtons = true;
/// <summary>
/// Foldout axes.
/// </summary>
private bool showAxes = true;
public override void OnInspectorGUI() {
GUI.changed = false;
CarbonController mapping = (CarbonController)target;
EditorGUI.BeginChangeCheck();
string regex = EditorGUILayout.TextField(new GUIContent("RegEx", "Regular expression used to match joystick names."), mapping.RegEx);
if(EditorGUI.EndChangeCheck()) {
Undo.RecordObject(mapping, "Changed Gamepad RegEx");
mapping.RegEx = regex;
}
EditorGUI.BeginChangeCheck();
int priority = EditorGUILayout.IntField(new GUIContent("Priority", "Lower values are checked earlier."), mapping.Priority);
if(EditorGUI.EndChangeCheck()) {
Undo.RecordObject(mapping, "Changed Gamepad Priority");
mapping.Priority = priority;
}
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PrefixLabel("Platform");
EditorGUI.BeginChangeCheck();
#if UNITY_2017_3_OR_NEWER
CPlatform platform = (CPlatform)EditorGUILayout.EnumFlagsField(mapping.Platform);
#else
CPlatform platform = (CPlatform)EditorGUILayout.EnumMaskField(mapping.Platform);
#endif
if(EditorGUI.EndChangeCheck()) {
Undo.RecordObject(mapping, "Changed Gamepad Platform");
mapping.Platform = platform;
}
EditorGUILayout.EndHorizontal();
EditorGUI.BeginChangeCheck();
bool useOnce = EditorGUILayout.Toggle(new GUIContent("Use Once", "Whether this mapping should only be used for one joystick."), mapping.UseOnce);
if(EditorGUI.EndChangeCheck()) {
Undo.RecordObject(mapping, "Changed Gamepad Use Once");
mapping.UseOnce = useOnce;
}
showButtons = EditorGUILayout.Foldout(showButtons, "Buttons");
if(showButtons) {
EditorGUILayout.BeginVertical();
for(int i = 0; i < CarbonController.ButtonCount; i++) {
ButtonMapping btn = mapping.Buttons[i];
ButtonMapping tmp = new ButtonMapping(btn);
EditorGUI.BeginChangeCheck();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(((CButton)i).ToString(), GUILayout.MaxWidth(50f));
tmp.Type = (ButtonMapping.ButtonType)EditorGUILayout.EnumPopup(btn.Type, GUILayout.MaxWidth(100f));
if(btn.Type == ButtonMapping.ButtonType.Wrapper) {
tmp.Key = (KeyCode)EditorGUILayout.EnumPopup(btn.Key, GUILayout.MaxWidth(100f));
} else {
tmp.Button = Mathf.Clamp(EditorGUILayout.IntField(btn.Button, GUILayout.MaxWidth(100f)), 0, 19);
}
EditorGUILayout.EndHorizontal();
if(EditorGUI.EndChangeCheck()) {
Undo.RecordObject(mapping, "Changed Button Mapping");
btn.CopyFrom(tmp); // copy back
}
}
EditorGUILayout.EndVertical();
}
showAxes = EditorGUILayout.Foldout(showAxes, "Axes");
if(showAxes) {
EditorGUILayout.BeginVertical();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Name", GUILayout.MaxWidth(50f));
EditorGUILayout.LabelField("Axis", GUILayout.MaxWidth(70f));
EditorGUILayout.LabelField("Invert", GUILayout.MaxWidth(40f));
EditorGUILayout.LabelField("Type", GUILayout.MaxWidth(80f));
EditorGUILayout.EndHorizontal();
for(int i = 0; i < CarbonController.AxisCount; i++) {
AxisMapping axis = mapping.Axes[i];
AxisMapping tmp = new AxisMapping(axis);
EditorGUI.BeginChangeCheck();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(((CAxis)i).ToString(), GUILayout.MaxWidth(50f));
if(axis.Type == AxisMapping.AxisType.KeyWrapper || axis.Type == AxisMapping.AxisType.ButtonWrapper2) {
EditorGUILayout.LabelField("", GUILayout.MaxWidth(80f));
} else if(axis.Type == AxisMapping.AxisType.ButtonWrapper) {
tmp.Axis = Mathf.Clamp(EditorGUILayout.IntField(axis.Axis, GUILayout.MaxWidth(80f)), 0, CarbonController.JoystickButtonCount - 1);
} else {
tmp.Axis = Mathf.Clamp(EditorGUILayout.IntField(axis.Axis, GUILayout.MaxWidth(80f)), 0, CarbonController.InputAxisCount - 1);
}
tmp.Invert = EditorGUILayout.Toggle(axis.Invert, GUILayout.MaxWidth(20f));
tmp.Type = (AxisMapping.AxisType)EditorGUILayout.EnumPopup(axis.Type, GUILayout.MaxWidth(100f));
EditorGUILayout.EndHorizontal();
switch(axis.Type) {
case AxisMapping.AxisType.KeyWrapper:
EditorGUILayout.BeginHorizontal();
EditorGUILayout.Space();
EditorGUILayout.LabelField("Negative", GUILayout.MaxWidth(60f));
tmp.Key1 = (KeyCode)EditorGUILayout.EnumPopup(axis.Key1, GUILayout.MaxWidth(80f));
EditorGUILayout.LabelField("Positive", GUILayout.MaxWidth(60f));
tmp.Key2 = (KeyCode)EditorGUILayout.EnumPopup(axis.Key2, GUILayout.MaxWidth(80f));
EditorGUILayout.EndHorizontal();
break;
case AxisMapping.AxisType.ButtonWrapper:
EditorGUILayout.BeginHorizontal();
EditorGUILayout.Space();
EditorGUILayout.LabelField("Released", GUILayout.MaxWidth(60f));
tmp.Min = EditorGUILayout.FloatField(axis.Min, GUILayout.MaxWidth(40f));
EditorGUILayout.LabelField("Pressed", GUILayout.MaxWidth(60f));
tmp.Max = EditorGUILayout.FloatField(axis.Max, GUILayout.MaxWidth(40f));
EditorGUILayout.EndHorizontal();
break;
case AxisMapping.AxisType.ButtonWrapper2:
EditorGUILayout.BeginHorizontal();
EditorGUILayout.Space();
EditorGUILayout.LabelField("Negative", GUILayout.MaxWidth(60f));
tmp.Axis = Mathf.Clamp(EditorGUILayout.IntField(axis.Axis, GUILayout.MaxWidth(40f)), 0, CarbonController.JoystickButtonCount - 1);
EditorGUILayout.LabelField("Positive", GUILayout.MaxWidth(60f));
tmp.Alternative = Mathf.Clamp(EditorGUILayout.IntField(axis.Alternative, GUILayout.MaxWidth(40f)), 0, CarbonController.JoystickButtonCount - 1);
EditorGUILayout.EndHorizontal();
break;
case AxisMapping.AxisType.Clamped:
EditorGUILayout.BeginHorizontal();
EditorGUILayout.Space();
EditorGUILayout.LabelField("Min", GUILayout.MaxWidth(40f));
tmp.Min = EditorGUILayout.FloatField(axis.Min, GUILayout.MaxWidth(40f));
EditorGUILayout.LabelField("Max", GUILayout.MaxWidth(40f));
tmp.Max = EditorGUILayout.FloatField(axis.Max, GUILayout.MaxWidth(40f));
EditorGUILayout.EndHorizontal();
break;
}
if(EditorGUI.EndChangeCheck()) {
Undo.RecordObject(mapping, "Changed Axis Mapping");
axis.CopyFrom(tmp); // copy back
}
}
EditorGUILayout.EndVertical();
}
if(GUI.changed) {
EditorUtility.SetDirty(target);
}
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: eff2d4adbe77113479dbc708ac7a63a0
timeCreated: 1455638714
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,63 @@
using UnityEngine;
using UnityEditor;
namespace CarbonInput {
/// <summary>
/// Editor for <see cref="CarbonSettings"/>.
/// </summary>
[CustomEditor(typeof(CarbonSettings))]
public class CarbonSettingsEditor : Editor {
/// <summary>
/// Short info text for <see cref="AnyBehaviour"/>
/// </summary>
private static string[] BehaviourHelp = {
"UseMappingOne:\nUse the same mapping PlayerIndex.One uses, but listen on any gamepad for that mapping.",
"UseControllerOne:\nAlways use PlayerIndex.One whenever PlayerIndex.Any is used.",
"CheckAll:\nGo over all players and use first match. Slightly slower than the other two behaviours, but it is the most accurate."
};
private CarbonSettings Settings { get { return (CarbonSettings)target; } }
public override void OnInspectorGUI() {
GUI.changed = false;
EditorGUILayout.HelpBox(BehaviourHelp[(int)Settings.Behaviour], MessageType.Info);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(new GUIContent("Behaviour", "Defines the behaviour of PlayerIndex.Any"), GUILayout.Width(100));
EditorGUI.BeginChangeCheck();
AnyBehaviour value = (AnyBehaviour)EditorGUILayout.EnumPopup(Settings.Behaviour);
if(EditorGUI.EndChangeCheck()) {
Undo.RecordObject(Settings, "Changed Behaviour to " + value.ToString());
Settings.Behaviour = value;
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.Separator();
EditorGUILayout.HelpBox(
"The default behaviour of any axis is as follows:\n" +
"X axis goes from -1 (left) to +1(right)\n" +
"Y axis goes from -1 (up) to +1 (down)", MessageType.Info);
EditorGUILayout.LabelField("Inverted Axis");
EditorGUILayout.BeginHorizontal();
AxisToggle(CAxis.LX); AxisToggle(CAxis.RX); AxisToggle(CAxis.DX);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
AxisToggle(CAxis.LY); AxisToggle(CAxis.RY); AxisToggle(CAxis.DY);
EditorGUILayout.EndHorizontal();
if(GUI.changed) EditorUtility.SetDirty(target);
}
/// <summary>
/// Helper method used to invert an axis, providing an undo action.
/// </summary>
/// <param name="axis"></param>
private void AxisToggle(CAxis axis) {
EditorGUI.BeginChangeCheck();
bool value = EditorGUILayout.ToggleLeft(axis.ToString(), Settings[axis], GUILayout.Width(40));
if(EditorGUI.EndChangeCheck()) {
Undo.RecordObject(Settings, "Inverted Axis " + axis.ToString());
Settings[axis] = value;
}
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: d75853247afc34d4bbf918cbcd251c95
timeCreated: 1455907842
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,11 @@
using UnityEditor;
namespace CarbonInput {
[CustomEditor(typeof(ReInit))]
public class ReInitEditor : Editor {
public override void OnInspectorGUI() {
EditorGUILayout.HelpBox("The automatically generated \"GamePad ReInit\" gameobject " +
"and this script are used to detect if a gamepad has (dis)connected.", MessageType.Info);
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 5154737445f00d24f98525a4ac20dcfd
timeCreated: 1483359505
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: