- Home /
Display function parameters in inspector
Basically trying to make my own version of the UnityEvents in the inspector, you place this script on a game object and it populates a dropdown with all the public functions. I've gotten pretty far, but I want it to create property fields for the parameters in the selected function, I'm not sure how to do it though, been trying to figure this out for quite a while to no avail.
The script to get the functions and parameters.
[ExecuteInEditMode] public class MageInteraction : MonoBehaviour {
// For displaying the initial option in the custom editor
public int index;
// For getting the right methods
public MonoBehaviour[] monoBehaviours;
public List<MethodInfo> methods = new List<MethodInfo>();
public List<string> methodNames = new List<string>();
public Dictionary<string, ParameterInfo[]> methodParameters = new Dictionary<string, ParameterInfo[]>();
private BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly;
// Start is called before the first frame update
void Start()
{
monoBehaviours = gameObject.GetComponents<MonoBehaviour>();
GetFunctions();
}
// Update is called once per frame
void Update()
{
//GetFunction();
}
void GetFunctions()
{
// Add all the methods found in the script to the list
foreach (MonoBehaviour element in monoBehaviours)
{
methods.AddRange(element.GetType().GetMethods(flags));
}
methodNames.Clear();
foreach (MethodInfo element in methods)
{
// Add all the names of the methods to a list
methodNames.Add(element.ToString());
// Add all the Parameters to the dictionary
methodParameters.Add(element.ToString(), element.GetParameters());
Debug.Log("Parameters " + methodParameters[element.ToString()].ToStringFull());
}
Debug.Log(methodNames.ToArray().ToStringFull());
}
}
The custom editor to display the functions in the inspector
[CustomEditor(typeof(MageInteraction))] [CanEditMultipleObjects] public class MageInteractionEditor : Editor { public override void OnInspectorGUI() { // Update the serializedProperty - always do this in the beginning of OnInspectorGUI. serializedObject.Update();
MageInteraction mageInteraction = (MageInteraction)target;
// Create the dropdown in the inspector for the found methods
mageInteraction.index = EditorGUILayout.Popup("Function", mageInteraction.index, mageInteraction.methodNames.ToArray());
//Debug.Log(mageInteraction.index);
// Create a propertyfield array as large as the ParameterInfo array retrieved by getParameters
EditorGUILayout[] guiLayouts = new EditorGUILayout[mageInteraction.methodParameters[mageInteraction.methodNames[mageInteraction.index]].Length];
Debug.Log("GUILayouts Length: " + guiLayouts.Length);
for (int i = 0; i < guiLayouts.Length; i++)
{
// Create property fields for each parameter found in the method
//SerializedProperty prop = serializedObject.FindProperty(mageInteraction.methodParameters[mageInteraction.methodNames[mageInteraction.index]][i].Name);
SerializedProperty prop = serializedObject.FindProperty(mageInteraction.methodParameters["Void OpenChest(Int32, System.String)"][i].Name);
Debug.Log("SerializedProperty: " + prop);
Debug.Log("ParameterName: " + mageInteraction.methodParameters["Void OpenChest(Int32, System.String)"][i].Name);
//guiLayouts[i] = EditorGUILayout.PropertyField(prop);
}
// Apply changes to the serializedProperty - always do this in the end of OnInspectorGUI.
serializedObject.ApplyModifiedProperties();
}
What it looks like in the inspector
Link in case the image doesn't load https://gyazo.com/00d62deb8b49c2708ecf97423eeb8ee0