unity编辑器拓展整理(主要是siki的视频教程)
編輯器拓展
https://blog.csdn.net/zxl321365712/article/details/80080586
蠻牛上一個詳細的博客
http://www.manew.com/thread-90330-1-1.html
siki關于編輯器拓展的視頻教程(免費)
http://www.sikiedu.com/my/course/47
官方教程
https://unity3d.com/cn/learn/tutorials/topics/interface-essentials/unity-editor-extensions-menu-items
API界面
https://docs.unity3d.com/ScriptReference/MenuItem.html
編輯器腳本都在Editor下,在打包時不會包含
編輯器特性位于unityEditor命名空間下
?
添加菜單按鈕
[MenuItem("Tools/test")]//在菜單上顯示命令public static void Test()//點擊該命令后可以執(zhí)行這個方法,私有也可訪問{Debug.Log("Test Function is work");}public MenuItem(string itemName, bool isValidateFunction, int priority);
itemName路徑:每個/代表一級菜單
isValidateFunction是否為可用性檢查,在后面介紹。
priority優(yōu)先級,越小越靠上,當優(yōu)先級相差大于10以上時會分組
-
路徑重復時,后添加的菜單會覆蓋先添加的。
-
系統(tǒng)內置的功能也會被覆蓋。
-
Game Object中,優(yōu)先級小于50(不包括)的會顯示在hierarchy中。
-
component菜單下的內容必須繼承monobehaviour,因此需要使用AddComponentMenu添加,其他使用方法相似
允許加空格,空格后可設置快捷鍵,不可重復,如"Tools/test4 _q"
特殊快捷鍵如下:
* _ – 無
* % – CTRL on Windows / CMD on OSX
* # – Shift
* & – Alt
* LEFT/RIGHT/UP/DOWN – Arrow keys
* F1…F12 – F keys
* HOME, END, PGUP, PGDN
給腳本,組件添加右鍵菜單:
路徑用CONTEXT/[組件名]/[其他]
?
獲取點擊的組件:方法添加MenuCommand類參數(shù),其中context字段即為我們右鍵打開菜單的那個物體(或者組件)。建議存成對應類型再使用,可以用強制轉換,或者as。用as轉換,失敗時會返回空,而強制會報錯。
static public void RigidbodyTools(MenuCommand cmd){Rigidbody rigidbody = cmd.context as Rigidbody;}selection類
這個是unity用來獲取當前選中的物體的。可以得到用戶當前選中的物體。常用內容:
-
activeObject//當前選中的那個物體
-
Objects//所有選中的物體,返回一個數(shù)組
-
activeGameObject//當前選中的物體(一個,多個時為第一個)(包括預制體,不可改變物體)
-
gameObjects//所有選中的物體,返回一個數(shù)組,(包括預制體,不可改變物體)
-
activeTransform//當前選中的物體的transform
-
transforms//選中的物體中最高層級
?
添加可撤銷操作:
編輯器腳本中大多數(shù)操作不會注冊到棧中,不能使用
使用Undo,操作的同時會加入棧中,使用ctrl+z可撤銷。
? ? [MenuItem("Tools/myDelete")]
? ?static void myDelete()
? ?{
? ? ? ?foreach(Object o in Selection.gameObjects)
? ? ? ?{
? ? ? ? ? ?//Object.DestroyImmediate(o);
? ? ? ? ? ?Undo.DestroyObjectImmediate(o);
? ? ? ?}
? ?}
(編輯器腳本只能使用DestroyImmediate)
相關操作:
-
DestroyObjectImmediate//可撤銷的刪除物體
-
RecordObject//記錄之后物體的改變
-
RegisterCreatedObjectUndo//記錄物體創(chuàng)建
?
控制菜單的可用性
添加一個路徑同名的MenuItem,第二個參數(shù)isValidateFunction設為true,并設置一個bool型的方法。
當顯示菜單時會檢查這個方法,當返回false時不可用,true時可用。
建議方法后加validate(驗證)作為驗證方法。
當在hierarchy中添加菜單時,可用性都為真,但是返回假時不會執(zhí)行方法。(是bug吧)
?
在組件上直接添加菜單選項
可以使用ContextMenu可以在通常的組件中添加菜單選項。
不需要在Editor中,不用引用UnityEditor,方法為非靜態(tài)。
[ContextMenu("Renew")]
? ?void Renew()
? ?{
? ? ? ?Debug.Log("Renew work");
? ?}
?
給字段添加菜單
在字段前加[ContextMenuItem(string name, string function)]標簽
第一個參數(shù)為菜單名,第二個是調用的方法。這個方法必須聲明(可為私有)。
[ContextMenuItem("add value", "AddValue")]
public ?int value=0;
void AddValue()
{
? ? value += 10;
}
?
創(chuàng)建向導面板
首先創(chuàng)建一個面板類,在Editor文件夾下
該類繼承ScriptableWizard
使用ScriptableWizard.DisplayWizard<T>(title);創(chuàng)建面板
-
T:面板類的類型
-
title:面板的標題
-
一般將創(chuàng)建面板也放在面板類下方便查找,同時由于面板類繼承ScriptableWizard,創(chuàng)建不用ScriptableWizard.DisplayWizard,直接DisplayWizard即可。
面板類的公有方法會顯示在面板上,就像組件中一樣。
using UnityEditor;
public class ValueChangeWizard : ScriptableWizard {
? ?[MenuItem("Tools/ChangeValue", false, 40)]
? ?static void OpenChangeValue(MenuCommand cmd)
? ?{
? ? ? ?DisplayWizard<ValueChangeWizard>("Change Value");
? ?}
? ?//創(chuàng)建面板
? ?public int newValue = 1000;//公有方法會像組件中一樣顯示
? ?private int score=0;//私有方法不會顯示
}
ps:Wizard是巫師的意思
面板類都有一個按鈕creat,使用DisplayWizard的第二個參數(shù)改變顯示名。
有一些默認的方法,自動在按下時調用:
? ?private void OnWizardCreate()
? ?{
? ?}//點擊創(chuàng)建按鈕調用,調用后默認關閉窗口
? ?private void OnWizardOtherButton()
? ?{
? ?}//點擊其他按鈕調用
? ?private void OnWizardUpdate()
? ?{
? ?}//打開或向導的值改變時調用
?? private void OnSelectionChange()
? ?{
? ?}//每當選中物體發(fā)生更改時調用
//類似的消息方法還有一些,可以在API中查到。
?
面板類的提示信息
isValid//按鈕是否可用
errorString//錯誤信息
helpString//幫助信息
createButtonName//creat按鈕顯示內容
otherButtonName//ortherButton顯示內容
?
顯示通知
(EditorWindow.)ShowNotification(GUIContent notification);
參數(shù)為一個GUIContent對象,
GUIContent(string text, Texture image, string tooltip);
可以設置文字text,圖片image,tooltip
ShowNotification(new GUIContent("ShowNotification", new Texture2D(200,200), "tooltip"));
?
tooltip,可以作為標簽加到字段前,用于設置懸浮時顯示的提示信息。
[Tooltip("新的值")]
????public int ChangeValue = 10;
沒搞懂怎么在消息提示中使用。
?
編輯器數(shù)據(jù)保存
EditorPrefs
使用方法與PlayerPrefs相同,不在重復
?
一些零碎的實用功能
EditorUtility中集成了一些實用的方法,主要是提示,信息框等。
EditorUtility.DisplayProgressBar(string title, string info, float progress);
參數(shù):
title 標題
info 信息
progress 0到1之間的一個值,表示進度。
每當進行一定步驟后,調用這個方法實現(xiàn)進度條。
以下是一個每次點擊增加一點進度條的實現(xiàn)。
????int count = 0;
????private void OnWizardOtherButton()
????{
????????EditorUtility.DisplayProgressBar("title", "info", count/10.0f);
????????count++;
????????if (count > 10)
????????{
????????????EditorUtility.ClearProgressBar();
????????????count = 0;
????????}
????}
?
創(chuàng)建窗口
使用EditorWindow,與 ScriptableWizard相似,創(chuàng)建時有些許不同。
可以使用OnGUI顯示一些內容。
using UnityEditor;
using UnityEngine;
public class MyWindow : EditorWindow
{
????[MenuItem("Tools/MyWindow")]
????static void ShowMyWindow()
????{
????????MyWindow window = EditorWindow.GetWindow<MyWindow>();
????????window.Show();
????}
????//打開這個窗口的命令
????private string name;
????private void OnGUI()
????{
????????GUILayout.Label("string");//顯示一個字符串
????????name = GUILayout.TextField(name);//顯示一個輸入框
????}
}
?
特殊目錄位置
下面是一些默認的排序優(yōu)先級
?
總結
以上是生活随笔為你收集整理的unity编辑器拓展整理(主要是siki的视频教程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 说
- 下一篇: 2023年山东最新建筑八大员(资料员)考