在inspector中我们很容易就可以对字段进行显示,只需要把字段修饰为public即可,而private的只需要在字段前加一个[SerializeField]就可以在面板显示,自定义类型则需要在类上添加[System.Serializable]属性进行序列化也可以在面板上进行显示。
在EditorWindow中,EditorGuiLayout没有可以显示List的方法,可以使用foreach循环使用EditorGUILayout.ObjectField来显示,不过这样就没办法显示自定义类型了,这里还是使用对List进行序列化显示。
EditorGUILayout.PropertyField可以显示序列化字段
这个序列化字段(SerializedProperty)由SerializedObject.FindProperty获取
在OnGUI事件中使用EditorGUILayout.PropertyField(SerializedProperty property, bool includeChildren); 来显示自定义类tObj,同时tObj类也需要标记属性为[Serializable]
using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; using System; public class TestEditor : EditorWindow { [MenuItem("Tools/test")] public static void ShowWindow() { TestEditor win = GetWindow<TestEditor>("TestWindow"); win.Show(); } [SerializeField] private List<tObj> tObjList = new List<tObj>(); private SerializedObject serObj; private SerializedProperty serPty; private void OnEnable() { serObj = new SerializedObject(this); serPty = serObj.FindProperty("tObjList"); tObjList.Add(new tObj("asd", null)); } private void OnGUI() { serObj.Update(); EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(serPty, true); if (EditorGUI.EndChangeCheck()) { serObj.ApplyModifiedProperties(); } } [Serializable] public class tObj { public string str; public UnityEngine.Object obj; public tObj(string str, UnityEngine.Object obj) { this.str = str; this.obj = obj; } } }
同时这个tObj中,如果第一个字段为string类型的话,那么这个字段同时也会显示在列表元素名称上,列表元素原名为Element index
[Serializable] public class tObj { public string str; public UnityEngine.Object obj; public tObj(string str, UnityEngine.Object obj) { this.str = str; this.obj = obj; } }
效果图
文章评论