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

【Unity编辑器开发GUI.Window】

Unity GUI.Window 笔记

根据官方文档2021版本的,点击链接跳转记录

概述

GUI.Window 是 Unity IMGUI 系统中用于创建弹出窗口的核心方法,具有以下关键特性:

  • 浮动窗口:浮于普通 GUI 控件之上
  • 焦点控制:可通过点击获得焦点
  • 可拖拽:支持拖拽移动位置
  • 独立绘制:需要专门的函数来绘制窗口内容

方法签名

public static Rect Window(int id, Rect clientRect, GUI.WindowFunction func, string text, GUIStyle style
);

参数说明

参数类型描述是否必需
idint窗口唯一标识符(必须保证唯一)✅ 必需
clientRectRect窗口初始位置和大小(屏幕矩形)✅ 必需
funcGUI.WindowFunction窗口内容绘制函数(接收窗口ID作为参数)✅ 必需
textstring窗口标题栏显示的文本❌ 可选
imageTexture窗口标题栏显示的图像❌ 可选
contentGUIContent窗口标题栏显示的内容(文本+图像)❌ 可选
styleGUIStyle窗口自定义样式(默认使用当前GUISkin的window样式)❌ 可选

返回值

  • Rect:表示窗口当前位置和大小的矩形

核心机制

1. 多窗口管理

void OnGUI()
{// 多个窗口使用相同绘制函数windowRect0 = GUI.Window(0, windowRect0, DoMyWindow, "Window 0");windowRect1 = GUI.Window(1, windowRect1, DoMyWindow, "Window 1");
}void DoMyWindow(int windowID)
{// 根据ID区分窗口if (GUI.Button(new Rect(10, 20, 100, 20), "Click Me")){Debug.Log("Clicked in window: " + windowID);}
}
  • 关键点:使用不同的ID区分窗口
  • 优势:复用绘制函数减少代码冗余

2. 窗口显示控制

bool showWindow = true;void OnGUI()
{// 控制开关showWindow = GUI.Toggle(new Rect(10, 10, 100, 20), showWindow, "Show Window");if (showWindow){windowRect = GUI.Window(0, windowRect, DoMyWindow, "My Window");}
}
  • 开启窗口:在OnGUI中调用GUI.Window
  • 关闭窗口:停止调用GUI.Window
    注意,到目前写这边博文25年六月并没有函数可以关闭,只可以通过类似这样的条件来控制

3. GUI状态保存

Unity自动保存/恢复以下状态:

GUI.skin
GUI.enabled
GUI.color
GUI.backgroundColor
GUI.contentColor
GUI.matrix
  • 作用域:在调用func时恢复调用GUI.Window时的状态
  • 应用场景
    void OnGUI()
    {GUI.color = Color.red;windowRect = GUI.Window(0, windowRect, DoMyWindow, "Red Window");
    }void DoMyWindow(int id)
    {// 此处GUI.color为红色(被保存的状态)
    }
    

4. 透明效果

void DoMyWindow(int id)
{// 设置透明度GUI.color = new Color(1, 1, 1, 0.5f); // 50%透明// 窗口内容...
}
  • 使用GUI.color的Alpha分量实现淡入淡出效果

最佳实践

1. 拖拽实现

void DoMyWindow(int id)
{// 顶部20像素为拖拽区域GUI.DragWindow(new Rect(0, 0, 10000, 20));// 窗口内容...
}

注意,这里的GUI.DragWindow只能在窗口回调函数(即GUI.Window的第三个参数所指定的函数)内部调用。
为什么必须在回调函数内调用?(我的疑惑)
是因为Unity IMGUI 事件处理流程
在这里插入图片描述

2. 窗口层级管理

void OnGUI()
{// 先绘制底层窗口bottomWindowRect = GUI.Window(1, bottomWindowRect, DrawBottom, "Bottom");// 后绘制顶层窗口(显示在上方)topWindowRect = GUI.Window(2, topWindowRect, DrawTop, "Top");
}
  • 绘制顺序:后绘制的窗口显示在前

3. 自动布局窗口

void OnGUI()
{// 使用GUILayout.Window替代windowRect = GUILayout.Window(0, windowRect, DoWindowWithLayout, "Layout Window");
}void DoWindowWithLayout(int id)
{// 使用GUILayout自动布局GUILayout.Label("Auto layout content");if (GUILayout.Button("Button")){// ...}
}

限制与注意事项

  1. GUILayout兼容性

    • MonoBehaviour.useGUILayout = false时,GUI.Window无效
    • 使用GUILayout控件时,应使用GUILayout.Window
  2. 绘制顺序

    • 窗口从后往前绘制(Z轴顺序)
    • 不要依赖窗口函数的调用顺序
  3. 性能考虑

    • 频繁创建/销毁窗口可能影响性能
    • 考虑复用窗口对象
  4. 移动平台

    • 触摸设备上拖拽体验可能不佳
    • 需要增加热区大小

高级技巧

1. 窗口聚焦控制

void DoMyWindow(int id)
{if (GUILayout.Button("Focus Me")){GUI.FocusWindow(id);}
}

2. 窗口动画

IEnumerator AnimateWindow()
{float duration = 1f;for (float t = 0; t < duration; t += Time.deltaTime){windowRect.y = Mathf.Lerp(-100, 100, t/duration);yield return null;}
}

3. 模态窗口

void OnGUI()
{// 禁用背景GUI.enabled = !modalActive;// 绘制普通UI...// 启用并绘制模态窗口GUI.enabled = true;if (modalActive){modalRect = GUI.Window(0, modalRect, DrawModal, "Modal");}
}

总结

GUI.Window 是 Unity IMGUI 系统的核心组件,用于创建交互式窗口:

  • 唯一ID是窗口系统的基础
  • 返回值保存窗口位置状态
  • GUI状态在窗口间自动保存/恢复
  • 拖拽通过GUI.DragWindow实现
  • 层级由绘制顺序决定
http://www.xdnf.cn/news/1146853.html

相关文章:

  • Netty集群方案详解与实战(Zookeeper + Redis + RabbitMQ)
  • 如何用Python并发下载?深入解析concurrent.futures 与期物机制
  • 【密码学】1. 引言
  • 目标框的位置以及大小的分布
  • 题解:CF1617C Paprika and Permutation
  • VMC850立式加工中心Y轴传动机械结构设计cad【7张】三维图+设计说明书
  • DTW算法解决时序问题的解析实践
  • JavaSE -- 数组详细讲解(数组介绍,Arrays常用方法,二维数组创建)
  • Spring中的设计模式
  • pom.xml文件中的${}变量从哪里传值
  • 基于Qwen2.5-3B-Instruct的LoRA微调与推理实战指南
  • js中的微任务和宏任务的理解
  • 读书笔记:《动手做AI Agent》
  • Android性能优化之UI渲染优化
  • LP-MSPM0G3507学习--05中断及管脚中断
  • CMake指令:常见内置命令行工具( CMake -E )
  • math.h函数
  • CCF编程能力等级认证GESP—C++3级—20250628
  • 20250718-3-Kubernetes 应用程序生命周期管理-Pod对象:存在意义_笔记
  • MyBatis-Flex代码生成
  • jvm分析篇---1、先认识下dump文件
  • b-up:Enzo_Mi:深度学习基础知识
  • 【C语言进阶】题目练习(2)
  • 【51】MFC入门到精通——MFC串口助手(一)---初级版(初始化、串口设置、修改参数、打开/关闭、状态显示),附源码
  • 机器学习基础:线性回归算法详解(原理+代码+实战)
  • Proto文件从入门到精通——现代分布式系统通信的基石(含实战案例)
  • 数据库模型异常问题深度解析:冗余与操作异常
  • 柴油机活塞cad【4张】三维图+设计说明书
  • 小架构step系列18:工具
  • 《每日AI-人工智能-编程日报》--2025年7月18日