public override void OnGUI() { using (gui.Horizontal()) { bool isNull = member.IsNull(); bool isObjectField = prefs.Bools.ValueOrDefault(id); gui.Text(displayText, isNull ? "null" : memberValue.name + " (" + memberTypeName + ")"); var fieldRect = gui.LastRect; { GUIHelper.PingField(fieldRect, memberValue, !isNull && isObjectField); } if (gui.SelectionButton("object")) { Func <UnityObject[], string, Tab> newTab = (values, title) => new Tab <UnityObject>( @getValues: () => values, @getCurrent: member.As <UnityObject>, @setTarget: member.Set, @getValueName: obj => obj.name, @title: title ); bool isGo = memberType == typeof(GameObject); SelectionWindow.Show("Select a " + memberTypeName, newTab(UnityObject.FindObjectsOfType(memberType), "All"), newTab(isGo ? (UnityObject[])gameObject.GetChildren() : gameObject.GetComponentsInChildren(memberType), "Children"), newTab(isGo ? (UnityObject[])gameObject.GetParents() : gameObject.GetComponentsInParent(memberType), "Parents"), newTab(isGo ? PrefabHelper.GetGameObjectPrefabs().ToArray() : PrefabHelper.GetComponentPrefabs(memberType).Cast <UnityObject>().ToArray(), "Prefabs") ); } } }
protected override void Initialize() { _nullString = string.Format("null ({0})", memberTypeName); if (memberValue != null) { _polymorphicType = memberValue.GetType(); _isToStringImpl = _polymorphicType.IsMethodImplemented("ToString", Type.EmptyTypes); } else { _isToStringImpl = memberType.IsMethodImplemented("ToString", Type.EmptyTypes); } _getDraggedObject = objs => { for (int i = 0; i < objs.Length; i++) { var drag = objs[i]; if (drag == null) { continue; } var go = drag as GameObject; if (go != null) { if (!memberType.IsA <Component>()) { continue; } var c = go.GetComponent(memberType); if (c != null) { return(c); } } if (drag.GetType().IsA(memberType)) { return(drag); } } return(null); }; _isDropAccepted = objs => _getDraggedObject(objs) != null; _newTypeTab = (getValues, create, title) => new Tab <Type>( @getValues: getValues, @getCurrent: () => { var x = memberValue; return(x == null ? null : x.GetType()); }, @setTarget: newType => { if (newType == null) { memberValue = memberType.GetDefaultValueEmptyIfString(); } else { create(newType); } }, @getValueName: type => type.GetNiceName(), @title: title ); _newUnityTab = (getValues, title) => new Tab <UnityObject>( @getValues: getValues, @getCurrent: member.As <UnityObject>, @setTarget: member.Set, @getValueName: obj => obj.name + " (" + obj.GetType().GetNiceName() + ")", @title: title ); int idx = 0; if (memberType.IsInterface) { _tabs = new Tab[4]; _tabs[idx++] = _newUnityTab(() => UnityObject.FindObjectsOfType <UnityObject>() .OfType(memberType) .ToArray(), "Scene"); _tabs[idx++] = _newUnityTab(() => PrefabHelper.GetComponentPrefabs(memberType) .ToArray(), "Prefab"); _tabs[idx++] = _newTypeTab(() => ReflectionHelper.GetAllUserTypesOf(memberType) .Where(t => t.IsA <MonoBehaviour>() && !t.IsAbstract) .ToArray(), TryCreateInstanceInGO, "New Behaviour"); } else { _tabs = new Tab[1]; } var systemTypes = ReflectionHelper.GetAllUserTypesOf(memberType) .Where(t => !t.IsA <UnityObject>() && !t.IsAbstract) .ToArray(); if (memberType.IsGenericType && !systemTypes.Contains(memberType)) { ArrayUtility.Add(ref systemTypes, memberType); } _tabs[idx] = _newTypeTab(() => systemTypes, TryCreateInstance, "System Type"); var display = attributes.GetAttribute <DisplayAttribute>(); if (display != null) { _autoAlloc = (display.ObjOpt & Obj.AutoAlloc) != 0; _disablePicker = (display.ObjOpt & Obj.DisablePicker) != 0; } }
protected virtual void SelectionButton() { var tabs = new List <Tab>(); Action <Func <Type[]>, Action <Type>, string> newTypeTab = (getValues, create, title) => tabs.Add(new Tab <Type>( @getValues: getValues, @getCurrent: () => { var x = memberValue; return(x == null ? null : x.GetType()); }, @setTarget: newType => { if (newType == null) { memberValue = memberType.GetDefaultValueEmptyIfString(); } else { create(newType); } }, @getValueName: type => type.Name, @title: title )); if (memberType.IsInterface) { Action <Func <UnityObject[]>, string> newUnityTab = (getValues, title) => tabs.Add(new Tab <UnityObject>( @getValues: getValues, @getCurrent: member.As <UnityObject>, @setTarget: member.Set, @getValueName: obj => obj.name + " (" + obj.GetType().Name + ")", @title: title )); newUnityTab(() => UnityObject.FindObjectsOfType <UnityObject>() .OfType(memberType) .ToArray(), "Scene"); newUnityTab(() => PrefabHelper.GetComponentPrefabs(memberType) .ToArray(), "Prefabs"); newTypeTab(() => GetAllUserTypesOf(memberType) .Where(t => t.IsA <MonoBehaviour>()) .Where(t => !t.IsAbstract) .ToArray(), TryCreateInstanceInGO, "MonoBehaviours"); } newTypeTab(() => GetAllUserTypesOf(memberType) .Disinclude(memberType.IsAbstract ? memberType : null) .Where(t => !t.IsA <UnityObject>() && !t.IsAbstract) .ToArray(), TryCreateInstance, "System types"); var click = Event.current.button; if (gui.SelectionButton("Left click: select type. Right click: try instantiate")) { if (click == 0) { SelectionWindow.Show("Select a `" + memberTypeName + "` object", tabs.ToArray()); } else if (click == 1) { try { memberValue = memberType.ActivatorInstance(); } catch (Exception e) { Debug.Log("Error. Couldn't create instance: " + e.Message); } } } }
protected virtual void SelectionButton() { if (childCount < 1) { using (gui.State(false)) { gui.SelectionButton("Object doesn't have any children/implementers"); } } else { var tabs = new List <Tab>(); Action <Func <Type[]>, Action <Type>, string> newTypeTab = (getValues, create, title) => tabs.Add(new Tab <Type>( @getValues: getValues, @getCurrent: () => { var x = memberValue; return(x == null ? null : x.GetType()); }, @setTarget: newType => { if (newType == null) { memberValue = memberType.GetDefaultValueEmptyIfString(); } else { create(newType); } }, @getValueName: type => type.Name, @title: title )); if (memberType.IsInterface) { Action <Func <UnityObject[]>, string> newUnityTab = (getValues, title) => tabs.Add(new Tab <UnityObject>( @getValues: getValues, @getCurrent: member.As <UnityObject>, @setTarget: member.Set, @getValueName: obj => obj.name + " (" + obj.GetType().Name + ")", @title: title )); newUnityTab(() => UnityObject.FindObjectsOfType <UnityObject>() .OfType(memberType) .ToArray(), "Scene"); newUnityTab(() => PrefabHelper.GetComponentPrefabs(memberType) .ToArray(), "Prefabs"); newTypeTab(() => ReflectionHelper.GetAllUserTypesOf(memberType) .Where(t => t.IsA <MonoBehaviour>()) .Where(t => !t.IsAbstract) .ToArray(), TryCreateInstanceInGO, "MonoBehaviours"); } newTypeTab(() => ReflectionHelper.GetAllUserTypesOf(memberType) .Disinclude(memberType.IsAbstract ? memberType : null) .Where(t => !t.IsA <UnityObject>() && !t.IsAbstract) .ToArray(), TryCreateInstance, "System types"); if (gui.SelectionButton()) { SelectionWindow.Show("Select a `" + memberTypeName + "` object", tabs.ToArray()); } } }