Пользовательский элемент управления окна редактора Unity для типа, определенного по отражению

Я создаю графический интерфейс для выбора функции в пользовательском окне редактора Unity, вдохновленном графическим интерфейсом UnityEvent. Я не могу заставить сам UnityEvent работать; использование EditorGUILayout.PropertyField и обращение к члену UnityEvent в качестве сериализованного свойства приводит к пустому развороту.

Я выбрал работающую функцию, но не могу понять, как разрешить пользователю указывать аргументы параметра функции.

using System.Reflection;
int functionIndex = 0;
MethodInfo[] methods = typeof(LvlGenFunctions).GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);
string methodNames = new string[methods.Length];
for(int i = 0; i < methods.Length; ++i)
{
  methodNames[i] = methods[i].Name;
}
functionIndex = EditorGUILayout.Popup(functionIndex, methodNames);
methods[functionIndex].Invoke(null, null);

Я могу получить ParameterInfo и, следовательно, ParameterType, но я не знаю, как создать поле ввода GUI, чтобы указать соответствующий аргумент параметра.

Как я могу создать поле ввода Unity IMGUI для параметра, тип которого определяется отражением?

1 ответ

Чтобы быть ясным

EditorWindow : ScriptableObject а также ScriptableObject : Object

SerializedObject работать с UnityEngine.Object так что вы можете использовать этот конструктор:

new SerializedObject(Object target);

EditorWindow

public UnityEvent OnSomeEvent;
private SerializedObject serializedObject;
private SerializedProperty property;

private void OnEnable()
{
    serializedObject = new SerializedObject(this);
    property = serializedObject.FindProperty(nameof(OnSomeEvent));
}

private void OnGUI()
{
    EditorGUILayout.PropertyField(property, true);
}

Теперь у вас есть инспектор, но это не то, что вы хотите.


Проблема в том, что это слишком уродливо.

Обновите ваш код, как показано ниже:

public UnityEvent OnSomeEvent;
private SerializedObject serializedObject;
private SerializedProperty property;
// new fields
private UnityEventDrawer EventDrawer;
private GUIContent Content;

private void OnEnable()
{
    serializedObject = new SerializedObject(this);
    property = serializedObject.FindProperty(nameof(OnSomeEvent));
    // new initialization
    EventDrawer = new UnityEventDrawer();
    Content = new GUIContent(property.displayName, property.tooltip);
}

private void OnGUI()
{
    // new drawer
    var eventHeigth = EventDrawer.GetPropertyHeight(property, label);
    var rect = EditorGUILayout.GetControlRect(true, eventHeigth);
    EventDrawer.OnGUI(rect, property, label);
}
Другие вопросы по тегам