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.
CrowdControl/Assets/Plugins/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs

78 lines
2.4 KiB
C#

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