1. 程式人生 > >Unity3D編輯器擴充套件(五)——常用特性(Attribute)以及Selection類 Unity3D編輯器擴充套件(一)——定義自己的選單按鈕 Unity3D編輯器擴充套件(二)——定義自己的視窗 Unity3D編輯器擴充套件(三)——使用GUI繪製視窗 Unity3D編輯器擴充套件(四)—

Unity3D編輯器擴充套件(五)——常用特性(Attribute)以及Selection類 Unity3D編輯器擴充套件(一)——定義自己的選單按鈕 Unity3D編輯器擴充套件(二)——定義自己的視窗 Unity3D編輯器擴充套件(三)——使用GUI繪製視窗 Unity3D編輯器擴充套件(四)—

前面寫了四篇關於編輯器的:

Unity3D編輯器擴充套件(一)——定義自己的選單按鈕

Unity3D編輯器擴充套件(二)——定義自己的視窗

Unity3D編輯器擴充套件(三)——使用GUI繪製視窗

Unity3D編輯器擴充套件(四)——擴充套件自己的元件

今天我們來講解在編輯器擴充套件中我們常用的特性(Attribute)以及 Selection 類。

常用特性(Attribute):

1、InitializeOnLoad:監聽Unity3D啟動事件。需要將該指令碼放在Editor資料夾下,Unity3D點選Play按鈕或者修改過該指令碼,編譯完成後會呼叫該類的靜態建構函式。可以給 EditorApplication.update 委託新增方法,達到持續呼叫的效果。

程式碼:

using UnityEngine;
using UnityEditor;

[InitializeOnLoad]
public class Startup
{
    static Startup()
    {
        Debug.Log("Up and running");
        EditorApplication.update += Update;
    }

    static void Update()
    {
        Debug.Log("Updating");
    }
}

效果圖:

 

2、InitializeOnLoadMethod:與 InitializeOnLoad 效果一樣。

程式碼:

using UnityEngine;
using UnityEditor;

public class MyClass
{
    [InitializeOnLoadMethod]
    static void OnProjectLoadedInEditor()
    {
        Debug.Log("Project loaded in Unity Editor");
    }
}

效果圖:

 

3、HideInInspector:屬性面板中隱藏相關的屬性。

程式碼:

using UnityEngine;

public class Player : MonoBehaviour 
{
    public int hp = 5;
    [HideInInspector]
    public int attack = 1;
}

效果圖:attack 被隱藏,只能看見 hp

 

4、Tooltip:滑鼠放到屬性上的時候,會自動提示幫助/提示資訊。

程式碼:

using UnityEngine;

public class Player : MonoBehaviour 
{
    [Tooltip("玩家生命值")]
    public int hp = 5;
    [HideInInspector]
    public int attack = 1;
}

效果圖:

 

5、Range:用於將一個值指定在一定的範圍內,並在Inspector面板中為其新增滑塊。

程式碼:

using UnityEngine;

public class Player : MonoBehaviour 
{
    [Tooltip("玩家生命值")]
    public int hp = 5;
    [HideInInspector]
    public int attack = 1;
    [Range(0f,10f)]
    public float speed = 5f;
}

效果圖:

 

6、RequireComponent:“自動”幫你新增你需要(依賴)的元件,如果已經存在則不再重複新增,且不能移除。

提示:經過測試,發現一個問題,如果指令碼已經掛在物體身上,然後再修改指令碼,為新增 RequireComponent 屬性的話,完全不起作用,因此建議大家在用此屬性的時候要注意。

程式碼:

using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour 
{
    [Tooltip("玩家生命值")]
    public int hp = 5;
    [HideInInspector]
    public int attack = 1;
    [Range(0f,10f)]
    public float speed = 5f;
}

效果圖:

 

7、HelpURL:提供一個自定義的文件連結,點選元件上的文件圖示既能開啟到你指定的連結。

提示:填寫連結時,一定要寫上 http:// 或者 https://,否則將無任何反應。

程式碼:

using UnityEngine;

[HelpURL("http://www.baidu.com")]
[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour 
{
    [Tooltip("玩家生命值")]
    public int hp = 5;
    [HideInInspector]
    public int attack = 1;
    [Range(0f,10f)]
    public float speed = 5f;
}

效果圖:

 

8、Multiline:用於給 string 型別新增多行輸入。

程式碼:

using UnityEngine;

[HelpURL("http://www.baidu.com")]
[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour 
{
    [Multiline(3)]
    public string nickName = "";
    [Tooltip("玩家生命值")]
    public int hp = 5;
    [HideInInspector]
    public int attack = 1;
    [Range(0f,10f)]
    public float speed = 5f;
}

效果圖:

 

9、Header:用於新增屬性的標題。

程式碼:

using UnityEngine;

[HelpURL("http://www.baidu.com")]
[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour 
{
    [Header("玩家暱稱")]
    [Multiline(3)]
    public string nickName = "";

    [Tooltip("玩家生命值")]
    public int hp = 5;

    [HideInInspector]
    public int attack = 1;

    [Range(0f,10f)]
    public float speed = 5f;
}

效果圖:

 

10、Space:用於為在 Inspector 面板 兩屬性之間新增指定的距離。

程式碼:

using UnityEngine;

[HelpURL("http://www.baidu.com")]
[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour 
{
    [Header("玩家暱稱")]
    [Multiline(3)]
    public string nickName = "";

    [Tooltip("玩家生命值")]
    public int hp = 5;

    [HideInInspector]
    public int attack = 1;

    [Range(0f,10f)]
    public float speed = 5f;
    [Space(50)]
    public bool isMove = false;
}

效果圖:

 

11、ContextMenu:允許新增一個命令到該元件上,你可以通過右鍵或者點選設定圖示來呼叫到它(一般用於函式),且是在非執行狀態下執行該函式。這個我們在第一篇講新增選單時,也提到過。

程式碼:

using UnityEngine;

[HelpURL("http://www.baidu.com")]
[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour 
{
    [Header("玩家暱稱")]
    [Multiline(3)]
    public string nickName = "";

    [Tooltip("玩家生命值")]
    public int hp = 5;

    [HideInInspector]
    public int attack = 1;

    [Range(0f,10f)]
    public float speed = 5f;
    [Space(50)]
    public bool isMove = false;

    [ContextMenu("DoSomething")]
    private void DoSomething()
    {
        Debug.Log("Do Something......");
    }
}

效果圖:

 

12、Gizmos: 繪製圖形。

程式碼:

using UnityEngine;

[HelpURL("http://www.baidu.com")]
[RequireComponent(typeof(Rigidbody))]
public class Player : MonoBehaviour 
{
    [Header("玩家暱稱")]
    [Multiline(3)]
    public string nickName = "";

    [Tooltip("玩家生命值")]
    public int hp = 5;

    [HideInInspector]
    public int attack = 1;

    [Range(0f,10f)]
    public float speed = 5f;
    [Space(50)]
    public bool isMove = false;

    [ContextMenu("DoSomething")]
    private void DoSomething()
    {
        Debug.Log("Do Something......");
    }

    private void OnDrawGizmos()
    {
        Gizmos.DrawWireSphere(Vector3.zero, 3f);
    }
}

效果圖:

 

上面都是我們常用的一些特性,下面來介紹一下我們在編輯器擴充套件中常用的類 Selection

Selection 類是編輯器類,使用需要 using UnityEditor; 且指令碼要放在 Editor 資料夾。


 靜態變數:
 Selection.activeGameObject:返回當前點選的場景遊戲物體或Project預製體;選擇多個則返回第一個選擇的;未選擇相應的則返回null
 Selection.activeTransform:返回當前點選的場景遊戲物體;選擇多個則返回第一個選擇的;未選擇相應的則返回null
 Selection.activeObject:返回當前點選的場景遊戲物體或Project資源(包括場景、指令碼、預製等任意);選擇多個則返回第一個選擇的;未選擇相應的則返回null
 Selection.gameObjects:返回一個數組,內容為當前點選的場景物體或Project預製體;不符合條件的當前選擇不會加入到陣列;未選擇返回長度為0的陣列而不是null
 Selection.transforms:返回一個數組,內容為當前點選的場景物體;不符合條件的當前選擇不會加入到陣列;未選擇返回長度為0的陣列而不是null
 Selection.objects:返回一個數組,內容為當前點選的場景物體或Project資源(包括場景、指令碼、預製等任意);不符合條件的當前選擇不會加入到陣列;未選擇返回長度為0的陣列而不是null
 Selection.selectionChanged:委託,選擇的東西變化的時候呼叫


 靜態函式
 Contains:選擇項中是否包含物體
 bool Selection.Contains(int instanceID)
 bool Selection.Contains(Object obj)


 GetFiltered:返回按型別和模式過濾的當前選擇。
 對於一個具有多個型別元件的選定的遊戲物件,只有第一個元件將包含在結果中。
 如果型別是 ComponentGameObject 的子類,則支援完整的 SelectionMode
 如果型別不是 Component GameObject 的子類,(例如:網格或指令碼物件)則只支援有 SelectionMode.ExcludePrefab  SelectionMode.Editable
 Object[] activeGos= Selection.GetFiltered( GameObject,SelectionMode.Editable | SelectionMode.TopLevel);


 GetTransforms:允許使用 SelectionMode 對選擇型別進行細粒度的控制。
 Transform[] selectionObjs= Selection.GetTransforms(SelectionMode.TopLevel | SelectionMode.Editable);
 Unfiltered:返回整個選擇
 TopLevel:只返回最上面選擇的transform。另一個選定的transform的選定子物體將被過濾掉。
 Deep:返回選擇的物體和它所有的子代
 ExcludePrefab:排除選擇裡的所有預製體
 Editable:排除任何不被修改的物件。
 Assets:只返回Asset資料夾的資源
 DeepAssets:如果選擇裡包含資料夾,則也包括資料夾裡的檔案和子資料夾。