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