1. 程式人生 > >Unity編輯器擴充套件

Unity編輯器擴充套件

(我們自己寫的指令碼放在 Editor檔案裡(Editor 自己建立 跟建立Scenes檔案一樣))

1 增加簡單選單欄(第一排選單欄)

(我們使用靜態方法便於呼叫     不用靜態方法   我們Unity不能顯示出來)

public Class  Tools  {

   [MenuItem("Tools/Test1",false,1)] 

  (MenuItem)這個上面新增選單


(Test1 是名稱)

 static  void Test1()   //除錯資訊  點選Test1  控制檯輸出“ 加油”
    {
        Debug.Log("加油");

    }

    [MenuItem("Tools/Test2",false,12)]//在選單欄上新增自己的方法   選單欄中橫線 分類   相鄰的兩個選單要想用橫線劃分 priority必須相差11


    static void Test2()
    {
        Debug.Log("加油");
    }
    [MenuItem("Tools/Test3",false,0)]//在選單欄上新增自己的方法


    static void Test3()
    {
        Debug.Log("加油");
    }

[MenuItem("Tools/Test3",false,0)]  引數  第一個是名稱 和路徑  第二個預設為false  第三個(priority 優先順序)作用有兩個 a:排序 數字越小越排在前面 列如 Test3 第三個引數為0 所以排在前  b:分界線  相鄰的兩個選單如果第三個引數相差11就會有分界線  列如Test1 和Test2


    [MenuItem("GameObject/myTool", false, 10)]//在已有的選單欄上新增自己的方法
10表示 放在很前面 第一級 

Hierarchy面板中也可以使用了


    static void myTool()
    {
        Debug.Log("加油德瑪西亞");
    }

}

2  給我們自己寫的選單欄新增快捷鍵

  • %-CTRL 在Windows / CMD在OSX
  • # -Shift
  • & -Alt
  • LEFT/RIGHT/UP/DOWN-游標鍵
  • F1…F12
  • HOME,END,PGUP,PDDN

字母鍵不是key-sequence的一部分,要讓字母鍵被新增到key-sequence中必須在前面加上下劃線(例如:_g對應於快捷鍵”G”)

快捷鍵的組合被新增在選單項的路徑後面,並以一個空格分隔

例子 上面的Test3

    [MenuItem("Tools/Test3 %a",false,0)]//在選單欄上新增自己的方法
    static void Test3()
    {
        Debug.Log("加油");
    }

%a 代表快捷鍵 ctrl+A


    [MenuItem("Tools/Test3 _g",false,0)]//在選單欄上新增自己的方法
    static void Test3()
    {
        Debug.Log("加油");

    }

_g  代表快捷鍵 G


3.給元件的右鍵選單欄新增按鈕

舉例  Camera 的Camera元件 

public Class CameraEditor{

//CONTEXT  元件   Camera 元件名 (指令碼名)  InitHealthAndSpeed  按鈕名

    [MenuItem("CONTEXT/Camera/changeView")]

// MenuCommand  表示該元件(Camera)  cmd.context  表示該Camera 元件的內容

    static void ChangeViem(MenuCommand cmd)   

    {

      //強制轉換為Camera

       Camera ca=cmd.context as Camera;  

        Debug.Log("加油");
    }

}


如上圖 我們右擊Camera  時  顯示出我們寫的按鈕 changeView 點選 輸出 “加油”

4.使用Selection獲取選擇的遊戲物體

   [MenuItem("Tools/showInfo", false, 1)]
    static void Test1()
    {

        Debug.Log(Selection.activeGameObject.name);// 顯示我們第一個選擇的遊戲物體

     Debug.Log(Selection.objects.Length);// 獲取我們選擇遊戲物體的個數(Preject 和Hierarchy都可以)

      Debug.Log(Selection.transforms.Length);// 只能獲取在Hierarchy面板上選擇物體的個數

    }


選擇遊戲物體  點選我們寫的按鈕  輸出的是 我們選擇遊戲物體的名字

   /// <summary>
   /// 刪除選擇的物體
   /// </summary>
    [MenuItem("GameObject/my delete", false, 11)]
    static void mydelete()
    {
       foreach (var o in Selection.objects)
       {

           GameObject.DestroyImmediate(o);//使用這個方法寫的 刪除掉的物體我們不能進行撤銷

 Undo.DestroyObjectImmediate(o); //使用這個方法寫的 刪除掉的物體我們可以進行撤銷

       }
       //需要把刪除操作註冊到操作記錄裡面

    }


選擇遊戲物體 點選 我們寫的按鈕 可以刪除

(我自己試過 選擇兩個刪除沒問題  選擇三個以上刪除Unity會關閉)

   [MenuItem("GameObject/myTool", false, 10)]//在選單欄上新增自己的方法


    static void myTool()
    {
        Debug.Log("加油德瑪西亞");
    }


    [MenuItem("GameObject/my delete", true, 11)]//在選單欄上新增自己的方法
    static bool MyDeleteValidate()
    {
        if (Selection.objects.Length>0)
        {
            return true;
        }
        return false;
    }

5.控制選單項是否啟用的功能

    [MenuItem("GameObject/my delete", true, 11)]//在選單欄上新增自己的方法  

                             (在執行下面那個方法前 先進行這個方法的驗證)

                             (第二個引數為true 表示驗證該方法是否可行)

    static bool MyDeleteValidate()
    {
        if (Selection.objects.Length>0)
        {
            return true;
        }
        return false;
    }


    [MenuItem("GameObject/my delete", false, 11)]//在選單欄上新增自己的方法
    static void mydelete()
    {
       foreach (var o in Selection.objects)
       {
           //GameObject.DestroyImmediate(o);
           Undo.DestroyObjectImmediate(o); //使用這個方法寫的 刪除掉的物體我們可以進行撤銷
       }
       //需要把刪除操作註冊到操作記錄裡面
    }


沒有選擇物體的時候   我們寫的按鈕 為灰色 表示不可用 


選擇遊戲物體的時候  我們寫的按鈕  表示可用

6. 給自己寫的腳本里新增按鈕(系統自帶的元件不能使用該方法)

例子 : 我們寫了一個Cube指令碼 掛載到我們建立的Cube物體上  

我們在Cube指令碼中 寫下如下 語句(給Cube添加了SetScale指令碼)

  [ContextMenu("SetScale")]
    void SetScale()
    {
        pox = 100;
    }


 給我們指令碼的屬性新增按鈕

例子: 

  [ContextMenuItem("Test","Test1")]   

   第一個引數表示我們按鈕的名稱    第二個引數 是我們點選按鈕執行 的方法

    public float pox=10;

  void Test1()
    {
        Debug.Log("加油");

    }


當我們右擊Pox屬性的時候  顯示出我們的按鈕Test 點選它執行方法 輸出“加油”

7 如何建立對話方塊 (用於統一修改資料)

public class EnemyChange :ScriptableWizard //(ScriptableWizard   繼承這個對話方塊的類)
{
    [MenuItem("Tools/CreateWizard")]  //建立按鈕
    static void CreateWizard()

    {

//  下面這個方法是用來顯示對話方塊的   EnemyChange 是我們 需要指定的型別   (這裡是我們的類)

// "統一修改敵人"是我們給對話方塊取的名字

//"ChangeValue"  我們對話方塊上的按鈕名字

//"Other Button" 我們自己額外建立的按鈕

        ScriptableWizard.DisplayWizard<EnemyChange>("統一修改敵人","ChangeValue","Other Button");   
    }
    public int changeSpeed = 10;  // 我們要展現出來修改的屬性




  //給我們新增的按鈕 新增一個方法
    void OnWizardOtherButton()
    {
        Debug.Log("加油");       //點選OtherButton  會執行該方法  (按下之後不會關閉這個對話方塊,按下另外一                                                                                                               個按鈕 會關閉該對話方塊)

    }

 void OnWizardCreate()    //檢測 對話方塊的按鈕  的點選

    { 

(修改我們選擇物體上的腳本里面的屬性)

          GameObject[] enemyPrefabs = Selection.gameObjects;  //儲存我們選擇的物體
        foreach (var go in enemyPrefabs)   //遍歷我們選擇的物體
        {
         Cube cb   =   go.GetComponent<Cube>();   //得到我們選擇的物體上的指令碼
            Undo.RecordObject(cb,"change"); // 記錄我們 的操作 便於撤銷 “change”是隨便起的名字
            cb.speed += changeSpeed;   //修改指令碼屬性
        }

    }

    // 當前對話方塊彈出來和欄位值修改的時候會被呼叫
    void OnWizardUpdate()
    {
        helpString = null;
        errorString = null;
        if (Selection.gameObjects.Length>0)
        {
            helpString = "您當前選擇了:" + Selection.gameObjects.Length + "個敵人";  // 幫助資訊提示
           // helpString = "加油";
        }
        else
        {
            errorString="請選擇至少一個敵人";     //  錯誤資訊提示(紅色提示字)
        }
    }
    // 當我們選擇改變的時候 會被呼叫
    void OnSelectionChange()
    {
        OnWizardUpdate();
    }

}

8.如何顯示提示資訊

使用ShowNotification這個方法顯示提示資訊

ShowNotification(new GUIContent(Selection.gameObjects.Length + "個遊戲物體的值被修改了")); 


9 使用EditorPrefabs 儲存資料

private int changeSpeed=10;

   // 當視窗被創建出來 的時候呼叫的

    void OnEnable()
    {
     changeSpeed =  EditorPrefs.GetInt("changeSpeed", changeSpeed);

    }

 // 當前對話方塊彈出來和欄位值修改的時候會被呼叫
    void OnWizardUpdate()

    {

    EditorPrefs.SetInt("changeSpeed",changeSpeed); //儲存我們的修改的值

    }

作用 當我們修改值的時候  會被對話方塊 儲存下來  

例子 :

      把15修改為20   點選AddSpeed   


再重新開啟   我們的值是不是修改並儲存下來了呢


10.顯示進度條

編輯進度條

 EditorUtility.DisplayProgressBar("進度","0/"+enemyPrefabs.Length+"完成修改值",0);

int  count=0;

count++;

 EditorUtility.DisplayProgressBar("進度", count+"/" + enemyPrefabs.Length + "完成修改值", count/enemyPrefabs.Length);


 EditorUtility.ClearProgressBar();    進度條完成後 關閉進度條

11.建立自定義視窗

using UnityEditor;

public class MyWindow : EditorWindow {  // 繼承自這個類EditorWindow

    [MenuItem("Window/Show myWindow")]
    static void ShowMyWindow()
    {
     MyWindow  window   =   EditorWindow.GetWindow<MyWindow>();
        window.Show();   // 顯示出來這個視窗
    } 
}

  private string name=null;
    //繪製視窗
    void OnGUI()
    {
        GUILayout.Label("這是我的視窗");
      name=  GUILayout.TextField(name);
        if (GUILayout.Button("建立"))
        {

            GameObject go=new GameObject(name);

Undo.RegisterCreatedObjectUndo(go,"create gameObjet");  //註冊到操作記錄裡   可以撤銷操作

        }
    }

相關推薦

Unity 編輯擴充套件總結 一:編輯開發入門

編輯器擴充套件總結 工欲善其事必先利其器 引言: 在專案開發中,編輯器擴充套件為開發者提供了開發自定義工具的功能,讓開發者更加便利地使用編輯器開發專案。近期小生一直在學習編輯器擴充套件的知識,發現網路上關於編輯器知識點的部落格較為零散且混亂。當然,有一些大佬已經總結的很

unity編輯擴充套件#2 GUILayout、EditorGUILayout 控制元件整理

  GUILayout 裝飾類控制元件: GUILayout.FlexibleSpace(); GUILayout.Space(100);//空格,沒什麼好說的 GUILayout.Label("label"); GUILayout.Box(new GUICo

unity編輯擴充套件#1 自定義視窗、面板、和屬性

擼一遍unity官方文件的給的三個案例:https://docs.unity3d.com/2017.4/Documentation/Manual/editor-EditorWindows.html 自定義視窗 首先,要注意和編輯器相關的指令碼都應該把放到Editor資料夾裡,可以有多個E

Unity編輯擴充套件:如何把asset 格式的資源轉成png

Assets Store 上提供了大量的優秀素材給開發者使用,包括模型貼圖UI音樂等等。但是一些上傳者可能出於特殊原因,上傳的素材格式是unity內建的.asset 格式,這樣的格式對於直接拿來在unity中使用的開發者當然沒有影響,但是遇到素材本身不是完全符合需求,需要做一些修

Unity編輯擴充套件:如何把圖集(Atlas)拆分成單個圖片

遊戲開發中可能會用到商店下載的圖集,但是如果只是用到一部分,卻把整個圖集打包到專案則明顯是不划算的。可以讓美術同事單獨把需要的圖片切出來,但是圖源比較多的話也是一個不小的工作。既然能夠拿到切好的圖集資料,是不是可以通過程式碼自動生成切好的小圖呢,答案當然是肯定的。這裡提供一個小工具,操作

Unity編輯擴充套件

(我們自己寫的指令碼放在 Editor檔案裡(Editor 自己建立 跟建立Scenes檔案一樣))1 增加簡單選單欄(第一排選單欄)(我們使用靜態方法便於呼叫     不用靜態方法   我們Unity不能顯示出來)public Class  Tools  {   [Menu

unity編輯 擴充套件之 快捷鍵寫法與意義

 using UnityEngine; using System.Collections; // using UnityEditor;<span style="white-space:pre"&

Unity編輯擴充套件-選單項

Unity編輯器允許你去新增像內建選單一樣外觀和行為的自定義選單。自定義選單對於那些經常使用的功能提供一種能從編輯器直接訪問的便捷方式。在這一課程中我將對每個描述的主題提供真實的使用示例,用於說明在unity中的選單項是如何建立和使用的。 新增選單項 為了要在頂層工具

Unity編輯擴充套件學習筆記(一)——新增選單選項

以前一直沒用到編輯器擴充套件這一塊,上一次用還是當初在培訓機構老師教編寫打包工具的時候,那時候剛接觸unity聽不大懂也不知道幹啥用。轉眼就過去了好久。 最近遇到一些情況,有時候需要修改多個GameObject身上的屬性,有時候需要按照規律建立多個GameObject,這些

Unity 編輯擴充套件 場景檢視內控制物件

using UnityEngine;using UnityEditor; [CustomEditor(typeof(EnemySpawn))]public class EnemySpawnEditor : Editor {     void OnSceneGUI()     {         EnemySp

Unity 編輯擴充套件

 Unity編輯器擴充套件 1 在工程目錄下新建 Editor 資料夾 Editor資料夾內的資源都不會被打包出去(包括PC 移動端等 只會在unity的編輯器模式執行)   //正常的新增選單欄     [MenuItem("Tools/test")]  

Unity 編輯擴充套件,讓開發更加快捷

      在unity開發中經常會對資源或者指令碼進行批量處理,開發自己的工具可以加快處理的速度。當然有的地方必須要用到編輯器類,例如資源打包的時候需要觸發,這時候就用到了。 1.MeuItam函式的使用,如下;當編輯器沒有你自定義的根選項時編輯器會新建一個選項,例如Too

Unity 編輯擴充套件教程

來自:candycat1992 http://blog.csdn.net/candycat1992/article/details/52067975 寫在前面 Unity最強大的地方之一是它擴充套件性非常強的編輯器。Unite Europe 20

Unity編輯擴充套件簡介】儲存資料

unity編輯器中有三種方式可以儲存資料。 EditorPrefs EditorPrefs可以在PC中儲存共享資料,即不受制於專案地儲存資訊 影響範圍 儲存的值會影響每一個大版本的Unity編輯器 以前儲存在Unity4.x的值只能在Unity 4

Unity編輯擴充套件(音效控制面板,路徑增刪)

using UnityEngine;using UnityEditor;using System.Collections.Generic;using System.Text;using System.IO;public class MusicWindowEditor : Ed

unity-編輯擴充套件

unity編輯器擴充套件很方便,可以省掉很多製作其他工具的時間(比如技能編輯器,特效編輯器等,都是資料結構的匯入匯出) 可以直接在 Scene 、Inspector 或者新建一個 Window 中編輯 1、Inspector

Unity - 編輯擴充套件

# 前言 對於Unity編輯器的擴充套件方法眾多,本文從最常用的一些方法入手,例如Inspector指令碼欄的擴充套件、頂選單欄的擴充套件等,圖文並茂闡述其完整用法。 本文大部分內容整理自 [獨立遊戲開發 - indienova](https://indienova.com/u/dev) 所著的 **Uni

unity編輯擴充套件學習

擴充套件編輯器實際上就是在unity選單欄中新增一些按鈕,可以一鍵執行一些重複性的工作。 一.新增按鈕 1.簡單使用MenuItem特性 using UnityEngine; using UnityEditor; public class Tools { [MenuItem("Tools/test

unity 編輯 ---獲取unity編輯中的所有視窗,並開啟顯示,以備後面編輯擴充套件

獲取原理:unity 所有視窗介面都繼承自編輯器UnityEditor程式集下的EditorWindow。而所有的編輯器視窗都在UnityEditor程式集裡定義,所以,我們通過反射獲取UnityEditor程式集獲取所有視窗就可以了。 直接上程式碼: using System; using

Unity編輯——Inspector 面板擴充套件

目錄 將EditorGUI 擴充套件在 Inspector 面板上 EditorWindows 視窗 EditorWindows 下拉選單 預覽視窗 獲取預覽資訊 將EditorGUI 擴充套件在 Inspector 面板上 ●  Ed