Unity 自定义编辑器窗口输入控件,用于反射确定的类型

Posted

技术标签:

【中文标题】Unity 自定义编辑器窗口输入控件,用于反射确定的类型【英文标题】:Unity Custom Editor Window Input Control for Type Determined by Reflection 【发布时间】:2018-06-16 05:47:33 【问题描述】:

我正在创建一个 GUI,用于在受 UnityEvent GUI 启发的 Unity 自定义 EditorWindow 中选择功能。我无法让 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);

我可以获得 ParameterInfoParameterType,但我不知道如何创建输入 GUI 字段来指定适当的参数参数。

如何为类型由反射确定的参数创建 Unity IMGUI 输入字段?

【问题讨论】:

【参考方案1】:

说清楚

EditorWindow : ScriptableObjectScriptableObject : Object

SerializedObjectUnityEngine.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);

【讨论】:

以上是关于Unity 自定义编辑器窗口输入控件,用于反射确定的类型的主要内容,如果未能解决你的问题,请参考以下文章

Unity 自定义编辑器窗口 画线

Unity扩展编辑器二

带有并排选项卡的 Unity 自定义窗口

Unity3D编辑器扩展—— 在自定义编辑器窗口中序列化List对象

Unity3D编辑器扩展—— 在自定义编辑器窗口中序列化List对象

Unity Shaders学习笔记之为创建自定义慢反射光照模型