Unity3D編輯器擴充套件(五)——常用特性(Attribute)以及Selection類 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:返回按型別和模式過濾的當前選擇。
對於一個具有多個型別元件的選定的遊戲物件,只有第一個元件將包含在結果中。
如果型別是 Component 或 GameObject 的子類,則支援完整的 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:如果選擇裡包含資料夾,則也包括資料夾裡的檔案和子資料夾。