/// <summary> /// Displays a selection control for all properties and fields of a given type on an object. /// </summary> /// <param name="source"></param> /// <returns></returns> public static void BindingField(TypeHelper.BindingMap source, Type memberType) { Assert.IsNotNull(source); EditorGUILayout.BeginHorizontal(); source.DestObj = EditorGUILayout.ObjectField(source.DestObj, typeof(UnityEngine.Object), true); if (source.DestObj != null) { //compile list of all properties and fields on this dest List <string> names = new List <string>(10); FieldInfo[] fields = source.DestObj.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance); foreach (var member in fields) { if (member.FieldType == memberType) { names.Add(member.Name); } } PropertyInfo[] props = source.DestObj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var member in props) { if (member.PropertyType == memberType && member.CanWrite) { names.Add(member.Name); } } //display controls for member path GUILayout.Space(25); source.PathIndex = EditorGUILayout.Popup(source.PathIndex, names.ToArray()); if (source.PathIndex >= names.Count) { source.Path = ""; } else { source.Path = names[source.PathIndex]; } } EditorGUILayout.EndHorizontal(); }
/// <summary> /// Displays a control that allows choosing a binding source string as well as a binding source destination. /// </summary> /// <param name="binding"></param> public static bool BindingField(string[] keys, TypeHelper.BindingMap binding, Type memberType) { //controls for selecting dest key EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("-", GUILayout.Width(20))) { return(true); } binding.KeyIndex = EditorGUILayout.Popup(binding.KeyIndex, keys, GUILayout.Width(200)); if (binding.KeyIndex >= keys.Length) { binding.DestObj = null; binding.SourceKey = ""; } else { //binding.DestObj = EditorGUILayout.ObjectField(binding.DestObj, typeof(UnityEngine.Object), true); BindingField(binding, memberType); binding.SourceKey = keys[binding.KeyIndex]; } EditorGUILayout.EndHorizontal(); return(false); }