//--Inspector面板
脚本挂在游戏对象上时,右侧会出现它的详细信息面板,这些信息是根据脚本中声明的public可序列化变量而来的。
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(InspectorExpandTestScript))]
public class InspectorExpandTestEditorScript : Editor
{
private bool m_EnableToogle;
public override void OnInspectorGUI()
{
//--获取脚本对象
InspectorExpandTestScript script = target as InspectorExpandTestScript;
//--绘制滚动条
script.scrollPos = EditorGUILayout.BeginScrollView(script.scrollPos);
script.myName = EditorGUILayout.TextField("myName", script.myName);
script.myId = EditorGUILayout.IntField("myId", script.myId);
script.prefab = EditorGUILayout.ObjectField("prefab", script.prefab, typeof(GameObject), true) as GameObject;
//--绘制按钮
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("btn1"))
{
Debug.Log("click btn1");
}
if (GUILayout.Button("btn2"))
{
Debug.Log("click btn2");
}
script.myEnum = (InspectorExpandTestScript.MyTestEnum)EditorGUILayout.EnumPopup("MyEnum", script.myEnum);
EditorGUILayout.EndHorizontal();
//--toogle组件
m_EnableToogle = EditorGUILayout.BeginToggleGroup("EnableToogle", m_EnableToogle);
script.toogle1 = EditorGUILayout.Toggle("toogle1", script.toogle1);
script.toogle2 = EditorGUILayout.Toggle("toogle2", script.toogle2);
EditorGUILayout.EndToggleGroup();
EditorGUILayout.EndScrollView();
}
}
如果需要拓展的面板比较复杂,建议分成两个文件存放,一个是脚本,一个是Editor脚本。
//-----------------------------------------------
//--EditorWindows窗口
log
using UnityEditor;
using UnityEngine;
public class EditorWindowsTestMyTools : EditorWindow
{
[MenuItem("Window/OpenMyTestWindow")]
static void Init()
{
EditorWindowsTestMyTools window = (EditorWindowsTestMyTools)EditorWindow.GetWindow(typeof(EditorWindowsTestMyTools));
window.titleContent = new GUIContent("MyTestWindow");
window.Show();
}
//private Texture m_MyTexture = null;
private float m_MyFloat = 5.0f;
private void Awake()
{
Debug.Log("Awake:窗口初始化时调用");
//m_MyTexture = AssetDatabase.LoadAssetAtPath<Texture>("Assets/unity.png");
}
private void OnGUI()
{
Debug.Log("OnGUI");
GUILayout.Label("Hello World!!!", EditorStyles.boldLabel);
m_MyFloat = EditorGUILayout.Slider("myFloat", m_MyFloat, -5, 5);
//GUI.DrawTexture(new Rect(0, 30, 100, 100), m_MyTexture);
}
private void OnDestroy()
{
Debug.Log("OnDestroy : 窗口销毁时调用");
}
private void OnFocus()
{
Debug.Log("OnFocus : 窗口拥有焦点时调用");
}
private void OnLostFocus()
{
Debug.Log("OnLostFocus : 窗口失去焦点时调用");
}
private void OnHierarchyChange()
{
Debug.Log("OnHierarchyChange : Hierarchy 视图发生改变时调用");
}
private void OnInspectorUpdate()
{
Debug.Log("OnInspectorUpdate : 每帧更新");
}
private void Update()
{
Debug.Log("Update : 每帧更新");
}
private void OnProjectChange()
{
Debug.Log("OnProjectChange : Project 视图发生改变时调用");
}
private void OnSelectionChange()
{
Debug.Log("OnSelectionChange : 在 Hierarchy 或者 Project 视图中选择一个对象时调用或对象变化时");
}
}
//--------------------------------------------------------
//--EditorWindows 下拉菜单
using UnityEditor;
using UnityEngine;
public class EditorWindowsXiaLaMenuMyTools : EditorWindow, IHasCustomMenu
{
public void AddItemsToMenu(GenericMenu menu)
{
menu.AddDisabledItem(new GUIContent("Disabled"));
menu.AddItem(new GUIContent("test1"), true, () =>
{
Debug.Log("test1");
});
menu.AddItem(new GUIContent("test2"), false, () =>
{
Debug.Log("test2");
});
menu.AddSeparator("test/");
menu.AddItem(new GUIContent("test/test3"), true, () =>
{
Debug.Log("test/test3");
});
}
[MenuItem("Window/OpenMyEditorWindowsXiaLa")]
static void EditorWindowsXiaLa()
{
EditorWindowsXiaLaMenuMyTools window = (EditorWindowsXiaLaMenuMyTools)GetWindow(typeof(EditorWindowsXiaLaMenuMyTools));
window.titleContent = new GUIContent("WindowsXiaLa");
window.Show();
}
}
需要实现 IHasCustomMenu接口。通过AddItem()方法来添加列表元素。
//----------------------------------------------------
//--预览窗口
using UnityEditor;
using UnityEngine;
[CustomPreview(typeof(GameObject))]
public class GameObjectPreviewMyTools : ObjectPreview
{
public override bool HasPreviewGUI()
{
return true;
}
public override void OnPreviewGUI(Rect r, GUIStyle background)
{
GUILayout.Label("GameObjectPreviewMyTools");
}
}
原理就是继承 ObjectPreview 并且重写 HasPreviewGUI OnPreviewGUI方法,接着通过代码进行绘制。
[CustomPreview(typeof(GameObject))]中的gameobject 代表需要重新绘制的预览对象,也可以是别的系统对象或自定义的脚本对象。
//-----------------------------------------
//--获取预览信息
在自定义窗口中显示预览模型。
using UnityEditor;
using UnityEngine;
public class GetPreviewInfoMyTools : EditorWindow
{
private GameObject m_MyGo;
private Editor m_MyEditor;
[MenuItem("Window/OpenMyPreviewInfo")]
static void Init()
{
GetPreviewInfoMyTools window = (GetPreviewInfoMyTools)GetWindow(typeof(GetPreviewInfoMyTools));
window.titleContent = new GUIContent("MyPreviewInfo");
window.Show();
}
private void OnGUI()
{
m_MyGo = (GameObject)EditorGUILayout.ObjectField(m_MyGo, typeof(GameObject), true);
if (m_MyGo != null)
{
if (m_MyEditor == null)
{
m_MyEditor = Editor.CreateEditor(m_MyGo);
}
m_MyEditor.OnPreviewGUI(GUILayoutUtility.GetRect(500, 500), EditorStyles.whiteLabel);
}
}
}
m_MyEditor.OnPreviewGUI()第二个参数,打开窗口会报错(DrawGUITexture: texture is null)但是不影响预览。
使用GUIStyle.none不会报错但是效果就不一样了。等解决。