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.pswp.cn/pingmian/89534.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89534.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/89534.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CAN通信驱动开发注意事项

以下是CAN通信驱动开发的关键注意事项相关的整理,涵盖硬件配置、协议实现、错误处理及性能优化等方面: 一、硬件层配置要点 引脚复用与时钟 确认MCU的CAN控制器引脚是否与GPIO复用,正确配置复用模式。 检查CAN控制器时钟源,确保波特率计算基准准确。 收发器(Transceiver)…

CCF编程能力等级认证GESP—C++8级—20250628

CCF编程能力等级认证GESP—C8级—20250628单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)树上旅行遍历计数单选题&#xff08;每题 2 分&#xff0c;共 30…

135. Java 泛型 - 无界通配符

文章目录135. Java 泛型 - 无界通配符 (?)**1. 什么是无界通配符 (?)&#xff1f;****2. 为什么使用无界通配符&#xff1f;****3. 示例&#xff1a;使用 ? 处理任意列表****❌ 错误示例****✅ 正确示例****4. 为什么 List<Object> 和 List<?> 不一样&#xff…

NOIP提高组|2010T1机器翻译

NOIP2010年提高组第一题:机器翻译 题目描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果…

Change Data Capture (CDC) with Kafka Connect:实时数据同步的完整指南

Change Data Capture (CDC) 是一种高效的数据同步技术&#xff0c;能够捕获数据库的变更&#xff08;插入、更新、删除&#xff09;并实时传输到其他系统。结合 Kafka Connect&#xff0c;我们可以构建一个可靠、可扩展的 CDC 管道&#xff0c;实现数据库与数据湖、数据仓库或消…

云手机网络加速全攻略:解决游戏卡顿与APP连接失败困扰

用云手机玩游戏、挂脚本、跑自动任务&#xff0c;明明后台显示在线&#xff0c;但画面卡顿、操作延迟、甚至APP直接“转圈圈连不上”&#xff0c;是不是很抓狂&#xff1f;问题出在哪里&#xff1f;云手机不卡&#xff0c;网络卡&#xff1f;其实&#xff0c;大多数云手机的性能…

从“数字土著”到“数据公民”:K-12数据伦理课程的设计、实施与成效追踪研究

一、引言 1.1 研究背景与意义 在当今数字时代&#xff0c;信息技术以前所未有的速度渗透到社会的各个领域&#xff0c;深刻地改变了人们的生活、工作和学习方式。K-12 教育作为基础教育的关键阶段&#xff0c;也在数字化浪潮的推动下发生着巨大的变革。随着大数据、人工智能…

LVS详解

LVS(Linux virtual server)简介即linux虚拟服务器四层负载均衡基本上都会使用 LVS&#xff0c;据了解 BAT 等大厂都是 LVS 重度使用者&#xff0c;就是因为 LVS 非常出色的性能&#xff0c;能为公司节省巨大的成本。LVS&#xff0c;全称 Linux Virtual Server 是由国人章文嵩博…

Linux内核设计与实现 - 第5章 系统调用

目录一、系统调用概述二、系统调用实现机制四、性能优化技术五、常见问题排查六、安全注意事项一、系统调用概述 定义 用户空间访问内核功能的唯一合法入口提供硬件抽象接口&#xff0c;保证系统稳定和安全 与API区别 特性系统调用API执行层级内核态用户态实现方式软中断(int …

纸板制造糊机操作

糊机操作技巧:开机流程&#xff1a;首先&#xff0c;一切的一切&#xff0c;要看懂生管&#xff0c;我们要用哪个楞别&#xff0c;再看哪个门幅和材质。 也就是说&#xff0c;一切的一切&#xff0c;要生产了&#xff0c;原纸不能用错了吧&#xff01; 第一步&#xff1a; 压压…

WPF 多窗口分文件实现方案

WPF 多窗口分文件实现方案 项目文件结构 WindowSwitcher/ ├── App.xaml ├── App.xaml.cs ├── MainWindow.xaml ├── MainWindow.xaml.cs ├── Views/ │ ├── SettingsWindow.xaml │ ├── SettingsWindow.xaml.cs │ ├── DataWindow.xaml │ ├─…

在服务器(ECS)部署 MySQL 操作流程

在部署 MySQL 数据库之前需要准备好服务器环境。可以通过以下两种方式来准备部署服务器&#xff1a;云服务器&#xff08;ECS&#xff09;&#xff0c;如&#xff1a;阿里云、华为云、腾讯云等。IDC服务器。 现以阿里云服务器&#xff08;ECS&#xff09;Windows版本来进行部署…

Java File 类详解:从基础操作到实战应用,掌握文件与目录处理全貌

作为一名 Java 开发工程师&#xff0c;你一定在实际开发中遇到过需要操作文件或目录的场景&#xff0c;例如&#xff1a;读写配置文件、上传下载、日志处理、文件遍历、路径管理等。Java 提供了 java.io.File 类来帮助开发者完成这些任务。本文将带你全面掌握&#xff1a;File …

嵌入式学习-PyTorch(9)-day25

进入尾声&#xff0c;一个完整的模型训练 &#xff0c;点亮的第一个led#自己注释版 import torch import torchvision.datasets from torch import nn from torch.utils.tensorboard import SummaryWriter import time # from model import * from torch.utils.data import Dat…

用AI做带货视频评论分析进阶提分【Datawhale AI 夏令营】

文章目录回顾赛题优化1️⃣优化2️⃣回顾赛题 模块内容类型说明/示例赛题背景概述参赛者需构建端到端评论分析系统&#xff0c;实现商品识别、多维情感分析、评论聚类与主题提炼三大任务。商品识别输入video_desc&#xff08;视频描述&#xff09; video_tags&#xff08;标签…

Redis常见数据结构详细介绍

Redis 作为一款高性能的开源内存数据库&#xff0c;凭借其丰富多样的数据结构和出色的性能&#xff0c;在缓存、会话存储、实时分析等众多场景中得到了广泛应用。下面将详细介绍 Redis 主要的数据结构&#xff0c;包括它们的类型、具体用法和适用场景。1、字符串&#xff08;St…

HAMR硬盘高温写入的可靠性问题

热辅助磁记录(HAMR)作为突破传统磁记录密度极限的下一代存储技术,其在数据中心大规模应用的核心挑战在于可靠性保障。 扩展阅读: 下一个存储战场:HAMR技术HDD HAMR技术进入云存储市场! 漫谈HAMR硬盘的可靠性 随着存储密度向4Tbpsi迈进,传统磁记录技术遭遇"三难困境…

使用llama-factory进行qwen3模型微调

运行环境 Linux 系统(ubuntu) Gpu (NVIDIA) 安装部署 llama factory CUDA 安装 首先,在 https://developer.nvidia.com/cuda-gpus 查看您的 GPU 是否支持CUDA 保证当前 Linux 版本支持CUDA. 在命令行中输入 uname -m && cat /etc/*release,应当看到类似的输出 x8…

tcp/udp调试工具

几款tcp/udp调试工具 下载地址&#xff1a;夸克网盘

智慧光伏发电信息化系统需求文档

以下是从产品经理角度撰写的智慧光伏发电信息化系统需求文档&#xff0c;聚焦光伏行业痛点与业务价值&#xff0c;遵循标准PRD结构&#xff1a;智慧光伏发电信息化系统需求文档 版本&#xff1a;1.0 日期&#xff1a;2025年7月19日 作者&#xff1a;产品经理视角一、文档概述 1…