Unity编辑器扩展

编辑器简介:Unity支持扩展编辑器,扩展编辑器的代码要放入Editor文件夹中,Editor文件夹在项目打包时,是不会被打包的

1:使用MenuItem添加菜单栏按钮:MenuItem是引用UnityEditor命名空间的

public class AddTools { [MenuItem("Assets/Test1",false,10)] static void test1()//必须为静态函数 { Debug.Log("test1"); } }

2:MenuItem的路径设置和显示的顺序设置,MenuItem有三个参数,第三个参数是设置按钮显示的前后顺序的。按钮显示通常以11为一个组,参数相差11就不是一个组了。

[MenuItem("Assets/test1",false,1)]

[MenuItem("Assets/test2",false,12)]这两个参数相差11,text1按钮在text2前面显示,text1和text2不是在同一个组。

[MenuItem("Assets/tab1",false,0)] static void tab() { //这个静态方法是实现上面设置的按钮的功能的
 } [MenuItem("Assets/tab2", false, 11)] static void tab1() { //这个静态方法是实现上面设置的按钮的功能的
    }


3:给组件或脚本的右键菜单添加按钮,去实现一些功能。

[menuitem("CONTEXT/组件或脚本名/按钮名")]//往脚本的右键菜单中添加一个按钮实现某种功能

[MenuItem("CONTEXT/text1/InitHealthAndSpeed1")] static void InitHealthAndSpeed() { //点击InitHealthAndSpeed1按钮就会执行这个静态方法
        Debug.Log("aa"); }

4:MenuCommand:是获取咱们正在操做的组件或脚本的对象,拿到组件或脚本对象咱们就能够对其进行操做。

[MenuItem("CONTEXT/text1/InitHealthAndSpeed1")] static void InitHealthAndSpeed(MenuCommand cmd) { //点击InitHealthAndSpeed1按钮就会执行这个静态方法
        text1 ta1 = cmd.context as text1;//MenuCommand获取到正在操做的text1脚本组件
        ta1.a = 10;//对组件的内容进行修改
 Debug.Log(ta1.a); }

 

5:Selection:获取unity中的一些物体对象。

   Selection.activeGameobject//获取Inspector面板中被选中的游戏物体,只能返回选中的一个物体对象,选中多个对象,只会获得第一个对象

    Selection.activeTransform//获取Inspector面板中被选中游戏物体的Transform组件,只能返回一个一个物体的Transform组件。选中多个对象,只会获得第一个对象

    selection.Objects//获取全部选中物体,包括Script scene 的全部资源呢

    selection.activeObject//只能获取一个被选中的资源,资源是能够是任何物体

    Selection.gameObjects//获取全部选中的Gameobject对象

    Selection.transform//获取全部被选中的游戏对象的transfoem属性

   

GameObject go = Selection.activeGameObject;//获取被选中的一个物体对象,获取的只能是游戏对象
        Transform go1 = Selection.activeTransform;//获取被选中的一个物体的Transform组件,获取的只能是游戏对象
        GameObject[] go2 = Selection.gameObjects;//获取所哟被选中的游戏对象
 Transform[] go4 = Selection.transforms;//获取所哟被选中的游戏对象的transform属性
        object[] go3 = Selection.objects;//获取Unity中全部被选中的资源,资源能够是任何种类的
        object go5 = Selection.activeObject;//只能获取Unity中全部种被选中资源的一个,资源能够是任何种类的

 

6:编写一个删除物体按钮,在物体被删除以后是能够撤销这个删除操做的。

     通常咱们本身删除物体操做是没法撤回的,系统的删除物体的按键,删除的物体是能够撤销删除的操做的。由于系统的删除操做在删除以前会把删除操做的记录注册到内存中,物体并无真正被删除,咱们本身写的删除按钮也能够把删除的记录注册到内存中,这样咱们本身写的删除操做也是能够撤销的

Undo.DestoryObjectImmediate(gameobject)//利用Undo把删除操做注册到内存中windows

在编辑器的脚本中删除物体使用DestoryImmediate(gameobject)这个API编辑器

[MenuItem("Assets/tab1",false,0)] static void tab() { //这个静态方法是实现上面设置的按钮的功能的
 GameObject go = Selection.activeGameObject;//获取被选中的一个物体对象,获取的只能是游戏对象
         Undo.DestroyObjectImmediate(go);//把删除操做注册要内存中,按ctrl +z能够取消删除
 }

 7:给咱们本身写的按钮添加快捷键

    本身设置快捷键时:%表明ctrl  #表明shift  &表明alt

    

[MenuItem("Assets/tab2 %t", false, 11)]//给Tab2按键设置Ctrl +t为tab2按钮的快捷键
    static void tab1() { }

设置的快捷键要与前面的按钮名空一格。若是只用一个按键做为快捷键则要在按键前加一个下划线

[MenuItem("Assets/tab2 _t", false, 11)] static void tab1() { }

 

8:在编辑器上的按钮可能只能做用一些物体,对另外一些物体是不适用,当选中的是不适用的物体时,这个按钮是禁用的。这里须要使用menuitem的第二个参数,来判断这个按钮是否启用

这两个Maneitem是配合使用的,false以前的true是判断按钮能按下的条件的,在返回true时,按钮就会被起用函数

[menuitem("assets/a",true,1)]ui

static bool delect()spa

{3d

  判断是否知足条件,知足返回true,则按钮能够点击code

  不知足就返回false 按钮被禁用orm

}对象

[menuitem("assets/a",false,1)]blog

static void delect1()

{

//执行自定义按钮的功能

}

[MenuItem("Assets/tab1", true, 0)] static bool tab2() { if (Selection.activeGameObject == null)//判断是否选中物体 { return false; } else { return true;//选中物体返回true,启用tab1按钮组件 } } [MenuItem("Assets/tab1",false,0)] static void tab() { //这个静态方法是实现上面设置的按钮的功能的
 GameObject go = Selection.activeGameObject;//获取被选中的一个物体对象,获取的只能是游戏对象 // GameObject.DestroyImmediate(go);//删除这个对象
        Undo.DestroyObjectImmediate(go);//把删除操做注册要内存中,按ctrl +z能够取消删除
 }

mainitem中的True 和false 相互配合,来实现按钮选择性实现

9:[contextMenu(“按键名”)]给自定义的脚本添加按键   [contextMenuitem("按键名","要执行的方法名")]给自定义的脚本属性添加按键

contextMen和contextMenuitem标签不须要再编辑器的脚本中使用,能够直接再要添加按钮的脚本中使用,生成本身定义的按钮

public class text1 : MonoBehaviour { [ContextMenuItem("addcount", "Add")]//直接在自定义脚本的属性a添加按钮,按钮执行的功能是执行add方法,按钮名是addCount
    public int a = 0; void Add() { a += 10; print(a); } [ContextMenu("TestButton")]//直接在自定义的脚本添加右键按钮TestButton,执行的功能是标签下面的方法

    void Onbutton() { print("a"); } }

 10:建立一个对话框,对话框中读取的数据是从指定的脚本中读取的。对话框只能从继承ScripttableWizard类的类中读取数据,建立对话框的脚本也是编辑器脚本

       建立对话框的函数是scriptTableWrizard.DisplayWizard<存储数据的脚本,脚本要继承ScripttableWizard的类>("对话框的名称");

using UnityEditor; public class CreateEdior :ScriptableWizard { [MenuItem("Assets/tab3",false,2)]//建立tab3按钮
    static void tab3() { ScriptableWizard.DisplayWizard<CreateEdior>("修改数据");//建立对话框,读取CreateEditor脚本的数据,文本框的名字为“修改数据”
 } public float speed;//CreateEditor脚本中的数据
    public int index; [MenuItem("Assets/tab4", false, 3)]//建立tab4按钮
    static void tab4()//建立对话框
 { ScriptableWizard.DisplayWizard<stab>("修改数据"); } } public class stab:ScriptableWizard//文本框要交互的数据
{ public int a = 10; public int b = 19; }

11:在建立的对话框中建立按钮,触发点击事件  ScriptTableWizard.DisplayWizard<存储数据的脚本,脚本要继承ScripttableWizard的类>("对话框的名称",“在对话框中建立的按钮名”)  这个按钮是绑定固定的方法 OnWizardCreate(),按钮被点击时触发这个方法

public float speed;//CreateEditor脚本中的数据
    public int index; [MenuItem("Assets/tab3",false,2)]//建立tab3按钮
    static void tab3() { ScriptableWizard.DisplayWizard<CreateEdior>("修改数据","CreatButton");//建立对话框,读取CreateEditor脚本的数据,文本框的名字为“修改数据”
 } void OnWizardCreate()//对话框的按钮被点击时,触发这个方法
 { GameObject[] enemy = Selection.gameObjects;//获取全部被选中的对象
        foreach (var go in enemy) { if(go.transform.tag=="enemy")//获取选中标签为enemy的物体
 { text1 text2 = go.GetComponent<text1>();//获取他们的text1脚本
                text2.a = index;//用对话框的index值修改获取对象的脚本值
 } } } 

 12:OnWizardUpdate()  和 OnSelectionChange()

 OnWizardUpdate()咱们修改对话框中的字段或值时,就会调用这个方法

 OnSelectionChange()当咱们更改选中的对象时,就会触发这个方法

/// <summary>
    /// 替换被选中的对象时就会触发这个方法 /// </summary>
    void OnSelectionChange() { Debug.Log(Selection.activeGameObject.name);//打印出被选中的一个游戏对象的名字
 } /// <summary>
    /// 对话框打开时触发这个方法,对话框中字段一改动就执行该方法 /// </summary>
    void OnWizardUpdate() { Debug.Log(index); }

 

13: otherButton,建立对话框的第二个按钮,OnwizardotherButton这个方法绑定这个按钮,对话框的第一个按钮在按下以后对话框就会关闭,但第二个按钮按下对话框不会关闭

建立第二个按钮  ScriptTableWiazrd.DisplayWiazid<script>("对话框的名字",“第一个按钮名”,“第二个按钮名”)

第一个按钮名 触发的方法OnWiazrdCreate()

第二个按钮名 触发的方法OnWiazrdotherButton()

[MenuItem("Assets/tab3",false,2)]//建立tab3按钮
    static void tab3() { ScriptableWizard.DisplayWizard<CreateEdior>("修改数据","CloseButton","otherButton");//建立对话框,读取CreateEditor脚本的数据,文本框的名字为“修改数据”
 } void OnWizardCreate()//对话框的CloseButton按钮被点击时,触发这个方法
 { Debug.Log("对话框已关闭"); } void OnWizardOtherButton()//对话框的otherButton按钮被点击时,触发这个方法
 { GameObject[] enemy = Selection.gameObjects;//获取全部被选中的对象
        foreach (var go in enemy) { if (go.transform.tag == "enemy")//获取选中标签为enemy的物体
 { text1 text2 = go.GetComponent<text1>();//获取他们的text1脚本
                Undo.RecordObject(text2, "change");//把text2这个类的数据存储起来,类修改后,能够ctrl +z恢复到如今记录的类的数据
                text2.a = index;//用对话框的index值修改获取对象的脚本值
 } } } 

 

14:记录一个类的数据,在类被修改后,能够用Ctrl +z撤销修改类中数据的操做 Undo.Recordobject(类名,“这个操做在内存中的名字,是本身随便起的”)

void OnWizardCreate()//对话框的按钮被点击时,触发这个方法
 { GameObject[] enemy = Selection.gameObjects;//获取全部被选中的对象
        foreach (var go in enemy) { if(go.transform.tag=="enemy")//获取选中标签为enemy的物体
 { text1 text2 = go.GetComponent<text1>();//获取他们的text1脚本
                Undo.RecordObject(text2, "change");//把text2这个类的数据存储起来,类修改后,能够ctrl +z恢复到如今记录的类的数据
                text2.a = index;//用对话框的index值修改获取对象的脚本值
 } } }

15:对话框的提示字符和错误警告提示字符     helpString 提示字符串    errorString 错误提示符

16:ShowNotification显示提示信息。这个函数只能在对话框中显示提示信息。

     

void OnWizardOtherButton()//对话框的otherButton按钮被点击时,触发这个方法
 { int a = 0; GameObject[] enemy = Selection.gameObjects;//获取全部被选中的对象
        foreach (var go in enemy) { a++; if (go.transform.tag == "enemy")//获取选中标签为enemy的物体
 { text1 text2 = go.GetComponent<text1>();//获取他们的text1脚本
                Undo.RecordObject(text2, "change");//把text2这个类的数据存储起来,类修改后,能够ctrl +z恢复到如今记录的类的数据
                text2.a = index;//用对话框的index值修改获取对象的脚本值
 } } ShowNotification(new GUIContent(Selection.objects.Length + "个物体值被修改"));//按下第二个按钮,会显示提示信息
    }

 

17:使用EditorPerfabs保存弹出窗口中修改的数据

保存int 类型的值 Editorperfabs.setint("保存到这个字段",要被保存的字段)

调用这个被保存的Int 类型的值 Editorperfabs.GetInt("保存到的新字段",第一次打开这个对话框的显示值)

void OnEnable() { index= EditorPrefs.GetInt("IndexKey", index);//在窗口被打开时,第一次使用index赋值给index,之后再打开就把保存的indexkey值赋予index,这样就完成保存每次修改的Index的值
 } EditorPrefs.SetInt("IndexKey", index);//把面板中修改的index值,保存到IndexKey中

 

18:显示进度条,使用EditorUtility.DisplayProgressBar("标题",“下标题”,进度),关闭EditorUtility.clearProgressBar()进度条

foreach (var go in enemy) { a++; if (go.transform.tag == "enemy")//获取选中标签为enemy的物体
 { text1 text2 = go.GetComponent<text1>();//获取他们的text1脚本
                Undo.RecordObject(text2, "change");//把text2这个类的数据存储起来,类修改后,能够ctrl +z恢复到如今记录的类的数据
                text2.a += index;//用对话框的index值修改获取对象的脚本值
                EditorPrefs.SetInt("IndexKey", index);//把面板中修改的index值,保存到IndexKey中
 } EditorUtility.DisplayProgressBar("进度", a + "/" + enemy.Length, a / enemy.Length);//显示修改数值的进度
 } EditorUtility.ClearProgressBar();//修改数值结束,关闭进度条

 20:建立自定义的窗口 建立自定义的窗口脚本继承EditorWindows脚本,用MyWindow脚本对象的show方法,实现建立窗口

using UnityEditor; public class WindowEdior : EditorWindow { //脚本继承editorWindow
    [MenuItem("windows/createWindows",false,1)]//建立createwindows按键,实现建立窗口的功能
    static void create() { WindowEdior window = EditorWindow.GetWindow<WindowEdior>();//建立窗口
        window.Show();//显示窗口
 } }
相关文章
相关标签/搜索