一:Editor类
Editor类和EditorWindow类都继承自同一个基类:ScriptableObject,他们都可以针对某种脚本类来进行操作
Editor类只能对指定脚本进行扩展,Inspector面板的显示,或变量在Scene视图中的可视化
使用到的类:
——GUILayout:绘制各种2D控件,比如按钮、文本、可折叠列表,以及对它们的分组和排版。这些控件既可以绘制在Editor类里,也可以绘制在EditorWindow里
——EditorGUILayout:与GUILayout类似,但是提供更多的预定义控件
——GUIUtility:绘制自定义的2D控件,比如进度条、对话框、打开文件夹
——EditorGUIUtility:绘制自定义的2D控件,比如进度条、对话框、打开文件夹
——Handles:绘制3D物体,比如线、面、扇形、方块、圆锥
重写OnSceneGUI方法进行绘制
二:准备
新建一个脚本MyHandles挂载到场景中的任意游戏物体身上(只有选择了挂载此脚本的游戏物体才会在执行OnSceneGUI方法)
新建场景扩展脚本SceneEditor并获取到MyHandles对象
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(MyHandles))]
public class SceneEditor : Editor
{
MyHandles handles;
private void OnEnable()
{
handles = target as MyHandles;
}
}
三:代码实现
——标签Label
private void OnSceneGUI()
{
Handles.Label(handles.transform.position, "this is cube");
}
——球形区域RadiusHandle
private void OnSceneGUI()
{
Handles.RadiusHandle(handles.transform.rotation, handles.transform.position, 1);
}
——位置轴PositionHandle
private void OnSceneGUI()
{
for (int i = 0; i < handles.trans.Length; i++)
{
Handles.PositionHandle(handles.trans[i].position, handles.trans[i].rotation);
}
}
——旋转轴RotationHandle
private void OnSceneGUI()
{
for (int i = 0; i < handles.trans.Length; i++)
{
Handles.RotationHandle(handles.trans[i].rotation, handles.trans[i].position);
}
}
——绘制线段DrawLine
private void OnSceneGUI()
{
Handles.DrawLine(handles.trans[0].position, handles.trans[1].position);
}
——绘制2D控件
在场景窗口中绘制2D控件必须声明在Handles.BeginGUI()和Handles.EndGUI()内
private void OnSceneGUI()
{
Handles.BeginGUI();
GUIWindow();
Handles.EndGUI();
}
private void GUIWindow()
{
GUILayout.Window(1, new Rect(50, 50, 0, 0), id =>
{
GUI.contentColor = Color.white;
EditorGUILayout.LabelField("this is window");
EditorGUILayout.ColorField(Color.cyan);
EditorGUILayout.Toggle("Toggle", false);
GUILayout.Button("Button");
GUI.DragWindow();
}, "Window");
}