Unity3d定制編輯器

1、添加菜單項

Paste_Image.png
Paste_Image.png
using UnityEngine;
using UnityEditor;

public class Tools : MonoBehaviour {
    //第一個參數(shù)為路徑,如不存在就主動創(chuàng)建,第二個參數(shù)表示是否為驗證方法,第三個參數(shù)為優(yōu)先級,默認優(yōu)先級為1000,每隔11就會有一條分割線
    [MenuItem("Tools/test",false)]
    static void  Test()
    {
        print("asd");
    }


     //快捷鍵為t
    [MenuItem("Tools/test1 _t",false,99)]
    static void Test1()
    {
        print("asd1");
    }
    
    //快捷鍵為ctrl+t
    [MenuItem("Tools/test2 %t",false,999)]
    static void Test2()
    {
        print("asd2");
    }
   //添加到制定默認菜單位置的菜單項還可以顯示在右擊菜單中,如下可以顯示在Hierarchy面板的右擊菜單中,快捷鍵為shift+t
    [MenuItem("GameObject/test3 #t", false, 1)]
    static void Test3()
    {
        print("asd2");
    }

    //快捷鍵為alt+t
    [MenuItem("Assets/test4 &t", false, 1)]
    static void Test4()
    {
        print("asd2");
    }

    //驗證當只有選中物體的時候才能夠點擊delete按鈕
    [MenuItem("Tools/delete", true, 989)]
    static bool deleteVaildate()
    {
        if (Selection.objects.Length > 0)
            return true;
        else
            return false;
    }
    [MenuItem("Tools/delete", false, 989)]
    static void Delete() {
        foreach (Object o in Selection.objects)
        {
            Undo.DestroyObjectImmediate(o);//利用Undo進行的刪除操作可以撤銷。
        }
    }
}

2、添加指定腳本的右擊菜單

Paste_Image.png
Paste_Image.png
using UnityEngine;
using UnityEditor;

public class EditorTest : MonoBehaviour {
    [MenuItem("CONTEXT/Character/method1")] //CONTEXT 組件名 按鈕名
    static void InitSpeeed(MenuCommand cmd)
    {
        //cmd.context正在操作的組件
        Character test = (Character)cmd.context;
        test.Speed = 10;
    }

    [MenuItem("CONTEXT/Transform/method2")] //CONTEXT 組件名 按鈕名
    static void Inited(MenuCommand cmd)
    {
        //cmd.context正在操作的組件
        Character test = (cmd.context as Transform).GetComponent<Character>();
        test.Speed = 0;
    }
}

3、創(chuàng)建一個新窗口

圖一:


Paste_Image.png

圖二:


Paste_Image.png

圖三:


Paste_Image.png

窗口腳本:

using UnityEngine;
using System.Collections;
using UnityEditor;

public class CharacterChange :ScriptableWizard {
    public int speed = 100;
    public const string speedkey = "speed";
    [MenuItem("Tools/DisplayCharacterChange", false)]
    static void Test()
    {
        //第一個參數(shù)窗口名(必選,其余可選),第二個參數(shù)按鈕名1(點擊后會自動關(guān)閉,點擊事件函數(shù)OnWizardCreate()),第三個參數(shù)按鈕名字2(點擊后不自動關(guān)閉,點擊事件函數(shù)OnWizardOtherButton())
        ScriptableWizard.DisplayWizard<CharacterChange>("修改速度","按鈕1","按鈕2");
    }

   //窗口啟動時運行
   private void OnEnable()
    {     
        speed=EditorPrefs.GetInt(speedkey);
    }
     
    //檢測按鈕點擊事件
    void OnWizardCreate()
    {
        GameObject[] enemyPrefabs = Selection.gameObjects;
        foreach (GameObject go in enemyPrefabs)
        {
            Character character = go.GetComponent<Character>();
            //記錄修改前的值以便可以撤銷
            Undo.RecordObject(character, "change hp");
            character.Speed += speed;
        }
            //可以顯示圖三的提示信息
            ShowNotification(new GUIContent(Selection.gameObjects.Length+"個物體被修改了"));
    }
    //當前字段值改變或窗口剛打開的時候調(diào)用
    void OnWizardUpdate()
    {
        helpString = null;
        errorString = null;
        if (Selection.gameObjects.Length > 0)
        {
            //展示圖1提示信息
            helpString = "當前選擇了" + Selection.gameObjects.Length + "物體";
        }
        else
        {
            //展示圖二錯誤信息
            errorString = "至少選擇一個物體";
        }
            //相對于PlayerPrefs的編輯器模式下持久化儲存的方法,記錄修改
            EditorPrefs.SetInt(speedkey, speed);
    }

    //EditorWindow中繼承的事件
    private void OnSelectionChange()
    {
        OnWizardUpdate();
    }

character腳本,掛上后可通過窗口多選,批量修改

using System;
using UnityEngine;
public class Character:MonoBehaviour {
    public int Speed;
    public int HP;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容