Unity编辑器扩展笔记

Unity编辑器扩展笔记

参考博客:https://blog.csdn.net/qq_33747722/article/details/53945718

1.在Assets文件夹下新建一个Editor文件夹

当打包时Editor文件下的内容不会打包进去

2.创建脚本:using UnityEditor;引入命名空间,并继承相关类class MyWindow : EditorWindow

3.[MenuItem("Window/show mywindow")] 创建editor中的按钮;

4.    void OnGUI()中创建相应的功能模块


【简单按钮】

在Assets文件夹下新建一个Editor文件夹

当打包时Editor文件下的内容不会打包进去

接下来在Editor下新建一个自定义名为HelloWord的C#脚本

添加头文件

  1. using UnityEditor;
  2. using UnityEngine;  
    首先做一个简单的插件按钮
  1. //按钮位置 是否有效 优先级
  2. [ MenuItem("GameObject/HelloWord",false,12)]
  3. public static void helloword()
  4. {
  5. Debug.Log( "helloword");
  6. }  
    【组件按钮】

在组件下右键点击显示自定义的按钮

同样在HelloWord.cs文件下添加如下代码

  1. //组件右键显示按钮
  2. //CONTEXT 组件名 按钮名
  3. [ MenuItem("CONTEXT/TextScript/InitValue")]
  4. public static void InitValue(MenuCommand cmd)//将选中的组件传过来
  5. {
  6. //TextScript组件是挂载在对象上的组件
  7. TextScript text = cmd.context as TextScript;
  8. text. value = 10;
  9. }  
    这样当我们右点击鼠标,点击InitValue按钮,将执行以上函数

【Selection】

当在Hierarchy窗口下选择游戏对象后,操作Selection类

  1. //选择游戏对象
  2. //并且记录删除操作
  3. [ MenuItem("GameObject/Delete_1",false,13)]
  4. public static void Delete_1()
  5. {
  6. //获取选择的个数
  7. Debug.Log(Selection.objects.Length);
  8. //在选取的游戏对象中第一个被选择的对象
  9. Debug.Log(Selection.activeObject.name);
  10. foreach (Object obj in Selection.objects)
  11. {
  12. //将对象之间删除,不能撤销
  13. GameObject.DestroyImmediate(obj);
  14. //使用Undo可以撤销
  15. Undo.DestroyObjectImmediate(obj);
  16. }
  17. }  
    【注册快捷键】
  1. //注册快捷键
  2. // %表示ctrl #表示shift &表示alt
  3. //路径和注册符号需要用空格隔开
  4. //当注册符号为单个字符时,用_开头。如:_t表示快捷键t
  5. [ MenuItem("GameObject/MyKey #a",false,14)]
  6. public static void MyKey()
  7. {
  8. Debug.Log( "myKey");
  9. }  
    【取消按钮】
  1. //参数二 是否有效显示
  2. [ MenuItem("GameObject/Delete_2",true,15)]
  3. public static bool Delete_2()
  4. {
  5. if (Selection.objects.Length > 0)
  6. {
  7. //有效
  8. return true;
  9. }
  10. //无效
  11. return false;
  12. }
  13. [ MenuItem("GameObject/Delete_2", false, 15)]
  14. public static void Delete_3()
  15. {
  16. foreach (Object obj in Selection.objects)
  17. {
  18. Undo.DestroyObjectImmediate(obj);
  19. }
  20. }  
    【ContextMenu】

在【组件按钮】下介绍的是在其他脚本控制该组件代码

另外还有一种方式就是在自身组件的代码里添加按钮控件

TextScript.cs

  1. using UnityEngine;
  2. using System.Collections;
  3. public class TextScript : MonoBehaviour
  4. {
  5. public int value = 0;
  6. //在组件属性选项中右键
  7. //选项名 函数名
  8. [ ContextMenuItem("Set False","ChangeFalse")]
  9. [ ContextMenuItem("Set True", "ChangeTrue")]
  10. public bool isRun = true;
  11. void ChangeFalse()
  12. {
  13. this.isRun = false;
  14. }
  15. void ChangeTrue()
  16. {
  17. this.isRun = true;
  18. }
  19. //直接在函数里面设置按钮
  20. //点击函数,将会运行函数
  21. //函数不必定义为静态函数
  22. [ ContextMenu("SetValue")]
  23. public void SetValue()
  24. {
  25. this. value = 100;
  26. }
  27. }  
    【对话框】

在一些时候,我们需要在批量对选择的游戏对象上进行数据更改

这是我们可以添加一个对话框,对话框提供选一些选项,确定里面的数据值后,对选中的游戏对象数值进行更改

以下是创建一个对话框的示列代码:

  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. public class SelfDialog : ScriptableWizard
  5. {
  6. [ MenuItem("Tool/CreateSelfDialog")]
  7. public static void Create()
  8. {
  9. ScriptableWizard.DisplayWizard<SelfDialog>( "helloword", "Change And Close", "Change");
  10. }
  11. public int changeStartHealthValue = 10;
  12. public int changeSinkSpeedValue = 1;
  13. const string changeStartHealthValueKey = "SelfDialog.changeStartHealthValue";
  14. const string changeSinkSpeedValueKey = "SelfDialog.changeSinkSpeedValue";
  15. //当窗口被创建出来的时候调用的
  16. void OnEnable()
  17. {
  18. }
  19. //检测create按钮的点击
  20. //当点击后同时会自动关闭该窗口
  21. void OnWizardCreate()
  22. {
  23. Debug.Log(changeStartHealthValue + "," + changeSinkSpeedValue);
  24. }
  25. //当点击后不会自动关闭该窗口
  26. void OnWizardOtherButton()
  27. {
  28. OnWizardCreate();
  29. ShowNotification( new GUIContent( "完成"));
  30. }
  31. //当前字段值修改的时候会被调用
  32. void OnWizardUpdate()
  33. {
  34. EditorPrefs.SetInt(changeStartHealthValueKey, changeStartHealthValue);
  35. EditorPrefs.SetInt(changeSinkSpeedValueKey, changeSinkSpeedValue);
  36. }
  37. //当选择的游戏对象发生改变后,将调用该函数
  38. void OnSelectionChange()
  39. {
  40. OnWizardUpdate();
  41. }
  42. }  
    【进度条】

进度条的作用不多说,直接上创建代码(简单模拟下):

  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. public class SelfProgressBar : MonoBehaviour
  5. {
  6. float timer = 0;
  7. int count = 0;
  8. void Start()
  9. {
  10. EditorUtility.DisplayProgressBar( "进度", "0/10" + " 完成修改值", 0);
  11. }
  12. void Update()
  13. {
  14. timer+=Time.deltaTime;
  15. if (timer>= 1.0f)
  16. {
  17. timer = 0.0f;
  18. count++;
  19. EditorUtility.DisplayProgressBar( "进度", count+ "/10" + " 完成修改值", ( float)count/ 10);
  20. }
  21. if (count >= 10)
  22. {
  23. EditorUtility.ClearProgressBar();
  24. }
  25. }
  26. }  
    【窗口】

接下来介绍如何创建一个像Unity下的Hierachy和Projects类似的窗口

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. public class MyWindow : EditorWindow
  6. {
  7. [ MenuItem("Window/show mywindow")]
  8. static void ShowMyWindow()
  9. {
  10. MyWindow window = EditorWindow.GetWindow<MyWindow>();
  11. window.Show();
  12. }
  13. private string name = "";
  14. void OnGUI()
  15. {
  16. GUILayout.Label( "这是我的窗口");
  17. name = GUILayout.TextField(name);
  18. if (GUILayout.Button( "创建"))
  19. {
  20. GameObject go = new GameObject(name);
  21. Undo.RegisterCreatedObjectUndo(go, "create gameobject");
  22. }
  23. }
  24. }