Unity編輯器拓展
一.什麼是編輯器拓展
Unity是一個編輯器,編輯器就是可以進行編輯的工具,比如我們的文字Text就是一個文字編輯器,那我們的Unity其實就是用來編輯遊戲的,編輯的擴充套件就是對編輯器本身的功能進行新增。但是由於Unity是不開源的引擎,所以我們只能使用特定的功能去編輯。
UNITY3D的IDE本身的強大,除了表現在其提供的強大功能外,更讓人喜歡的,是它高度的可擴充套件特性。這也是一個專案開發中,必不可少的環節。
二.選單按鈕的拓展
對選單按鈕進行拓展,首先新建一個C#指令碼MenuItemTool。
首先引入名稱空間 UnityEditor
1.使用方法MenuItem來建立選單
比如我們建立一個用來清除快取的按鈕。引號裡面是選單的名字,ClearMemory是一級選單,二級和三級選單用/表示。
[MenuItem("ClearMemory/ClearAll")]
我們想在點選ClearAll的時候執行某些方法,需要在下面建立一個和選單名相同的靜態方法。
static void ClearAll()
{
Debug.Log("清除所有快取");
}
在這裡,建立的方法必須是靜態的,如果不是靜態的,選單就不能顯示
因為靜態成員是和類一起存在的,有了類就有了靜態成員,我們可以直接通過類來呼叫靜態成員,非靜態成員是和物件一起存在的,有了物件才有非靜態成員,非靜態成員通過物件來訪問。
2.修改優先順序
MenuItem裡面除了新增選單名字外,還可以新增兩個引數,F12點進MenuItem可以檢視
優先順序和是否可用,數字越小,優先順序越高
[MenuItem("ClearMemory/ClearAll",false,1)]
static void ClearAll()
{
Debug.Log("清除所有快取");
}
[MenuItem("ClearMemory/ClearOther/ClearShopInfor", false, 2)]
static void ClearShopInfor()
{
Debug.Log("清除商店快取");
}
這裡:true代表不可用,False可用,true的時候,選單不顯示,沒有設定優先順序的選單取子選單的最大優先順序。
3.選單分組
我們會發現在選單中會有一條線把二級選單分開,這個就是多二級選單進行分組。
只要兩個選單的優先順序相差11,就會進行分組
4.在系統自帶的選單下面新增二級選單
比如在GameObject中新增選單,我們只需要新增GameObject/
沒有新增優先順序,是在最下面的,我們可以測試一下在什麼優先順序對應的排名。
也可以把我們的Text插入到二級選單中。
三.屬性面板拓展
1.貼圖的增加
在Script中新建一個指令碼ChangeInspector,首先我們讓指令碼顯示一張貼圖
public Texture texture;
回到場景中,建立一個空的物體Enemy,將我們建立的指令碼掛在上面,此時,我們的屬性面板中就會顯示TexTure屬性,但是我們發現,我們只能在這裡選擇貼圖,但是看不見貼圖。那我們就通過編輯Inspector面板來顯示出貼圖
我們在Editor中新建一個指令碼InspectorEditor。繼承Editor類,並匯入名稱空間
然後我們給他自定義指令碼
[CustomEditor(typeof(ChangeInspector))]
我們要把貼圖顯示出來,就要繪製一個貼圖層
重寫一下OnInspectorGUI,我們要拓展面板裡的屬性,必須要重寫這個方法
獲取一下物件
接下來開始繪製貼圖層
objectField有四個引數:標籤 貼圖 型別 是否允許指定物體,最後轉換成Texture型別
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
ChangeInspector inspectorObj = (ChangeInspector)target;
//繪製帖圖槽
inspectorObj.texture =EditorGUILayout.ObjectField("選擇貼圖", inspectorObj.texture, typeof(Texture), true) as Texture;
}
回到面板中,我們就可以看到我們的貼圖可以顯示出來了
此時我們就可以把Texture屬性隱藏了
[HideInInspector]
public Texture texture;
2.修改Rect
我們再建立一個Rect型別的屬性rectValue
public Rect rectValue;
回到Editor中修改
RectField中的引數:標籤 顯示的目標
inspectorObj.rectValue = EditorGUILayout.RectField("視窗座標", inspectorObj.rectValue);
3.文字輸入框
inspectorObj.remark = EditorGUILayout.TextField("輸入姓名", inspectorObj.remark);
4.滑動條
public float sliderValue = 0.8f;
inspectorObj.sliderValue = EditorGUILayout.Slider("進度值",inspectorObj.sliderValue, 0f, 1f);
三個引數,初始值 最小值最大值
5.複選框public bool isOpen = true;
inspectorObj.isOpen = EditorGUILayout.Toggle("開始", inspectorObj.isOpen);
6.下拉列表
我們在Script中新建一個指令碼ToolType,新增一個名稱空間Tool,並新增一個列舉型別EdirType
namespace Tool
{
public enum EdirType
{
up,
down,
left,
right
}
public class ToolType : MonoBehaviour {
}
}
回到ChangeInspector指令碼中,引用一下Tool名稱空間
定義一個列舉值theType預設為up
private EdirType theType = EdirType.up;
public EdirType TheType
{
get {
return theType;
}
set {
theType = value;
}
}
回到Editor中,也引用一下名稱空間
繪製下拉列表
inspectorObj.TheType = (EdirType)EditorGUILayout.EnumPopup("方向", inspectorObj.TheType);
7.繪製一個分組,通過複選框決定是否開啟
到Editor中
宣告一個bool值 GroundEnable=false
GUILayout.Label("*****以下是附加設定*****");//首先繪製一個Label
groundEnable = EditorGUILayout.BeginToggleGroup("是否開啟附加設定", groundEnable);//用GroundEnable來控制開啟分組
inspectorObj.theValue1 = EditorGUILayout.FloatField("1", inspectorObj.theValue1);//繪製兩個float型別的值
inspectorObj.theValue2 = EditorGUILayout.FloatField("2", inspectorObj.theValue2);
inspectorObj.isAdd = EditorGUILayout.Toggle("開啟", inspectorObj.isAdd);//繪製一個複選框
EditorGUILayout.EndToggleGroup();//閉合分組
8.擴充套件自帶元件
在Editor中新建一個指令碼CameraEditor
繼承Editor 引用名稱空間
自定義指令碼
[CustomEditor(typeof(Camera))]
重寫一下GUI
這裡因為我們要重寫自帶的屬性,所以應該使用base.DrawDefaultInspector
public override void OnInspectorGUI()
{
base.DrawDefaultInspector();
GUILayout.Label("1111111111111");//我們新增一個Label
if (GUILayout.Button("點選處理"))//繪製一個按鈕
{
Debug.Log("檢測到點選了");
}
}
其他的元件也是一樣,想要擴充套件哪一個元件,我們就把元件的名字傳進來
相關推薦
Unity編輯器拓展之二:ReorderableList可重新排序的列表框(複雜使用)
先看效果gif圖: 如果沒有看過Unity編輯器拓展之一:ReorderableList可重新排序的列表框(簡單使用)的,可以先看這一篇: http://blog.csdn.net/qq_26999509/article/details/77782177 在此基
【unity編輯器拓展】使用指令碼新增Prefab到場景中
有時候想自動將預製新增到場景中,但是又不想破壞預製的連結關係,這時候可以使用PrefabUtility類進行操作。 1、使用AssetDatabase.GetAssetPath獲取預製路徑 fore
Unity編輯器拓展
一.什麼是編輯器拓展 Unity是一個編輯器,編輯器就是可以進行編輯的工具,比如我們的文字Text就是一個文字編輯器,那我們的Unity其實就是用來編輯遊戲的,編輯的擴充套件就是對編輯器本身的功能進行新增。但是由於Unity是不開源的引擎,所以我們只能使用特定的功能去編輯。
unity編輯器拓展四——刪除場景空Animator元件
1.描述 美術做場景的時候,工作量很大,不會去按照程式的思維,把什麼都做得很規範。 就會造成有很多空的Animator元件留在物件上,那個物件會被複制使用,就會變得更 多。我們專案我遇到的最多的一次,一個場景有600多個空的Animator元件,好恐怖, 怎麼
unity編輯器拓展之自動生成指令碼模板
專案開發過程中,UI面板有許多,關於UI面板上面按鈕,文字是應該宣告public直接拖拽賦值還是應該定義成private一層層去find,其中利弊各有說法,以前有個老大說是find會影響執行速度,但是現在的老大又不讓直接拖拽賦值,說實話這些東西都無所謂,用哪種方式主要
Unity編輯器拓展之二十一:拓展Unity模組,打造私人工具庫(二)
拓展Unity模組,打造私人工具庫(二) 前言: 上一篇,實現了基本Unity模組拓展的功能,本篇將介紹如何通過反射來實現匯入UnityPackage Gif示意圖 程式匯入UnityPackage 通過查閱UnityEditor原始碼發現
unity編輯器拓展二——一鍵調整scene中物件座標朝向
1.描述 在專案中,我們遇到很多這種情況,美術製作的時候從來不管座標朝向,真正使用起來就會有各種問題。 需要美術來調整座標朝向的時候,物體數量很多,就會很麻煩,很枯燥的工作,還得耐主性子一個一個調整。 如圖,我們今天要做的是不動任何物體的情況下,一鍵控
unity編輯器拓展七——指令碼建立模型
描述: 其實這個教程到處都是,我真正想做的是把模型分成N個等分,實現動態載入。但是在網上搜索了很久,也沒有搜尋 到合適的方法,要麼就是不寫清楚,捨不得把程式碼全部放出來。要麼就是自帶地形的切割,最想要的是,t4m 刷完後直 接將模型分成N分,所以只能苦逼的從
Unity編輯器拓展之六:利用反射開啟Unity Preferences Window
如何利用反射開啟Unity Preferences Window Unity Preferences Window如下圖所示: 作為Unity 的引數設定視窗,這個視窗支援新增項,當然本文不介紹這個內容,本次介紹如何利用反射、以及Unity Editor
Unity編輯器拓展之三:拓展Unity的Hierarchy面板
效果圖: 上圖中在Hierarchy右側繪製了Toggle,Label,以及自定義的texture和Unity原聲的Texture,知道了原理,其實這些都很簡單。。 這裡主要是使用了EditorApplication類下的HierarchyWindowI
(轉 )Unity對Lua的編輯器拓展
wid isnull view 菜單 操作 out rec 平臺 src 轉 http://blog.csdn.net/ZhangDi2017/article/details/61203505 當前版本的Unity(截至Unity5.5.x)中TextAsset類不支持後
編輯器拓展九——用代碼實現unity菜單命令
中一 post body 同時 selected 使用 最大的 自動調用 ima 描述 今天給美術寫了個工具,通過一些檢查把一些有問題的物件選出來,並讓其中一個處於選中狀態, 方便美術有方向的修改。中間遇到了一個問題,有問題的物件太多,點一次工具,需要按一下F來把
Unity編輯器開發,使用CustomPropertyDrawer實現枚舉中文顯示
常常 image list 動畫 但是 var tty tip enum 在Unity開發中,枚舉常常被用到。但是Unity自身對於枚舉值,並不能做好中文的支持。無論是Head或者Tool
Unity 編輯器擴展 場景視圖內控制對象
eight tex ons 圖標 ble enca 研究 microsoft 敵人 如果有一個敵人生成器類。當中有個屬性range用來表示敵人生成的範圍區域大小。那麽能夠用OnDrawGizmos函數來繪制它在場景視圖所代表的區域大小。便於開發調試。這個敵人生成器類,類
Unity編輯器生成可配置編輯文件
prefab tga 可編輯 edit 字段 work highlight save csharp using UnityEditor; public class PoolManagerEditor { [MenuItem("Manager/Creat Game
編輯器拓展七——不實例化的情況下修改Assets下面的文件
如果 ica 文件 () pan 通過 個數 material spec 描述 1.今天接了個任務,因為公司的項目展示界面的人物與武器都用了standard與standard(specular steup),這個兩個自帶的材質球是帶霧效的,然後收到場景的影響 在ui界面
【unity實用技能】unity編輯器工具之加載預制(Prefab)和場景(Scene)
無在unity裏做打包或者幫策劃美術做工具的時候經常會需要把Prefab拉出來或者場景打開做檢驗工作 其實這個在上一篇在ui打包的文章裏有提到,不過重點不同,上篇重點是打包,這篇的重點是把裏面的一個小知識點拉出來講一講 接下來就講講兩者分別怎麽做 一、把預制Prefab拉出來 就是像我們平時把預制拉到這個地方
使用C#的Conditional特性與Unity編輯器宏命令做條件編譯
運行時 符號 unit log edit ext 通過 space 編譯 概要 在傳統的C#項目中,用Conditional特性做條件編譯時,需要在Visual Studio中項目的屬性裏添加上條件編譯符號,用法參考這篇文章。 而在Unity項目中,條件編譯符號需要在Uni
通過反射調用Unity編輯器提供的各種功能
代碼 ndt 就是 分享 uil ons uila 方式 引用關系 Unity編輯器功能豐富易上手,其實編輯器提供的大多數菜單操作,在代碼裏面都是能夠找到對應接口的,但是這些接口都沒有對我們開放,怎麽辦? 很簡單,直接使用反射調用即可。 首先使用Reflector或IL
Unity 編輯器之Inspector面板編輯
編輯器有很多類:編輯器類。例如:EditorGUI(編輯器介面),EditorGUILayout(編輯器介面佈局),EditorGUIUtility(編輯器介面工具)等等這些,都是編輯器對介面進行編輯。 EditorGUILayout 編輯器介面佈局 介面的相關事件機制總共有9個: 1.