【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.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…