Editor
ComponentSelector.cs
//----------------------------------------------
// NGUI: Next-Gen UI kit
// Copyright © 2011-2013 Tasharen Entertainment
//----------------------------------------------
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
///
/// EditorGUILayout.ObjectField doesn't support custom components, so a custom wizard saves the day.
/// Unfortunately this tool only shows components that are being used by the scene, so it's a "recently used" selection tool.
///
public clast ComponentSelector : ScriptableWizard
{
public delegate void OnSelectionCallback (MonoBehaviour obj);
System.Type mType;
OnSelectionCallback mCallback;
MonoBehaviour[] mObjects;
///
/// Draw a button + object selection combo filtering specified types.
///
static public void Draw (string buttonName, T obj, OnSelectionCallback cb, params GUILayoutOption[] options) where T : MonoBehaviour
{
GUILayout.BeginHorizontal();
bool show = GUILayout.Button(buttonName, "DropDownButton", GUILayout.Width(76f));
#if !UNITY_3_4
GUILayout.BeginVertical();
GUILayout.Space(5f);
#endif
T o = EditorGUILayout.ObjectField(obj, typeof(T), false, options) as T;
#if !UNITY_3_4
GUILayout.EndVertical();
#endif
if (o != null && Selection.activeObject != o.gameObject && GUILayout.Button("Edit", GUILayout.Width(40f)))
{
Selection.activeObject = o.gameObject;
}
GUILayout.EndHorizontal();
if (show) Show(cb);
else if (o != obj) cb(o);
}
///
/// Draw a button + object selection combo filtering specified types.
///
static public void Draw (T obj, OnSelectionCallback cb, params GUILayoutOption[] options) where T : MonoBehaviour
{
Draw(NGUITools.GetName(), obj, cb, options);
}
///
/// Show the selection wizard.
///
static void Show (OnSelectionCallback cb) where T : MonoBehaviour
{
System.Type type = typeof(T);
ComponentSelector comp = ScriptableWizard.DisplayWizard("Select " + type.ToString());
comp.mType = type;
comp.mCallback = cb;
comp.mObjects = Resources.FindObjectsOfTypeAll(type) as MonoBehaviour[];
}
///
/// Draw the custom wizard.
///
void OnGUI ()
{
EditorGUIUtility.LookLikeControls(80f);
GUILayout.Label("Recently used components", "LODLevelNotifyText");
NGUIEditorTools.DrawSeparator();
if (mObjects.Length == 0)
{
EditorGUILayout.HelpBox("No recently used " + mType.ToString() + " components found.\nTry drag & dropping one instead, or creating a new one.", MessageType.Info);
bool isDone = false;
EditorGUILayout.Space();
GUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
if (mType == typeof(UIFont))
{
if (GUILayout.Button("Open the Font Maker", GUILayout.Width(150f)))
{
EditorWindow.GetWindow(false, "Font Maker", true);
isDone = true;
}
}
else if (mType == typeof(UIAtlas))
{
if (GUILayout.Button("Open the Atlas Maker", GUILayout.Width(150f)))
{
EditorWindow.GetWindow(false, "Atlas Maker", true);
isDone = true;
}
}
GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();
if (isDone) Close();
}
else
{
MonoBehaviour sel = null;
foreach (MonoBehaviour o in mObjects)
{
if (DrawObject(o))
{
sel = o;
}
}
if (sel != null)
{
mCallback(sel);
Close();
}
}
}
///
/// Draw details about the specified monobehavior in column format.
///
bool DrawObject (MonoBehaviour mb)
{
bool retVal = false;
GUILayout.BeginHorizontal();
{
if (EditorUtility.IsPersistent(mb.gameObject))
{
GUILayout.Label("Prefab", "AS TextArea", GUILayout.Width(80f), GUILayout.Height(20f));
}
else
{
GUI.color = Color.grey;
GUILayout.Label("Object", "AS TextArea", GUILayout.Width(80f), GUILayout.Height(20f));
}
GUILayout.Label(NGUITools.GetHierarchy(mb.gameObject), "AS TextArea", GUILayout.Height(20f));
GUI.color = Color.white;
retVal = GUILayout.Button("Select", "ButtonLeft", GUILayout.Width(60f), GUILayout.Height(16f));
}
GUILayout.EndHorizontal();
return retVal;
}
}