• 友链

  • 首页

  • 文章归档
h u a n b l o g
h u a n b l o g

欢

HI,Friend

01月
22
Unity

Unity编辑器扩展一

发表于 2022-01-22 • 字数统计 6937 • 被 599 人看爆

介绍

对Unity编辑的功能进行扩展,如:添加窗口,菜单栏等,命名空间为:using UnityEditor;,单独放在Editor文件下

菜单栏

MenuItem

在方法名前使用特性 [MenuItem("路径", false, 100)]  
  • 第一个参数:菜单栏的路径,如果没有该路径,则重新创建一个菜单栏
  • 第二个参数:判断是否是有效函数,是否需要显示。
  • 第三个参数:优先级,菜单项显示的顺序。默认值为1000,两个优先级之间超过10级,则会出现分隔栏
[MenuItem("Window/My Window")]
static void TestMenu()
{
}

效果如下:
EditorExtension01.png

参数二
设置为true会先执行,用来判断后面设置为false的要不要执行和菜单栏显示

//先执行,返回true的话,后面的就会执行,也就是函数执行,菜单显示
[MenuItem("Tools/TestMenu", true, 2)]
static bool TestMenu3()
{
    if(Selection.objects.Length > 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

[MenuItem("Tools/TestMenu", false, 2)]
static void TestMenu2()
{
    foreach(Object obj in Selection.objects)
    {
        Undo.DestroyObjectImmediate(obj);       //在编辑模式下用于删除
    }
}

如果返回false的话,效果如下
EditorExtension06.png

为true的话,效果如下
EditorExtension07.png

分割栏

[MenuItem("Toos/TestMenu", false, 2)]
static void TestMenu()
{
        
}

[MenuItem("Toos/TestMenu2", false, 22)]
static void TestMenu2()
{

}

[MenuItem("Toos/TestMenu3", false, 2)]
static void TestMenu3()
{

}

效果图如下
EditorExtension02.png

在Hierarchy面板里显示菜单栏

当优先级小于在Hierarchy右键的的菜单栏时,就可以出现在右键菜单栏了,当然路径也要是在GameObject里。
其它面板也是一样的,如Object面板右键菜单,是在Assets下,那么路径也要是在Assets下
[MenuItem("GameObject/TestMenu", false, 5)]
static void TestMenu3()
{

}

效果图
EditorExtension03.png

CONTEXT

给某组件添加右键菜单选项,用法和MenuItem一样,路径为:"CONTEXT/要右键点击的组件名/要创建的菜单"

名称必须大写

[MenuItem("CONTEXT/BoxCollider/TestMenu", false, 2)]
static void TestMenu()
{
    
}

效果如下
EditorExtension04.png

ContextMenu

直接在该组件脚本里添加右键,无需在Editor文件下编写,无需引用using UnityEditor;处于using UnityEngine下

只能用于方法

[ContextMenu("setColor")]
void SetColor()
{

}

EditorExtension08.png

ContextMenuItem

为组件属性添加右键功能(属性必须是pubilc,否则看不到,就点不到呗)。和上面一样无需在Editor文件下编写,无需引用using UnityEditor;处于using UnityEngine下
[ContextMenuItem("按钮名", "调用函数名")]

[ContextMenuItem("SetColor", "SetColorFunc")]
public Color color = Color.red;

void SetColorFunc()
{

}

EditorExtension09.png

MenuCommand

用于获取当前操作的组件,作为参数使用

两个变量

  • context:点击的组件对象
  • userData:用于将自定义信息传递给菜单项的整数。
[MenuItem("CONTEXT/BoxCollider/TestMenu", false, 2)]
static void TestMenu(MenuCommand cmd)   
{
    Debug.Log(cmd.context.name);        //返回的是点击的组件
}

添加快捷键

用法:[MenuItem("Tools/TestMenu _g", false, 2)]
符号字符
%Ctr/Command
#Shift
&Alt
LEFT/Right/UP/DOWN方向键
F1-F2F功能键
_g键盘g

EditorExtension05.png

Selection

用于获取当前选择的游戏物体
  • Selection.activeGameObject 返回第一个选择的场景中的对象,如果选择多个的话。必须是处于Hierarchy面板里的,否则报错
  • Selection.gameObjects 返回场景中选择的多个对象,包含预制体等
  • Selection.objects 返回选择的多个对象
[MenuItem("Tools/TestMenu", false, 2)]
static void TestMenu2()
{
    Debug.Log(Selection.activeGameObject.name);     //返回游戏对象名称
}

删除功能

[MenuItem("Tools/TestMenu", false, 2)]
static void TestMenu2()
{
    foreach(Object obj in Selection.objects)
    {
        Object.DestroyImmediate(obj);       //DestroyImmediate在编辑模式下用于删除
    }
}

恢复功能

使用Undo.DestroyObjectImmediate进行删除

窗体

创建编辑器对话框

简单的快速创建对话框窗体的方式,继承自ScriptableWizard(实际继承于EditorWindow),用于编写对话框包含的属性
using UnityEditor;

public class EditorWindowsChange : ScriptableWizard {

    public float ChangeHealth = 30f;
}

菜单栏脚本

用于调出对话框
[MenuItem("Tools/CreateWizard")]
static void TestMenu4()
{
    ScriptableWizard.DisplayWizard<EditorWindowsChange>("同意修改", "Change Value");
}

这样就可以通过菜单栏调出对话框了,当然也可以写在同一脚本里
EditorExtension10.png

常用函数调用

  • OnWizardCreate:点击确定按钮时调用(就是对话框的右下角按钮)
  • OnEnable:显示时调用
  • OnWizardUpdate:更新时调用
  • OnDisable:隐藏时调用
  • OnDestroy:销毁时调用

自定义窗体

像Game面板一样,可以自由浮动、像选项卡一样停靠。继承自EditorWindow类。用法和对话框一样
using UnityEditor;
public class EditorWindowsChange : EditorWindow {

    [MenuItem("Tools/CreateWizard")]
    static void TestMenu4()
    {

        EditorWindow.GetWindow<EditorWindowsChange>("同意修改");
    }
}

效果如下
EditorExtension11.png

常用函数

  • OnEnable:显示时调用
  • OnGUI:绘制窗体内容。如:滑动条、Toggle等

自定义弹窗

用于实现在编辑器中弹出窗口,弹窗类继承自PopupWindowContent类,当弹窗失去焦点时,就会自动关闭。
using UnityEditor;
using UnityEngine;

//自定义窗体
public class EditorWindowsChange : EditorWindow {
    private PopWindowExample popWindow = new PopWindowExample();
    private Rect buttonRect;

    [MenuItem("Tools/CreateWizard")]
    static void TestMenu4()
    {

        EditorWindow.GetWindow<EditorWindowsChange>("同意修改");
    }

    //绘制窗体内容
    private void OnGUI()
    {
        GUILayout.Label("Popup example", EditorStyles.boldLabel);
        if (GUILayout.Button("Popup Options", GUILayout.Width(200)))
        {
            PopupWindow.Show(buttonRect, popWindow);
        }
        //获取GUILayout最后用于控件的矩形
        if (Event.current.type == EventType.Repaint)
            buttonRect = GUILayoutUtility.GetLastRect();
    }
}

//自定义弹窗
public class PopWindowExample : PopupWindowContent
{
    bool toggle = true;

    //绘制弹窗内容
    public override void OnGUI(Rect rect)
    {
        EditorGUILayout.LabelField("PopWindow");
        toggle = EditorGUILayout.Toggle("Toggle", toggle);
    }

    public override Vector2 GetWindowSize()
    {
        //设置弹窗的尺寸
        return new Vector2(200, 100);
    }
}

常用函数

  • OnOpen:开启弹窗时调用
  • OnGUI:绘制弹窗。如:Toggle
  • OnClose:关闭弹窗时调用
  • GetWindowSize:设置窗口大小

ShowNotification

显示通知消息。在窗口上显示通知消息,一段时间自动消失。继承自EditorWindow类。调用 RemoveNotification 可立即删除通知。在OnGUI里调用
ShowNotification(new GUIContent("This is a Notification"));

EditorExtension12.png

参考

  • 官网-扩展编辑器
  • 虚拟喵-U3D编辑器扩展
分享到:
页面置换算法
虚拟页式存储中逻辑地址和物理地址计算
  • 文章目录
  • 站点概览
欢

网红 欢

你能抓到我么?

Email RSS
看爆 Top5
  • mac系统版本与Xcode版本有冲突 4,081次看爆
  • JAVA_HOME环境配置问题 3,731次看爆
  • AssetBundle使用 3,499次看爆
  • VSCode配置C++开发环境 3,257次看爆
  • Lua反射 3,133次看爆

Copyright © 2025 欢 粤ICP备2020105803号-1

由 Halo 强力驱动 · Theme by Sagiri · 站点地图