unity編輯器擴(kuò)展學(xué)習(xí)筆記

注意事項(xiàng):
必須在Assets/Editor文件下創(chuàng)建腳本
必須static微酬,這樣才能通過類名調(diào)用,否則需要通過對象調(diào)用
需要using UnityEngine;

(一)MenuItem添加菜單按鈕

[MenuItem("tools/test")] static void test() { Debug.Log("test"); }

效果
這里寫圖片描述

菜單欄出現(xiàn)tools,tools下有test,點(diǎn)擊test將執(zhí)行test()
(二)菜單優(yōu)先級

[MenuItem("tools/test", false, 444)] static void test() { Debug.Log("test"); } 
[MenuItem("tools/test", false, 44)] static void test3() { Debug.Log("test3"); } 
[MenuItem("tools/test2", false, 3444)] static void test2() { Debug.Log("test2"); }

效果
這里寫圖片描述

第三個(gè)參數(shù)為priority決定了優(yōu)先級画恰,越小同一級下越靠前
(三)project右鍵菜單

[MenuItem("Assets/test2", false, 3444)] static void test2() { Debug.Log("test2"); }

效果
這里寫圖片描述

這里寫圖片描述

(四)inspect某組件區(qū)域右鍵菜單
[MenuItem("CONTEXT/PlayerHealth/InitHealthAndSpeed")]// CONTEXT 組件名 按鈕名 
static void InitHealthAndSpeed() { Debug.Log("Init"); }

必須是 “CONTEXT/組件名/菜單名”
以下方法可獲取到操作的組件

[MenuItem("CONTEXT/PlayerHealth/InitHealthAndSpeed")]// CONTEXT 組件名 按鈕名
    static void InitHealthAndSpeed( MenuCommand cmd )//menucommand是當(dāng)前正在操作的組件
    {
        //Debug.Log(cmd.context.GetType().FullName);
        CompleteProject.PlayerHealth health = cmd.context as CompleteProject.PlayerHealth;
        health.startingHealth = 200;
        health.flashSpeed = 10;
        Debug.Log("Init");
    }

(五)獲取選擇物體,進(jìn)行操作

[MenuItem("GameObject/my delete", true, 11)]
    static bool MyDeleteValidate()
    {
        Debug.Log(Selection.activeGameObject.name );//Selection.activeGameObject是我們第一個(gè)選擇的游戲物體 
        if (Selection.objects.Length > 0)//Selection.objects獲得選擇所有物體
            return true;
        else
            return false;
    }

刪除選擇物體

[MenuItem("GameObject/my delete", false, 11)]
    static void Mydelete()
    {
        foreach (Object o in Selection.objects)
        {
            //GameObject.DestroyImmediate(o);//無法撤銷
            Undo.DestroyObjectImmediate(o);//利用Undo進(jìn)行的刪除操作 是可以撤銷的
        }
        //需要把刪除操作注冊到 操作記錄里面
    }

(六)快捷鍵

[MenuItem("Tools/test2 %q",false,100)]//快捷鍵為ctrl+q 
static void Test2() { Debug.Log("Test2"); }

注意事項(xiàng) %=ctrl #=shift &=alt 記得加空格
(七)菜單是否可用

[MenuItem("GameObject/my delete", true, 11)]//true時(shí)無法點(diǎn)擊
    static bool MyDeleteValidate()//驗(yàn)證方法蹲蒲,會最先執(zhí)行該方法梦染,返回true才能執(zhí)行其他方法
    {
        if (Selection.objects.Length > 0)
            return true;
        else
            return false;
    }

(八)ContextMenuItem和ContextMenu 不是在Editor下,而是在組件里 ContextMenu組件區(qū)域右鍵點(diǎn)擊

[ContextMenu("SetColor")] void SetColor() { flashColour = Color.green; }

ContextMenuItem是給某組件某個(gè)屬性右鍵點(diǎn)擊添加菜單

[ContextMenuItem("Add Hp","AddHp")] //Add Hp為菜單名稱void AddHp() { startingHealth += 20; }

(八)對話框 創(chuàng)建對話框

public class EnemyChange : ScriptableWizard {//必須繼承ScriptableWizard

    [MenuItem("Tools/CreateWizard")]
    static void CreateWizard()
    {
        ScriptableWizard.DisplayWizard<EnemyChange>("統(tǒng)一修改敵人","Change And Close","Change");//Change And Close為按鈕名字
    }

檢測對話框按鈕點(diǎn)擊

//檢測create按鈕的點(diǎn)擊 void OnWizardCreate() { }

//當(dāng)前對話框字段值修改的時(shí)候會被調(diào)用 void OnWizardUpdate() {

對話框第二個(gè)按鈕

ScriptableWizard.DisplayWizard<EnemyChange>("統(tǒng)一修改敵人","Change And Close","Change");//change為第二個(gè)button

第二個(gè)button的點(diǎn)擊事件猜憎,other button 不同于第一個(gè)button娩怎,點(diǎn)擊后不會自動關(guān)閉對話框

void OnWizardOtherButton()

(九)記錄操作,以便撤銷

Undo.RecordObject(hp, "change health and speed");

(十)顯示提示信息

void OnWizardCreate() { 
ShowNotification(new GUIContent(Selection.gameObjects.Length + "個(gè)游戲物體的值被修改了")); 
}

(十一)保存數(shù)據(jù)

EditorPrefs.SetInt(changeStartHealthValueKey, changeStartHealthValue);//第一個(gè)參數(shù)是key胰柑,第二個(gè)是保存的值

(十二)進(jìn)度條

void OnWizardCreate()
    {
        GameObject[] enemyPrefabs = Selection.gameObjects;
        EditorUtility.DisplayProgressBar("進(jìn)度", "0/" + enemyPrefabs.Length + " 完成修改值", 0);
        int count = 0;
        foreach (GameObject go in enemyPrefabs)
        {
            CompleteProject.EnemyHealth hp = go.GetComponent<CompleteProject.EnemyHealth>();
            Undo.RecordObject(hp, "change health and speed");
            hp.startingHealth += changeStartHealthValue;
            hp.sinkSpeed += changeSinkSpeedValue;
            count++;
            EditorUtility.DisplayProgressBar("進(jìn)度", count+"/" + enemyPrefabs.Length + " 完成修改值", (float)count/enemyPrefabs.Length);
        }
EditorUtility.DisplayProgressBar("進(jìn)度", "0/" + enemyPrefabs.Length + " 完成修改值", 0);

(十三)自定義窗口 必須繼承EditorWindow

public class MyWindow : EditorWindow {

    [MenuItem("Window/show mywindow")]
    static void ShowMyWindow()
    {
        MyWindow window= EditorWindow.GetWindow<MyWindow>();
        window.Show();
    }

    private string name="";
    void OnGUI()
    {
        GUILayout.Label("這是我的窗口");
        name = GUILayout.TextField(name);
        if (GUILayout.Button("創(chuàng)建"))
        {
            GameObject go = new GameObject(name);
            Undo.RegisterCreatedObjectUndo(go, "create gameobject");//注冊到操作記錄
        }
    }

本文轉(zhuǎn)自:http://blog.csdn.net/qq_34244317/article/details/76718284

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末截亦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子柬讨,更是在濱河造成了極大的恐慌崩瓤,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踩官,死亡現(xiàn)場離奇詭異却桶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門颖系,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗅剖,“玉大人,你說我怎么就攤上這事嘁扼⌒帕福” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵偷拔,是天一觀的道長蒋院。 經(jīng)常有香客問我,道長莲绰,這世上最難降的妖魔是什么欺旧? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蛤签,結(jié)果婚禮上辞友,老公的妹妹穿的比我還像新娘。我一直安慰自己震肮,他們只是感情好称龙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著戳晌,像睡著了一般鲫尊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沦偎,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天疫向,我揣著相機(jī)與錄音,去河邊找鬼豪嚎。 笑死搔驼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侈询。 我是一名探鬼主播舌涨,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扔字!你這毒婦竟也來了囊嘉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤革为,失蹤者是張志新(化名)和其女友劉穎哗伯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篷角,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焊刹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虐块。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俩滥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贺奠,到底是詐尸還是另有隱情霜旧,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布儡率,位于F島的核電站挂据,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏儿普。R本人自食惡果不足惜崎逃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望眉孩。 院中可真熱鬧个绍,春花似錦、人聲如沸浪汪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽死遭。三九已至广恢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呀潭,已是汗流浹背钉迷。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜗侈,地道東北人篷牌。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓睡蟋,卻偏偏與公主長得像踏幻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子戳杀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容