/** * Add a new type inspector to parentTransform with a target and reflected property or field. */ public static pb_TypeInspector AddTypeInspector(object target, Transform parentTransform, PropertyInfo property = null, FieldInfo field = null) { pb_TypeInspector inspector = null; System.Type type = property != null ? property.PropertyType : field.FieldType; inspector = pb_InspectorResolver.GetInspector(type); if (inspector != null) { if (property != null) { inspector.Initialize(target, property); } else { inspector.Initialize(target, field); } inspector.transform.SetParent(parentTransform); } else { Debug.LogError("No inspector found! Is `pb_ObjectInspector.cs` missing?"); } return(inspector); }
protected virtual void InitializeGUI() { pb_GUIUtility.AddVerticalLayoutGroup(gameObject); foreach (PropertyInfo prop in pb_Reflection.GetSerializableProperties(target.GetType(), BindingFlags.Instance | BindingFlags.Public)) { if (ignoreProperties.Contains(prop.Name) || System.Attribute.GetCustomAttribute(prop, typeof(pb_InspectorIgnoreAttribute)) != null) { continue; } pb_TypeInspector typeInspector = pb_InspectorResolver.AddTypeInspector(target, transform, property: prop); typeInspector.onTypeInspectorSetValue = this.OnTypeInspectorSetValue; } foreach (FieldInfo fil in target.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)) { if (System.Attribute.GetCustomAttribute(fil, typeof(pb_InspectorIgnoreAttribute)) != null) { continue; } pb_TypeInspector typeInspector = pb_InspectorResolver.AddTypeInspector(target, transform, field: fil); typeInspector.onTypeInspectorSetValue = this.OnTypeInspectorSetValue; } }
public static pb_TypeInspectorAttribute GetAttributeValue(pb_TypeInspector ti) { var att = ti.GetType().GetCustomAttribute(typeof(pb_TypeInspectorAttribute), true) as pb_TypeInspectorAttribute; if (att != null && att is pb_TypeInspectorAttribute) { return(att); } return(null); }
/** * Get a type inspector that most closely matches type. * If an exact type match is found, that inspector is returned. If no exact match is found, * the first base class match found. If no base class is found, a generic object inspector * is returned, which in turn will reflect the properties and fields contained and attempt to * build inspectors for each. */ public static pb_TypeInspector GetInspector(Type type) { if (inspectorLookup == null) { InitializeLookup(); } GameObject inspectorObject; if (inspectorPool.TryGetValue(type, out inspectorObject)) { return(GameObject.Instantiate(inspectorObject).GetComponent <pb_TypeInspector>()); } List <GameObject> inspectors = new List <GameObject>(); foreach (KeyValuePair <IEnumerable <pb_TypeInspectorAttribute>, GameObject> kvp in inspectorLookup) { foreach (pb_TypeInspectorAttribute attrib in kvp.Key) { if (attrib.CanEditType(type)) { if (attrib.type == type) { inspectors.Insert(0, kvp.Value); goto EXACT_TYPE_INSPECTOR_FOUND; } else { inspectors.Add(kvp.Value); } } } } EXACT_TYPE_INSPECTOR_FOUND: if (inspectors.Count > 0) { inspectorPool.Add(type, inspectors[0]); inspectorObject = GameObject.Instantiate(inspectors[0]); pb_TypeInspector typeInspector = inspectorObject.GetComponent <pb_TypeInspector>(); typeInspector.SetDeclaringType(type); return(typeInspector); } else { GameObject go = new GameObject(); go.name = "Generic Object Inspector: " + type; pb_TypeInspector typeInspector = go.AddComponent <pb_ObjectInspector>(); typeInspector.SetDeclaringType(type); return(typeInspector); } }
protected override void InitializeGUI() { _meshCollider = (MeshCollider)target; pb_GUIUtility.AddVerticalLayoutGroup(gameObject); pb_TypeInspector enabled_inspector = pb_InspectorResolver.GetInspector(typeof(bool)); enabled_inspector.Initialize("Enabled", UpdateEnabled, OnSetEnabled); enabled_inspector.onValueBeginChange = () => { Undo.RegisterState(new UndoReflection(_meshCollider, "enabled"), "Mesh Collider Enabled"); }; enabled_inspector.transform.SetParent(transform); }
private static void InitializeLookup() { inspectorPool = new Dictionary <Type, GameObject>(); inspectorLookup = new Dictionary <IEnumerable <pb_TypeInspectorAttribute>, GameObject>(); foreach (GameObject go in Resources.LoadAll(TYPE_INSPECTOR_PATH, typeof(GameObject))) { pb_TypeInspector typeInspector = go.GetComponent <pb_TypeInspector>(); if (typeInspector == null) { continue; } IEnumerable <Attribute> typeAttribs = (IEnumerable <Attribute>)typeInspector.GetType().GetCustomAttributes(true); inspectorLookup.Add(typeAttribs.Where(x => x != null && x is pb_TypeInspectorAttribute).Cast <pb_TypeInspectorAttribute>(), go); } }
private static void InitializeLookup() { inspectorPool = new Dictionary <Type, GameObject>(); inspectorLookup = new Dictionary <pb_TypeInspectorAttribute, GameObject>(); foreach (GameObject go in Resources.LoadAll(TYPE_INSPECTOR_PATH, typeof(GameObject))) { pb_TypeInspector typeInspector = go.GetComponent <pb_TypeInspector>(); if (typeInspector == null) { continue; } pb_TypeInspectorAttribute t = AttributeExtension.GetAttributeValue(typeInspector); Attribute[] typeAttribs = new Attribute[1] { t }; inspectorLookup.Add(t, go); } }
protected override void InitializeGUI() { pb_GUIUtility.AddVerticalLayoutGroup(gameObject); _transform = (Transform)target; pb_TypeInspector position_inspector = pb_InspectorResolver.GetInspector(typeof(Vector3)); pb_TypeInspector rotation_inspector = pb_InspectorResolver.GetInspector(typeof(Vector3)); pb_TypeInspector scale_inspector = pb_InspectorResolver.GetInspector(typeof(Vector3)); position_inspector.Initialize("Position", UpdatePosition, OnSetPosition); rotation_inspector.Initialize("Rotation", UpdateRotation, OnSetRotation); scale_inspector.Initialize("Scale", UpdateScale, OnSetScale); position_inspector.onValueBeginChange = () => { Undo.RegisterState(new UndoTransform(_transform), "Set Position: " + _transform.position.ToString("G")); }; rotation_inspector.onValueBeginChange = () => { Undo.RegisterState(new UndoTransform(_transform), "Set Rotation: " + _transform.localRotation.eulerAngles.ToString("G")); }; scale_inspector.onValueBeginChange = () => { Undo.RegisterState(new UndoTransform(_transform), "Set Scale: " + _transform.localScale.ToString("G")); }; position_inspector.transform.SetParent(transform); rotation_inspector.transform.SetParent(transform); scale_inspector.transform.SetParent(transform); }
public override void InitializeGUI() { title.text = GetName().SplitCamelCase(); value = GetValue <ICollection>(); if (value != null) { // much boxing array = value.Cast <object>().ToArray(); if (array.Length < 1 || array.Length > 32) { return; } if (DeclaringType == null || DeclaringType.GetElementType() == null) { return; } System.Type elementType = DeclaringType.GetElementType(); string typeName = elementType.ToString().Substring(elementType.ToString().LastIndexOf('.') + 1); for (int i = 0; i < array.Length; i++) { pb_TypeInspector inspector = pb_InspectorResolver.GetInspector(elementType); inspector.SetIndexInCollection(i); inspector.Initialize(typeName, (int index) => { return(array[index]); }, SetValueAtIndex); inspector.transform.SetParent(collection); } } }