1. 程式人生 > >Unity編輯器拓展

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.