Unity 编辑器扩展总结 四:创建编辑器窗体

编辑器扩展总结

工欲善其事必先利其器

引言: 在项目开发中,编辑器扩展为开发者提供了开发自定义工具的功能,让开发者更加便利地使用编辑器开发项目。如若博客中存在错误,还请不吝赐教。所有参考的博客或者视频来源将在文末展示。
开发版本: Unity 2019.4.9f1

相关博客传送门
一、编辑器开发入门

二、编辑器的相关特性

三、自定义Inspector面板

四、创建编辑器窗体

五、Gizmos辅助调试工具

六、扩展Scene视图

七、数组或list集合的显示方式

八、EditorPrefs、ScriptableObject、Undo

九、GUIStyle、GUISkin

十、AssetPostprocessor资源导入管线

创建编辑器窗体

Unity提供了几种可以创建编辑器窗体的方式,开发者可以针对不同使用情况来创建。

继承自ScriptableWizard类创建对话框窗体

Unity为开发者提供了一个简单的快速创建对话框窗体的方式,只需要继承自ScriptableWizard类,我们容易发现ScriptableWizard实际上是继承自EditorWindow,只是做了一层封装,该类窗体一般用于快捷功能的操作,例如统一修改场景中多个对象的位置等信息。

image

常用方法如下:

using UnityEngine;
using UnityEditor;

public class WindowExample1 : ScriptableWizard
{
    public string msg = ""; 

    //显示窗体
    [MenuItem("MyWindow/First Window")]
    private static void ShowWindow()
    {
        ScriptableWizard.DisplayWizard<WindowExample1>("WindowExample1", "确定", "取消");
    }

    //显示时调用
    private void OnEnable()
    {
        Debug.Log("OnEnable");
    }

    //更新时调用
    private void OnWizardUpdate()
    {
        Debug.Log("OnWizardUpdate");

        if (string.IsNullOrEmpty(msg))
        {
            errorString = "请输入信息内容";//错误提示
            helpString = "";//帮助提示
        }
        else
        {
            errorString = "";
            helpString = "请点击确认按钮";
        }
    }

    //点击确定按钮时调用
    private void OnWizardCreate()
    {
        Debug.Log("OnWizardCreate");
    }

    //点击第二个按钮时调用
    private void OnWizardOtherButton()
    {
        Debug.Log("OnWizardOtherButton");
    }

    //当ScriptableWizard需要更新其GUI时,将调用此函数以绘制内容
    //为GUI绘制提供自定义行为,默认行为是按垂直方向排列绘制所有公共属性字段
    //一般不重写该方法,按照默认绘制方法即可
    protected override bool DrawWizardGUI()
    {
        return base.DrawWizardGUI();
    }

    //隐藏时调用
    private void OnDisable()
    {
        Debug.Log("OnDisable");
    }

    //销毁时调用
    private void OnDestroy()
    {
        Debug.Log("OnDestroy");
    }
}

继承自EditorWindow类创建自定义窗体

创建自定义的编辑器窗体都需要继承自EditorWindow类,它可以自由浮动,也可以作为选项卡停靠,就像Unity编辑器中其他的窗体一样。编辑器窗体一般由菜单项打开,通常包含某一类的功能。作为一个编辑器类,需要放在Editor文件夹中。
官方API:EditorWindow

常用方法如下:

using UnityEngine;
using UnityEditor;

public class WindowExample2 : EditorWindow
{
    private static WindowExample2 window;//窗体实例

    //显示窗体
    [MenuItem("MyWindow/Second Window")] 
    private static void ShowWindow()
    {
        window = EditorWindow.GetWindow<WindowExample2>("Window Example");
        window.Show();
    }

    //显示时调用
    private void OnEnable()
    {
        Debug.Log("OnEnable");
    }

    //绘制窗体内容
    private void OnGUI()
    {
        EditorGUILayout.LabelField("Your Second Window", EditorStyles.boldLabel);
    }

    //固定帧数调用
    private void Update()
    {
        Debug.Log("Update");
    }

    //隐藏时调用
    private void OnDisable() 
    {
        Debug.Log("OnDisable");
    }

    //销毁时调用
    private void OnDestroy()
    {
        Debug.Log("OnDestroy");
    }
}

继承自PopupWindowContent类创建弹窗

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

如下案例实现点击窗体内按钮,显示弹窗的功能。第一个脚本定义了一个可以通过按钮打开弹窗的编辑器窗口,第二个脚本将弹出窗口本身的内容定义为一个单独的类。

using UnityEngine;
using UnityEditor;

public class WindowExample3 : EditorWindow
{
    private static WindowExample3 window;
    private PopWindowExample popWindow = new PopWindowExample();
    private Rect buttonRect;

    //显示窗体
    [MenuItem("MyWindow/Third Window")]
    private static void ShowWindow()
    {
        window = EditorWindow.GetWindow<WindowExample3>("Window Example 3");
        window.Show();
    }

    //绘制窗体内容
    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 OnOpen()
    {
        Debug.Log("OnOpen");
    }

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

    //关闭弹窗时调用
    public override void OnClose()
    {
        Debug.Log("OnClose");
    }

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

参考资料

PopupWindow

### 回答1: 要在Unity3D中实现窗体透明,可以按照以下步骤进行操作: 首先,确保你正在使用Unity3D的最新版本。然后,创建一个新的项目或打开现有的项目。 在Unity编辑器中,点击"Window"(窗口)选项卡,然后选择"Package Manager"(包管理器)。在包管理器中,确保你已经安装了"Universal Windows Platform"(通用Windows平台)模块。 接下来,点击"Window"(窗口)选项卡,然后选择"Project Settings"(项目设置)。在项目设置窗口中,选择"Player"(玩家)选项卡,然后点击"XR Settings"(XR设置)下拉菜单。 在XR设置下拉菜单中,选择"Player"(玩家)选项卡,并将"Virtual Reality Supported"(支持虚拟现实)选项设置为关闭。 然后,在"Player"(玩家)选项卡中,点击"Resolution and Presentation"(分辨率和演示)部分的"Run In Background"(在后台运行)复选框,以允许Unity应用在失去焦点时继续运行。 现在,你可以编写自己的代码来实现窗体透明。例如,你可以在脚本中使用"Color"(颜色)类型来设置窗体的背景色,并将Alpha通道值设置为0,以实现全透明效果。 请注意,实现窗体透明可能只在Windows平台有效。在其他平台上,窗体透明可能会有不同的实现方法。 希望这些步骤可以帮助你在Unity3D中实现窗体透明。祝你好运! ### 回答2: 要在Unity3D中实现窗体透明,可以按照以下步骤进行操作: 首先,在Unity3D中创建一个新项目或者打开现有项目。 然后,在Hierarchy视图中创建一个新的空对象(GameObject)。 接下来,在Inspector视图中将空对象的名称设置为"TransparentWindow"。 然后,为了将Unity项目转换为窗体应用程序,需要使用Unity的Build Settings功能。打开菜单栏中的File,选择Build Settings选项。 在Build Settings窗口中,选择目标平台为Windows(或者根据需要选择其他平台)。 点击Player Settings,在Player窗口的Resolution and Presentation选项中,取消勾选Default Is Full Screen。 然后,在Resolution and Presentation选项中取消勾选Run in Background和Fullscreen Window等选项。 接下来,在Player窗口的Other Settings选项卡中,选择Allow Title Bar to Display和Custom Title Bar Style等选项。 然后,在Unity项目的Assets文件夹中创建一个新的C#脚本。 在脚本中,使用System.Runtime.InteropServices命名空间中的[DllImport]特性导入Windows API函数。例如: [DllImport("user32.dll")] public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 设置窗体参数函数如下: const int GWL_STYLE = -16; const int WS_POPUP = 0x80000000; const int WS_VISIBLE = 0x10000000; 然后,在脚本的Start函数中,获取Unity Player的窗体句柄并调用SetWindowLong函数来设置窗体样式,使其透明: IntPtr hwnd = GetActiveWindow(); SetWindowLong(hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE); 最后,将该脚本附加到在Hierarchy视图中创建的"TransparentWindow"对象上。 保存并运行Unity项目,将生成的可执行文件(.exe)作为窗体应用程序打开,应该能够看到透明的窗体。 这些步骤将帮助你在Unity3D中实现窗体透明。记得在操作之前备份项目文件,以防发生意外。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值