Unity - 編輯器擴充套件
阿新 • • 發佈:2020-04-05
# 前言
對於Unity編輯器的擴充套件方法眾多,本文從最常用的一些方法入手,例如Inspector指令碼欄的擴充套件、頂選單欄的擴充套件等,圖文並茂闡述其完整用法。
本文大部分內容整理自 [獨立遊戲開發 - indienova](https://indienova.com/u/dev) 所著的 **Unity使用技巧集合**,但僅選取了最常用的一些方法,並在自身專案上加以實現。
專案地址:[UnityEditor - SouthBegonia](https://github.com/SouthBegonia/UnityWorld/tree/master/UnityEditor)
本文僅供學習交流,如有任何侵權行為立即刪除。
## 指令碼欄的擴充套件
該部分的擴充套件方法集中在Inspector中指令碼面板,主要體現在程式碼實現指令碼欄中可視變數的規範化、便捷化
### [Header] 屬性標題
為後續區域程式碼擬訂一個標題,用於區分和概述該區域程式碼含義
```
[Header("武器")]
public int weapon;
public int ammunition;
public int aurability;
```
![](https://img2020.cnblogs.com/blog/1688704/202004/1688704-20200405151749141-1928331816.png)
### [Tooltip] 屬性提示
實現在Inspector中,滑鼠位於該變數名字上時,提示該變數的描述資訊
```
[Tooltip("玩家的名字,肯定不再是JOJO對吧")]
public string playerName;
```
![](https://img2020.cnblogs.com/blog/1688704/202004/1688704-20200405151759240-634109056.png)
### [Space] 空行屬性
在Inspector指令碼頁面建立空行以隔開上下可視引數
```
[Space]
public int health = 100;
```
![](https://img2020.cnblogs.com/blog/1688704/202004/1688704-20200405151806785-1474475001.png)
### [Range()] 範圍值屬性
使得變數的值僅可在該範圍內修改,並且可以在Inspector頁面呈現滑動修改變數的效果
```
[Range(0, 1000)]
public int exp = 0;
```
### [Foldout] 屬性摺疊
使得多個的變數在Inspector頁面實現集合、可摺疊效果。(注:本方法並非Unity自帶,而是源自專案[InspectorFoldoutGroup - PixeyeHQ](https://github.com/PixeyeHQ/InspectorFoldoutGroup),如需使用該方法,僅需要將專案的指令碼配置到自身unity專案下即可)
[](https://github.com/PixeyeHQ/InspectorFoldoutGroup)
```
[Pixeye.Unity.Foldout("Enemys")]
public GameObject a, b, c, d, e;
```
![](https://img2020.cnblogs.com/blog/1688704/202004/1688704-20200405151813751-122587915.png)
### [SerializeField] 強制序列化
使得private變數在Inspector指令碼頁面可見,同時也稱為強制序列化
```
[SerializeField]
private int coins;
```
### [HideInInspector] 隱藏屬性
使得public變數在Inspector頁面不可視,進而實現保護變數
```
[HideInInspector]
public int maxHealth = 100;
```
### [TextArea] 輸入域
對於字數較長的字串,擴充套件其在Inspector中的編輯區大小(原本僅能單行,且無法自動換行)
```
[TextArea]
public string gameDescribe = "";
```
![](https://img2020.cnblogs.com/blog/1688704/202004/1688704-20200405151849374-2025023061.png)
### [AddComponentMenu] 新增元件到選單
寫於類名前,可以將該類直接新增到Add Component選單中
```
[AddComponentMenu("Managers/demo1")]
public class demo1 : MonoBehaviour
{
// ...
}
```
![](https://img2020.cnblogs.com/blog/1688704/202004/1688704-20200405151856809-1323145254.png)
### OnValidate() 資料檢查
對編輯狀態下、Inspector中輸入的資料進行檢查的函式
```
private void OnValidate()
{
if (health < 0)
{
Debug.LogError("生命值不可為負");
health = 0;
}
else if (health > 100)
{
Debug.LogError("生命值不可超過最大值 " + maxHealth);
health = 100;
}
}
```
![](https://img2020.cnblogs.com/blog/1688704/202004/1688704-20200405151904221-1202016204.png)
### [ContextMenu] 上下文選單
可以為類增加一個上下文彈出選單,在Inspector頁面對當前指令碼右鍵(或者單擊指令碼圖示右側三個豎點)即可彈出自定義的上下文選單
```
[ContextMenu("顯示當前生命值")]
public void PrintHealth()
{
Debug.Log("Health = " + health);
}
```
![](https://img2020.cnblogs.com/blog/1688704/202004/1688704-20200405151911049-1273731685.png)
## 選單欄的擴充套件
### [MenuItem] 選單欄
在編輯狀態可點選上方自定義的選單欄項實現特定功能,即擴充套件選單欄項
```
[MenuItem("除錯/檢視版本資訊")]
static void PrintSomething()
{
// 注意:僅有靜態函式才可使用該屬性
Debug.Log("當前Unity版本:" + Application.unityVersion);
}
```
![](https://img2020.cnblogs.com/blog/1688704/202004/1688704-20200405151918374-1617159848.png)
# 參考
- [獨立遊戲開發 - IndiaNova](https://indienova.com/u/dev)
- [InspectorFoldoutGroup - PixeyeHQ](https://github.com/PixeyeHQ/InspectorFoldoutGroup)
- [你不可不知的Unity C#程式碼小技巧 - Michael Wang](https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247503312&idx=1&sn=f547e5a6dd9c8551ef028c330b5a74f1&chksm=fe1df97bc96a706df98e6d761aefbaff1270432676727eca883c6a426fafeaa1fa76728d26f3&mpshare=1&scene=1&srcid=&sharer_sharetime=1579407428670&sharer_shareid=3700fe0c888383356811eb94c583