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);
我可以获得 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);
【讨论】:
以上是关于Unity 自定义编辑器窗口输入控件,用于反射确定的类型的主要内容,如果未能解决你的问题,请参考以下文章
Unity3D编辑器扩展—— 在自定义编辑器窗口中序列化List对象