You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.4 KiB
C#
78 lines
2.4 KiB
C#
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace NaughtyAttributes.Editor
|
|
{
|
|
[CustomPropertyDrawer(typeof(InputAxisAttribute))]
|
|
public class InputAxisPropertyDrawer : PropertyDrawerBase
|
|
{
|
|
private static readonly string AssetPath = Path.Combine("ProjectSettings", "InputManager.asset");
|
|
private const string AxesPropertyPath = "m_Axes";
|
|
private const string NamePropertyPath = "m_Name";
|
|
|
|
protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label)
|
|
{
|
|
return (property.propertyType == SerializedPropertyType.String)
|
|
? GetPropertyHeight(property)
|
|
: GetPropertyHeight(property) + GetHelpBoxHeight();
|
|
}
|
|
|
|
protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label)
|
|
{
|
|
EditorGUI.BeginProperty(rect, label, property);
|
|
|
|
if (property.propertyType == SerializedPropertyType.String)
|
|
{
|
|
var inputManagerAsset = AssetDatabase.LoadAssetAtPath(AssetPath, typeof(object));
|
|
var inputManager = new SerializedObject(inputManagerAsset);
|
|
|
|
var axesProperty = inputManager.FindProperty(AxesPropertyPath);
|
|
var axesSet = new HashSet<string>();
|
|
axesSet.Add("(None)");
|
|
|
|
for (var i = 0; i < axesProperty.arraySize; i++)
|
|
{
|
|
var axis = axesProperty.GetArrayElementAtIndex(i).FindPropertyRelative(NamePropertyPath).stringValue;
|
|
axesSet.Add(axis);
|
|
}
|
|
|
|
var axes = axesSet.ToArray();
|
|
|
|
string propertyString = property.stringValue;
|
|
int index = 0;
|
|
// check if there is an entry that matches the entry and get the index
|
|
// we skip index 0 as that is a special custom case
|
|
for (int i = 1; i < axes.Length; i++)
|
|
{
|
|
if (axes[i].Equals(propertyString, System.StringComparison.Ordinal))
|
|
{
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Draw the popup box with the current selected index
|
|
int newIndex = EditorGUI.Popup(rect, label.text, index, axes);
|
|
|
|
// Adjust the actual string value of the property based on the selection
|
|
string newValue = newIndex > 0 ? axes[newIndex] : string.Empty;
|
|
|
|
if (!property.stringValue.Equals(newValue, System.StringComparison.Ordinal))
|
|
{
|
|
property.stringValue = newValue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
string message = string.Format("{0} supports only string fields", typeof(InputAxisAttribute).Name);
|
|
DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning);
|
|
}
|
|
|
|
EditorGUI.EndProperty();
|
|
}
|
|
}
|
|
}
|