【Unity】8.5 擴展編輯器

分類:Unity、C#、VS2015 編輯器

建立日期:2016-04-27 ide

1、簡介

能夠經過編輯器窗口 (Editor Windows) 建立本身在 Unity 中的自定義設計工具。來自EditorWindow (而非 MonoBehaviour )的腳本能夠影響 GUI/GUILayout 和 EditorGUI/EditorGUILayout 控件。或者,你可使用自定義檢視器 (Custom Inspectors) 顯示遊戲對象檢視器 (GameObject Inspector) 中的 GUI 控件。 函數

2、自定義編輯器窗口

你能夠在應用程序中建立任意數量的自定義窗口。這些窗口和檢視器 (Inspector)、場景 (Scene) 及其餘內置窗口的做用類似。這很是適合用來爲遊戲的子系統添加用戶界面。 工具

製做一個自定義編輯窗口 (Editor Window) 包括如下幾個步驟: 佈局

1. 建立一個來自 EditorWindow 的腳本。 測試

2. 使用代碼觸發窗口自動顯示。 spa

3. 執行工具的 GUI 代碼。 設計

一、編輯器窗口 (EditorWindow) code

爲製做編輯器窗口,腳本必須存儲在一個叫「Editor」的文件夾中。在這個源自編輯器窗口 (EditorWindow) 的腳本中編寫一個類。而後,在內部 OnGUI 函數中編寫 GUI 控件。 orm

下面是JavaScript代碼示例(固然也能夠用C#實現):

class MyWindow extends EditorWindow {

function OnGUI () {

// 實際的窗口代碼到這裏

}

}

MyWindow.js文件放置於工程中名爲「Editor」 的文件夾中。

二、顯示窗口

爲了在屏幕上顯示窗口,須要製做一個用於顯示的菜單項。這能夠經過建立一個可由 菜單項 (MenuItem) 屬性激活的函數來完成。

Unity 中的默認行爲是重複使用窗口。因此,再次選擇菜單項將顯示現有的窗口。能夠經過使用EditorWindow.GetWindow 函數實現,下面是JavaScript代碼示例(固然你也能夠改成用C#實現):

class MyWindow extends EditorWindow {

@MenuItem ("Window/My Window")

static function ShowWindow () {

EditorWindow.GetWindow (MyWindow);

}

function OnGUI () {

// 實際的窗口代碼到這裏

}

}

這樣將建立一個標準的、可停靠的編輯器窗口,該窗口能夠將其位置存儲在調用之間,能夠在自定義佈局中使用……等等。若是須要更多地控制建立的窗口,你可使用 GetWindowWithRect。

三、實施窗口的GUI

該窗口的實際內容經過執行 OnGUI 函數進行渲染。您可使用遊戲 GUI 中使用的 UnityGUI 類( GUI 和GUILayout)。除此以外,Unity還另外提供 了一些 GUI 控件,位於僅編輯器類EditorGUI 和EditorGUILayout中。這些類將添加到常規類中已經可用的控件上,因此你能夠隨意混合和匹配。

如下 C# 代碼顯示您如何能將 GUI 元素添加至您的自定義編輯器窗口:

using UnityEditor;
using UnityEngine;

public class MyWindow : EditorWindow
{
    string myString = "Hello World";
    bool groupEnabled;
    bool myBool = true;
    float myFloat = 1.23f;

    // 將名爲「My Window」的菜單項添加到窗口菜單
    [MenuItem("Window/My Window")]
    public static void ShowWindow()
    {
        //顯示現有窗口實例(若是不存在,請先建立一個)
        EditorWindow.GetWindow(typeof(MyWindow));
    }

    void OnGUI()
    {
        GUILayout.Label ("Base Settings", EditorStyles.boldLabel);
        myString = EditorGUILayout.TextField ("Text Field", myString);

        groupEnabled = EditorGUILayout.BeginToggleGroup ("Optional Settings", groupEnabled);
            myBool = EditorGUILayout.Toggle ("Toggle", myBool);
            myFloat = EditorGUILayout.Slider ("Slider", myFloat, -3, 3);
        EditorGUILayout.EndToggleGroup ();
    }
}

這個示例產生以下所示的窗口:

3、自定義檢視器

提升遊戲建立速度的關鍵是爲經常使用組件建立自定義檢視器。爲了方便舉例,咱們將使用一個很是簡單的腳本,該腳本能夠保持對象始終看着一個點。

下面是LookAtPoint.js示例:

var lookAtPoint = Vector3.zero;

function Update () {

transform.LookAt (lookAtPoint);

}

這將保持對象朝向世界座標空間的一個點。讓咱們來讓它變得酷點!

使編輯器良好運行的第一步是讓腳本即便在您未進行遊戲測試時也在運行。咱們經過爲其添加 ExecuteInEditMode 屬性來實現:

@script ExecuteInEditMode()

var lookAtPoint = Vector3.zero;

function Update () {

transform.LookAt (lookAtPoint);

}

嘗試將腳本添加至您的主相機並在「場景」(Scene) 視圖中將其四處拖動。

一、製做一個自定義編輯器

這已經很好了,可是咱們能夠經過自定義檢視器使其更加美觀。爲此,咱們須要爲它建立一個Editor 。

下面是在Editor文件夾中建立的一個叫作 LookAtPointEditor的JavaScript文件:

@CustomEditor (LookAtPoint)

class LookAtPointEditor extends Editor {

function OnInspectorGUI () {

target.lookAtPoint = EditorGUILayout.Vector3Field ("Look At Point", target.lookAtPoint);

if (GUI.changed)

EditorUtility.SetDirty (target);

}

}

注意該類必須繼承自Editor。其中,@CustomEditor 屬性報告 Unity 它將做爲哪一個組件的編輯器。

每當 Unity 顯示檢視器時,OnInspectorGUI 中的代碼都會被執行。所以,你能夠在此處聽任何 GUI 代碼 - 它像遊戲的 OnGUI() 同樣運行,但倒是在檢視器內部運行的。編輯器定義可用於訪問正被檢查的對象的目標屬性。

當用戶經過檢查 GUI.changed 而更改任何值時,EditorUtility.SetDirty 代碼將會被執行。

在這種狀況下,咱們會將向量 3 (Vector3) 字段之一用於變換檢視器 (Transform Inspector) - 以下:

image

還有不少工做沒有作,可是咱們先到此爲止了 - 重頭戲還在後面…

二、場景視圖添加

你能夠經過在自定義編輯器中執行 OnSceneGUI() 來爲場景視圖 (Scene View) 添加附加代碼。在這種狀況下,將添加第二個位置控制手柄,使用戶能夠在場景視圖中拖動觀察目標點。下面是JavaScript代碼示例:

@CustomEditor (LookAtPoint)

class LookAtPointEditor extends Editor {

function OnInspectorGUI () {

target.lookAtPoint = EditorGUILayout.Vector3Field ("Look At Point", target.lookAtPoint);

if (GUI.changed)

EditorUtility.SetDirty (target);

}

function OnSceneGUI () {

target.lookAtPoint = Handles.PositionHandle (target.lookAtPoint, Quaternion.identity);

if (GUI.changed)

EditorUtility.SetDirty (target);

}

}

OnSceneGUI 的運行和 OnInspectorGUI 同樣 - 除了前者是在場景視圖中運行的以外。爲便於製做編輯界面,可使用手柄 (Handles) 類中定義的函數。其中全部的函數都是爲三維場景 (3D Scene) 視圖設計的。 若是您想放置二維 GUI 對象(GUI、EditorGUI),須要將這些對象包含在 Handles.BeginGUI() 和 Handles.EndGUI() 的調用中。

相關文章
相關標籤/搜索