- Home /
Custom Method Selection?
I'm trying to get the same effect as Button OnClick()'s method selection thing:
using UnityEngine;
using UnityEditor;
using System.Linq;
using System.Collections;
using System.Reflection;
using System;
[CustomEditor(typeof(FunctionDemo))]
public class FunctionDemoEditor : Editor
{
static string[] methods;
static string[] ignoreMethods = new string[] { "Start", "Update" };
SerializedObject serObj;
SerializedProperty argument;
static FunctionDemoEditor()
{
methods =
typeof(FunctionDemo)
.GetMethods(BindingFlags.Instance | BindingFlags.Public) // Instance methods, public
.Where(x => x.DeclaringType == typeof(FunctionDemo)) // Only list methods defined in our own class
//.Where(x => x.GetParameters().Length == 0) // Make sure we only get methods with zero or one argumenrts
.Where(x => !ignoreMethods.Any(n => n == x.Name)) // Don't list methods in the ignoreMethods array (so we can exclude Unity specific methods, etc.)
.Select(x => x.Name)
.ToArray();
}
void OnEnable() {
serObj = new SerializedObject(target);
argument = serObj.FindProperty("p_arg");
}
public override void OnInspectorGUI()
{
FunctionDemo obj = target as FunctionDemo;
if (obj != null)
{
int index;
try
{
index = methods
.Select((v, i) => new { Name = v, Index = i })
.First(x => x.Name == obj.MethodToCall)
.Index;
}
catch
{
index = 0;
}
if(methods.Length != 0) {
obj.MethodToCall = methods[EditorGUILayout.Popup(index, methods)];
if(typeof(FunctionDemo).GetMethod (methods[index]).GetParameters().Length == 1) {
Type t = typeof(FunctionDemo).GetMethod (methods[index]).GetParameters ().ElementAt (0).ParameterType;
if(t == typeof(int))
obj.pArgObject = EditorGUILayout.IntField (obj.pArgObject);
}
//obj.p_arg = EditorGUILayout.ObjectField ((UnityEngine.Object)obj.p_arg, typeof(FunctionDemo).GetMethod (methods[index]).GetParameters ().ElementAt (0).ParameterType);
}
}
}
}
On my other script that calls that method:
typeof(FunctionDemo)
.GetMethod(MethodToCall, BindingFlags.Instance | BindingFlags.Public)
.Invoke(this, new object[1] {pArgObject});
My problem is that I want to get the type of an int, string, bool, or float, and be able to pass that. So I'd like to be able to use EditorGUILayout.IntField, FloatField, etc, but Invoke
passes parameters as an object array. I don't know how I can get IntField, FloatField, etc. to work with that..
Your answer
Follow this Question
Related Questions
CustomAttribute on Class or Method ( EDIT: Button to call methods) 2 Answers
Good practice to do a base extend of MonoBehaviour? 1 Answer
Index out of range when using delegates to set onClick at runtime 1 Answer
why cant I see more than one perameter in gameobjects 1 Answer
Unity Iphone "It is not possible to invoke an expression of type 'Object'. 1 Answer