Пользовательский элемент управления окна редактора 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);
}