Unity編輯器擴展——自定義Scene窗口

一:Editor類

Editor類和EditorWindow類都繼承自同一個基類:ScriptableObject,他們均可以針對某種腳本類來進行操做
Editor類只能對指定腳本進行擴展,Inspector面板的顯示,或變量在Scene視圖中的可視化ide

使用到的類:
——GUILayout:繪製各類2D控件,好比按鈕、文本、可摺疊列表,以及對它們的分組和排版。這些控件既能夠繪製在Editor類裏,也能夠繪製在EditorWindow裏
——EditorGUILayout:與GUILayout相似,可是提供更多的預約義控件
——GUIUtility:繪製自定義的2D控件,好比進度條、對話框、打開文件夾
——EditorGUIUtility:繪製自定義的2D控件,好比進度條、對話框、打開文件夾
——Handles:繪製3D物體,好比線、面、扇形、方塊、圓錐
this

重寫OnSceneGUI方法進行繪製spa


二:準備

新建一個腳本MyHandles掛載到場景中的任意遊戲物體身上(只有選擇了掛載此腳本的遊戲物體纔會在執行OnSceneGUI方法)
新建場景擴展腳本SceneEditor並獲取到MyHandles對象
3d

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(MyHandles))]
public class SceneEditor : Editor
{
    MyHandles handles;
    private void OnEnable()
    {
        handles = target as MyHandles;
    }
}

三:代碼實現

——標籤Label
code

private void OnSceneGUI()
{
    Handles.Label(handles.transform.position, "this is cube");
}

——球形區域RadiusHandle
orm

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
blog

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");
}
相關文章
相關標籤/搜索