当前位置: 首页 > news >正文

2025-04-06 Unity Editor 实践 1 —— Editor 窗体框架

文章目录

  • 1 介绍
  • 2 实现
  • 3 效果
  • 4 扩展方式
  • 附:整体代码

1 介绍

​ 窗体框架由“页面标签”和“页面内容”组成。

​ 点击“页面标签”时,会显示对应的“页面内容”。

image-20250406040939711

2 实现

​ 创建 MyIMGUIEditorWindow.cs 脚本,并继承 EditorWindow。

// ------------------------------------------------------------
// @file       MyIMGUIEditorWindow.cs
// @brief
// @author     zheliku
// @Modified   2025-04-06 03:04:51
// @Copyright  Copyright (c) 2025, zheliku
// ------------------------------------------------------------

namespace EditorExtension
{
    using System;
    using UnityEditor;
    using UnityEngine;

    public class MyIMGUIEditorWindow : EditorWindow
    {
        ...
    }
}
  1. 打开窗体

    public class MyIMGUIEditorWindow : EditorWindow
    {
        ...
            
        [MenuItem("EditorExtension/02.IMGUI/02.MyIMGUIEditorWindow")]
        private static void ShowWindow()
        {
            var window = GetWindow<MyIMGUIEditorWindow>();
            window.Show();
        }
        
        ...
    }
    
  2. 配置页面标签

    定义 PageId 枚举,表示每个页面标签。

    public class MyIMGUIEditorWindow : EditorWindow
    {
        enum PageId
        {
            Basic,
            Other
        }
    
        [MenuItem("EditorExtension/02.IMGUI/02.MyIMGUIEditorWindow")]
        private static void ShowWindow()
        {
            var window = GetWindow<MyIMGUIEditorWindow>();
            window.Show();
        }
    
        private PageId _currentPageId = PageId.Basic;
    
        ...
    }
    
  3. OnGUI 主逻辑

    通过 GUILayout.Toolbar 显示页面标签,并返回当前页面 Id。

    依据 Id 执行对应绘制函数。

    public class MyIMGUIEditorWindow : EditorWindow
    {
        ...
            
        private void OnGUI()
        {
            _currentPageId = (PageId) GUILayout.Toolbar((int) _currentPageId, Enum.GetNames(typeof(PageId)));
    
            if (_currentPageId == PageId.Basic)
            {
                Basic();
            }
            else
            {
                Other();
            }
        }
        
        ...
    }
    
  4. 为每个“页面标签”创建绘制方法。

    使用 #region 包裹每个“页面标签”的内容。

    public class MyIMGUIEditorWindow : EditorWindow
    {
        ...
            
        #region Basic
            
            private int i = 0; // Basic 页面中使用的变量,如果定义最好放在 Basic 块中
            
            private void Basic()
            {
                GUILayout.Label("Basic: Hello IMGUI");
            }
    
        #endregion
            
        #region Other
            
            private void Other()
            {
                GUILayout.Label("Other: Hello IMGUI");
            }
    
        #endregion
    }
    

3 效果

​ 在 Basic 页面中,绘制 “Basic: Hello IMGUI”。

image-20250406041841280

​ 切换到 Other 页面,绘制 “Other: Hello IMGUI”。

image-20250406041907378

4 扩展方式

  1. 在枚举处增加“页面标签”

    public class MyIMGUIEditorWindow : EditorWindow
    {
        enum PageId
        {
            Basic,
            Other1,
            Other2,
            ... // 添加你的“页面标签”
        }
    
        ...
    }
    
  2. 增加绘制方法

    public class MyIMGUIEditorWindow : EditorWindow
    {
        ...
            
        #region Basic
            
            private int i = 0; // Basic 页面中使用的变量,如果定义最好放在 Basic 块中
            
            private void Basic()
            {
                GUILayout.Label("Basic: Hello IMGUI");
            }
    
        #endregion
            
        #region Other1
            
            private void Other1()
            {
                GUILayout.Label("Other: Hello IMGUI");
            }
    
        #endregion
            
        #region Other2 // 添加你的绘制方法
            
            private float _other2 = 0.6f;
            
            private void Other2()
            {
                GUILayout.Label("Other: Hello IMGUI");
            }
    
        #endregion
            
        ...
    }
    
  3. OnGUI 中增添绘制入口

    public class MyIMGUIEditorWindow : EditorWindow
    {
        ...
            
        private void OnGUI()
        {
            _currentPageId = (PageId) GUILayout.Toolbar((int) _currentPageId, Enum.GetNames(typeof(PageId)));
    
            if (_currentPageId == PageId.Basic)
            {
                Basic();
            }
            else if (_currentPageId == PageId.Other1)
            {
                Other1();
            }
            else if (_currentPageId == PageId.Other2) // 添加绘制入口
            {
                Other2();
            }
        }
        
        ...
    }
    

附:整体代码

// ------------------------------------------------------------
// @file       MyIMGUIEditorWindow.cs
// @brief
// @author     zheliku
// @Modified   2025-04-06 03:04:51
// @Copyright  Copyright (c) 2025, zheliku
// ------------------------------------------------------------

namespace EditorExtension
{
    using System;
    using UnityEditor;
    using UnityEngine;

    public class MyIMGUIEditorWindow : EditorWindow
    {
        enum PageId
        {
            Basic,
            Other
        }

        [MenuItem("EditorExtension/02.IMGUI/02.MyIMGUIEditorWindow")]
        private static void ShowWindow()
        {
            var window = GetWindow<MyIMGUIEditorWindow>();
            window.Show();
        }

        private PageId _currentPageId = PageId.Basic;

        private void CreateGUI()
        { }

        private void OnGUI()
        {
            _currentPageId = (PageId) GUILayout.Toolbar((int) _currentPageId, Enum.GetNames(typeof(PageId)));

            if (_currentPageId == PageId.Basic)
            {
                Basic();
            }
            else
            {
                Other();
            }
        }

    #region Basic
        
        private void Basic()
        {
            GUILayout.Label("Basic: Hello IMGUI");
        }

    #endregion
        
    #region Other
        
        private void Other()
        {
            GUILayout.Label("Other: Hello IMGUI");
        }

    #endregion
    }
}

相关文章:

  • 1-linux的基础知识
  • 「精华版」Doris VS Elasticsearch全方位对比和落地实践指导
  • Redis 连接:深入解析与优化实践
  • C++中的堆和栈
  • LabVIEW 长期项目开发
  • 蓝桥杯嵌入式第十四届模拟二(PWM、USART)
  • 云服务器实战:用 Nginx 搭建高性能 API 网关与反向代理服务(附完整配置流程)
  • 整数编码 - 华为OD统一考试(A卷、Java)
  • 【PFPGA学习】状态机思想编程HDLbitsFPGA练习
  • Go语言的测试框架
  • LeetCode第132题_分割回文串II
  • 手机中的type-C是如何防水的呢?
  • R语言使用ggplot2作图
  • RabbitMQ详解,RabbitMQ是什么?架构是怎样的?
  • ffmpeg音视频处理流程
  • vue 3 从零开始到掌握
  • 《R 数据框》
  • 检测链表是否有环, 动画演示, Floyd判圈算法扩展应用
  • stable diffusion 量化加速点
  • 2025-04-06 Unity Editor 2 —— GUILayout
  • 厦门网站制作网页/活动策划
  • 网站建设公司模板/重庆百度推广优化排名
  • 中国会展公司排名前十的公司/58同城关键词怎么优化
  • 做美食网站的图片素材/全球热搜榜排名今日
  • 无极app定制开发公司网站模板/网络推广哪家做得比较好
  • 专门做酒店网站/身边的网络营销案例