Unity擴展編輯器--類型3:Custom Editors

Custom Editorshtml

加速遊戲製做過程的關鍵是爲哪些頻繁使用的組件建立自定義的編輯器,爲了舉例,咱們將會使用下面這個極其簡單的腳本進行講解,它的做用是始終保持一個對象注視某一點。編輯器

public class LookAtPoint : MonoBehaviour {

    public Vector3 lookAtPoint = Vector3.zero;
    
    void Update () 
    {
        transform.LookAt (lookAtPoint);
    }
}

這個腳本會讓一個對象保持面向世界空間中的某一點,讓咱們作的更酷一點!ide

第一步是讓它在編輯器裏面正常工做:即便你沒有測試遊戲,也能讓這個腳本運行。咱們對它添加ExecuteInEditMode屬性來作這件事。測試

[ExecuteInEditMode]  
public class LookAtPoint : MonoBehaviour {

    public Vector3 lookAtPoint = Vector3.zero;
    
    void Update () {
        transform.LookAt (lookAtPoint);
    }
}

你能夠把這個腳本加在main camera上,而後在Scene視圖中拖拽相機測試一下。spa

Making a Custom Editor設計

測試發現工做正常表現良好,但咱們能夠爲它定製一個編輯器使其更加nice。爲了實現這個目的,咱們須要爲它建立一個編輯器,在名爲"Editor"的文件夾裏面建立一個LookAtPointEditor的C#腳本。3d

using UnityEngine;
using UnityEditor;
using System.Collections;

[CustomEditor(typeof(LookAtPoint))]
public class LookAtPointEditor : Editor 
{
    public void OnInspectorGUI()
    {
        LookAtPoint lap = (LookAtPoint)target;
        lap.lookAtPoint = EditorGUILayout.Vector3Field("Look At Point", lap.lookAtPoint);
        if(GUI.changed)
            EditorUtility.SetDirty(lap);
    }
}

這個類必須繼承Editor類。CustomEditor屬性告知Unity哪一個組件須要表現爲編輯器code

OnInspectorGUI方法中的代碼,當Unity在Inspcetor中顯示這個編輯器時執行。你能夠在這裏放入任何GUI代碼--它的工做和遊戲中的OnGUI方法相似,只不過它是在Inpector中執行,Editor定義了target屬性,以便讓你可以得到被檢視的對象。orm

經過檢查GUI.changed,若是發現用戶修改了任何值,EditorUtility.SetDirty代碼就會執行。其做用是將指定對象標記爲髒。htm

[Unity內部使用dirty標記去肯定資源何時被修改,而且須要被存盤。好比,你修改了一個prefab的MonoBehaviour或者ScriptableObject變量,你必須告訴Unity這個值被改變。Unity內置的組件,其內部在屬性變化時自動調用SetDirty方法,而像MonoBehaviour或者ScriptableObject卻不自動作這件事,因此若是你想讓變化的值可以存儲下來,你必需要調用SetDirty方法]

在這個例子中,咱們建立了一個相似於Transform編輯器中的3維向量編輯框,以下圖:

Yay for shiny editors

這兒還能夠作更多更多,可是目前就此爲止,咱們還要去釣更大的魚...^~^

Scene View Additions

你能夠在你自定義的編輯器中實現OnSceneGUI方法來爲Scene視圖添加額外代碼。在這個例子中,咱們會添加第2個位置處理器,以便讓用戶能夠在Scene視圖中拖拽注視點。

 

using UnityEngine;
using UnityEditor;
using System.Collections;

[CustomEditor(typeof(LookAtPoint))]
public class LookAtPointEditor : Editor 
{
    public void OnInspectorGUI()
    {
        LookAtPoint lap = (LookAtPoint)target;
        lap.lookAtPoint = EditorGUILayout.Vector3Field("Look At Point", lap.lookAtPoint);
        if(GUI.changed)
            EditorUtility.SetDirty(lap);
    }

    public void OnSceneGUI()
    {
        LookAtPoint lap = (LookAtPoint)target;
        lap.lookAtPoint = Handles.PositionHandle (lap.lookAtPoint, Quaternion.identity);
        if(GUI.changed)
            EditorUtility.SetDirty(lap);
    }//這個沒看到什麼效果,還沒太懂
}

OnSceneGUI工做就像OnInspectorGUI方法--除了它是在Scene視圖中運行。爲了幫助你製做編輯接口,你可使用Handles類中定義的方法。裏面定義的全部方法都是爲了在3D Scene

視圖中工做設計的。

若是你想放置2D GUI對象(GUI,EditorGUI或者其它的),你須要將他們包裝在Handles.BeginGUI()和Handles.EndGUI()中。

相關文章
相關標籤/搜索