private static bool RenderObjectField <T>(ref ComponentRef <T> componentRef) where T : class { bool dataChanged = false; GameObject gameObject = null; Component currentComponent = componentRef.GetBaseComponent(); //If T is a type of component can just use a normal object field if (typeof(Component).IsAssignableFrom(typeof(T))) { Component component = EditorGUILayout.ObjectField(kLabel, currentComponent, typeof(T), true) as Component; gameObject = component != null ? component.gameObject : null; } //Otherwise allow gameobject to be set and deal with typing when rendering index else { gameObject = (GameObject)EditorGUILayout.ObjectField(kLabel, currentComponent != null ? currentComponent.gameObject : null, typeof(GameObject), true); } //Render drop down for typed components on the gameobject if (gameObject != null) { //Show drop down to allow selecting different components on same game object int currentIndex = 0; Component[] allComponents = gameObject.GetComponents <Component>(); List <GUIContent> validComponentLabels = new List <GUIContent>(); List <Component> validComponents = new List <Component>(); List <Type> validComponentTypes = new List <Type>(); for (int i = 0; i < allComponents.Length; i++) { T typedComponent = allComponents[i] as T; if (typedComponent != null) { int numberComponentsTheSameType = 0; foreach (Type type in validComponentTypes) { if (type == allComponents[i].GetType()) { numberComponentsTheSameType++; } } validComponentLabels.Add(new GUIContent(allComponents[i].GetType().Name + (numberComponentsTheSameType > 0 ? " (" + numberComponentsTheSameType + ")" : ""))); validComponents.Add(allComponents[i]); validComponentTypes.Add(allComponents[i].GetType()); if (allComponents[i] == currentComponent) { currentIndex = validComponents.Count - 1; } } } if (validComponents.Count > 1) { int selectedIndex = EditorGUILayout.Popup(kLabel, currentIndex, validComponentLabels.ToArray()); dataChanged = currentComponent != validComponents[selectedIndex] || componentRef.GetComponentIndex() != selectedIndex; if (dataChanged) { componentRef = new ComponentRef <T>(componentRef.GetGameObjectRef().GetSourceType(), validComponents[selectedIndex], selectedIndex); } } else if (validComponents.Count == 1) { dataChanged = currentComponent != validComponents[0] || componentRef.GetComponentIndex() != 0; if (dataChanged) { componentRef = new ComponentRef <T>(componentRef.GetGameObjectRef().GetSourceType(), validComponents[0], 0); } } else if (validComponents.Count == 0) { dataChanged = currentComponent != null || componentRef.GetComponentIndex() != 0; if (dataChanged) { componentRef = new ComponentRef <T>(componentRef.GetGameObjectRef().GetSourceType()); } } } else { dataChanged = currentComponent != null || componentRef.GetComponentIndex() != 0; if (dataChanged) { componentRef = new ComponentRef <T>(componentRef.GetGameObjectRef().GetSourceType()); } } return(dataChanged); }