Unity:GUI筆記(二)——工具欄和選擇網格、滾動列表和分組、窗口、自定義皮膚樣式、自動布局

寫在前面:

寫本系列(自用)的目的是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解,方便自己以后快速復習,減少遺忘。

五、工具欄和選擇網格

1、工具欄

使用Unity提供的API:GUI.Toolbar()可以創建一個工具欄。有三個參數是必須傳入的:工具欄位置、當前選中的索引、所有選項列表。

位置依然是Rect類型的變量,工具欄位置索引為int類型變量。由于我們需要動態控制工具欄位置索引,因此與之前的API相同,需要創建當前索引變量,第二個參數的位置傳入當前變量,并且讓這個變量接收函數GUI.Toolbar()的返回值。第三個參數是所有選項列表,可以創建一個string類型的數組,將數組傳入。

private int toolbarIndex = 0;
private string[] toolbarInfofs = new string[] {"選項一","選項二","選項三" };
private void OnGUI()
{toolbarIndex =  GUI.Toolbar(new Rect(0, 0, 200, 30), toolbarIndex, toolbarInfofs);
}

2、選擇網格

選擇網格與GUI.Toolbar()用法差不多,使用的API是:GUI.SelectionGrid(),前三個參數與GUI.Toolbar()相同,多了第四個參數xCount,表示水平方向最多顯示的按鈕數量,當前數量為3,所以可能與原來的輸出沒有區別。

private string[] toolbarInfofs = new string[] {"選項一","選項二","選項三" };
private int selGridIndex = 0;
private void OnGUI()
{//相對toolbar多了一個參數,xCount代表水平方向最多顯示的按鈕數量selGridIndex = GUI.SelectionGrid(new Rect(0, 50, 200, 60), selGridIndex, toolbarInfofs, 3);
}

數量為3時:

數量為2時:

數量為1時:

六、滾動列表和分組

1、分組

分組是一種批量控制控件位置的方法,可以理解為包裹著的控件加了一個父對象。可以通過控制分組來控制包裹控件的位置。

提供的API是GUI.BeginGroup()和GUI.EndGroup()。

GUI.BeginGroup()和GUI.EndGroup()的中間寫需要批量控制的控件代碼,GUI.BeginGroup()中必須傳入位置參數,中間的控件位置就是以這個位置為基準的。

public Rect groupPos;private void OnGUI()
{GUI.BeginGroup(groupPos);GUI.Button(new Rect(0, 0, 100, 50), "測試按鈕");GUI.Label(new Rect(0, 60, 100, 20), "Label信息");GUI.EndGroup();
}

例如,當位置信息輸入如下時:

桌面上的兩個控件信息就會這樣顯示:

再次修改以上的位置信息,這兩個控件信息就會批量跟隨修改。

2、滾動列表

滾動列表會開辟一個窗口,窗口上會有界面上這樣的滾動條:

滾動列表使用的API是GUI.BeginScrollView(),同樣有GUI.EndScrollView(),將需要放在滾動列表里的信息批量顯示。

其中,GUI.BeginScrollView()有三個必須的參數。第一個參數是滾動列表在屏幕上的顯示區域,第二個參數是當前顯示的位置(例如在滾動橫向或者縱向滾動條后,當前所顯示的位置),是個Vector2變量。第三個參數是滾動列表中內容的總大小和位置。當第三個參數大于第一個參數時,就會產生滾動條(可以以Window窗口來類別,假設當前頁面大小設置為是500×500(第一個參數)。那么假設此時頁面里的內容量為1000×800(第三個參數),大于500×500,就會產生滾動條,滾動著去顯示所有內容)

那么,當第三個參數的值小于第一個參數時,就不會產生滾動條。這是因為設置了第四、五個參數,這兩個參數默認為false。如果想要第三個參數的值小于第一個參數時也有滾動條,就把它們改為true。

public Rect scPos;
public Rect showPos;
private Vector2 nowPos;
private string[] strs = new string[] {"123","456", "789", "111" };private void OnGUI()
{nowPos = GUI.BeginScrollView(scPos, nowPos, showPos);GUI.Toolbar(new Rect(0, 0, 300, 50), 0, strs);GUI.Toolbar(new Rect(0, 60, 300, 50), 0, strs);GUI.Toolbar(new Rect(0, 120, 300, 50), 0, strs);GUI.Toolbar(new Rect(0, 180, 300, 50), 0, strs);GUI.EndScrollView();
}

七、窗口

1、窗口

創建窗口使用的API是:GUI.Window(),必要的參數有四個。

第一個參數是窗口唯一的ID,不要和別的窗口重復。假如重復使用就會覆蓋掉之前的窗口。第二個參數是位置信息,Rect類型。第三個參數是委托,需要傳入一個函數,是用于繪制窗口用的函數(顯示窗口內的控件) 重寫一個函數傳入即可。第四個參數是窗口名。此外,還能傳入自定義樣式等參數,這里不做演示。

不同的窗口可以傳入相同的委托函數,也就是說id除了區分不同窗口,還可以在一個函數中去處理多個窗口,通過id去區分它們。委托函數內可以根據窗口id來執行不同的語句,例如使用Switch case語句。委托函數中可以繪制窗口內的控件,按鈕、文字信息、輸入框等等。

private void OnGUI()
{GUI.Window(1, new Rect(100, 100, 200, 150), DrawWindow, "測試窗口");GUI.Window(2, new Rect(100, 350, 200, 150), DrawWindow, "測試窗口2");}private void DrawWindow(int id)
{switch(id){case 1:GUI.Button(new Rect(0, 0, 30, 20), "1");break;case 2:GUI.Button(new Rect(0, 0, 30, 20), "2");break;}}

2、模態窗口

模態窗口除了調用API與普通窗口不同外,參數等都與普通參數相同。它的API為:GUI.ModalWindow()

當模態窗口出現時,其他任何控件都不再會響應你的鼠標,類似一個警告窗口,必須要處理完該窗口的邏輯時才能處理其他窗口。

private void OnGUI()
{GUI.Window(1, new Rect(100, 100, 200, 150), DrawWindow, "測試窗口");GUI.Window(2, new Rect(100, 350, 200, 150), DrawWindow, "測試窗口2");GUI.ModalWindow(3, new Rect(300, 100, 200, 150), DrawWindow,"模態窗口");
}private void DrawWindow(int id)
{switch(id){case 1:GUI.Button(new Rect(0, 0, 30, 20), "1");break;case 2:GUI.Button(new Rect(0, 0, 30, 20), "2");break;case 3:GUI.Button(new Rect(0, 0, 30, 20), "3");break;}}

3、拖動窗口

拖動窗口就是能被拖動的普通窗口或模態窗口。窗口的API的返回值是一個Rect變量,因此可以效仿之前的控件,創建一個Rect變量接收這個返回值,并將值傳入Window函數中。但是僅僅這樣設置不能拖動窗口,位置賦值只是前提。

為了讓窗口可以被拖動,還需要在委托函數中,處理拖動窗口邏輯處加上:GUI.DragWindow();這個API寫在委托函數中,可以讓窗口被拖動,傳入Rect參數的重載左右是決定窗口中哪一部分位置可以被拖動(例如可以傳入位置,指定只有拖動窗口最上面一排時,整個窗口可以被拖動),無參重載默認窗口中所有位置都能被拖動。

private Rect dragWinPos = new Rect(400, 400, 200, 150);private void OnGUI()
{dragWinPos = GUI.Window(4, dragWinPos, DrawWindow, "拖動窗口");
}private void DrawWindow(int id)
{switch(id){case 4:GUI.DragWindow();break;}  
}

八、自定義皮膚樣式

1、顏色

(1)全局顏色

全局顏色使用的API是GUI.color = Color.red,這里是將全局顏色定為紅色。全局的著色顏色,影響背景和文字顏色,哪怕自定義style顏色也會被改變,全局顏色會在之前顏色的基礎上進行疊加。

可以隨時在后面更改全局顏色,會作用在更改后的代碼上。如下例所示:

 public GUIStyle style;private void OnGUI(){GUI.color = Color.red;GUI.Button(new Rect(0, 0, 100, 30), "測試按鈕");GUI.Label(new Rect(0, 50, 100, 30), "測試按鈕",style);GUI.color = Color.white;//可以隨時改后面的GUI.Button(new Rect(0, 100, 100, 30), "測試按鈕",style);}

(2)文本顏色

文本顏色使用的API是GUI.contentColor。文本著色顏色,會和全局顏色相乘,所以最好單獨使用。

private void OnGUI(){GUI.contentColor = Color.yellow;GUI.Button(new Rect(0, 0, 100, 30), "測試按鈕");GUI.Label(new Rect(0, 50, 100, 30), "測試按鈕");}

(3)背景顏色

背景顏色使用的API是?GUI.backgroundColor。背景元素著色顏色,也會和全局顏色相乘。

 public GUIStyle style;private void OnGUI(){GUI.backgroundColor = Color.red;GUI.Label(new Rect(0, 50, 100, 30), "測試按鈕");GUI.Button(new Rect(0, 0, 100, 30), "測試按鈕",style);}

2、整體皮膚樣式

整體皮膚樣式使用的API是:?GUI.skin。默認情況下為null,使用的是系統自帶的那一套皮膚樣式。皮膚文件是多個GUI控件的綜合體,可以幫助我們整套的設置 自定義樣式,相對單個控件要方便一點。

可以在資源文件中創建一個皮膚資源:

如下:

里面是一些熟悉的按鍵樣式更改:

修改后將自己自定義的皮膚樣式傳入,即可一件設置自定義樣式。

 public GUISkin skin;private void OnGUI(){GUI.skin = null;GUI.Button(new Rect(0, 0, 100, 30), "測試按鈕");GUI.skin = skin;GUI.Button(new Rect(0, 50, 100, 30), "測試按鈕");}

九、自動布局

1、GUILayout自動布局

自動布局的作用是:控件不用傳入位置參數,不用我們來布局,會以最長按鈕來拉伸,保證對齊。主要用于進行編輯器開發。

自動布局的API是:GUILayout,可以運用這個API來加點使用之前的各個控件,例如GUILayout.Button("123")

private void OnGUI()
{GUILayout.Button("123");GUILayout.Button("1234");GUILayout.Button("12345");
}

可以看到,他為我們自動排布了這三個按鈕,并且按鈕的大小都是相同的。如果想要橫向排布按鈕、修改自動布局顯示的區域,可以使用GUILayout.BeginHorizontal(),GUILayout.EndHorizontal()與GUILayout.BeginArea(),GUILayout.EndHorizontal()將中間的內容包裹起來,例如:

private void OnGUI()
{GUILayout.BeginArea(new Rect(100, 100, 100, 100));GUILayout.BeginHorizontal();GUILayout.Button("123");GUILayout.Button("1234");GUILayout.Button("12345");GUILayout.EndHorizontal();GUILayout.EndArea();
}

2、布局選項

除了以上基礎設置,還有一些布局選項供我們使用,如下,分別可以設置控件的固定寬高、允許控件的最小寬高、允許控件的最大寬高、允許或禁止寬高擴展。

這里說一下允許或禁止寬高的擴展。從第一點可以知道,自動布局會自動幫我們把按鈕對齊,它會將所有控件的大小都調整為最大的那個控件大小。如果禁止寬高擴展,自動布局就不會為我們進行大小調整。接下來會有一個使用示例。

private void OnGUI()
{//控件的固定寬高GUILayout.Width(300);GUILayout.Height(200);//允許控件的最小寬高GUILayout.MinWidth(50);GUILayout.MinHeight(50);//允許控件的最大寬高GUILayout.MaxWidth(100);GUILayout.MaxHeight(100);//允許或禁止寬高擴展GUILayout.ExpandWidth(true);GUILayout.ExpandHeight(false);GUILayout.ExpandHeight(true);GUILayout.ExpandWidth(false);
}

布局選項的使用示例,這里僅用禁止寬擴展為案例:

private void OnGUI()
{GUILayout.Button("123",GUILayout.ExpandWidth(false));GUILayout.Button("1234");GUILayout.Button("1234567");
}

補充知識:

在類前加上特性[ExecuteAlways],可以讓這個類在編輯器模式下(不運行)也可以執行。

[ExecuteAlways]
public class lession10 : MonoBehaviour
{private void OnGUI(){}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918938.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918938.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918938.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Streamlit實現Qwen對話機器人

Web界面 一、Streamlit 是一個用于創建數據科學和機器學習應用的開源前端框架,能夠快速將 Python 腳本轉化為交互式 Web 應用。通過簡單的 Python API 就能構建出交互式的數據應用。 1、主要特點 簡單易用:純 Python 編寫代碼,API 簡潔直觀…

Linux-地址空間

目錄 1.介紹 2.理解 3.Linux早期的內核調度隊列 1.介紹 這是32位的程序空間地址圖&#xff1a; 為了更好地理解這段圖&#xff0c;我們來寫一段代碼編譯運行&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <std…

**標題:發散創新之力,探索隱私計算的未來**隱私計算,作為當下數字化時代的熱門話題,正受

標題&#xff1a;發散創新之力&#xff0c;探索隱私計算的未來 隱私計算&#xff0c;作為當下數字化時代的熱門話題&#xff0c;正受到越來越多開發者和從業者的關注。本文將帶您走進隱私計算的奇妙世界&#xff0c;探討其背后的技術原理、應用場景以及發展趨勢。 一、隱私計算…

線程P5 | 單例模式[線程安全版]~懶漢 + 餓漢

什么是單例模式&#xff1f;在我們正式講解單例模式之前&#xff0c;沒有了解過的小伙伴可能會有疑問...到底啥叫單例模式&#xff1f;&#xff1f;其實單例模式呢&#xff0c;是我們設計模式中的一種&#xff0c;所謂的設計模式&#xff0c;你可以把它理解為一個模板&#xff…

kubernetes中數據存儲etcd

etcd 在 Kubernetes 中的角色核心定位&#xff1a;Kubernetes 的 唯一持久化數據存儲&#xff08;一致性數據庫&#xff09;。職責&#xff1a; 保存整個集群的期望狀態&#xff08;desired state&#xff09;&#xff0c;包括節點信息、Pod 清單、Service 定義、ConfigMap、Se…

Linux crontab定時任務

參考資料 【図解】cronの仕組み定時任務 - crontab解決ubuntu下定時任務不執行問題crontab環境變量問題&#x1f4a5;Linux定時任務功能詳解&#xff1a;crontab與at命令應用指南 目錄一. 環境準備1.1 wsl開啟systemd1.2 開啟cron日志二. cron服務管理相關命令2.1 service 的方…

企業頻繁收到軟件律師函?如何徹底解決這一難題

1. 引言&#xff1a;律師函頻發&#xff0c;已成信息化管理的“隱形雷區”在工業制造、芯片、航空航天、船舶制造、醫療器械等高要求行業&#xff0c;軟件不僅是研發與生產的關鍵工具&#xff0c;更是企業數據與知識產權安全的“底座”。然而&#xff0c;不少企業卻在日常運營中…

在 macOS 上順利安裝 lapsolver

一、什么是 lapsolver&#xff1f; lapsolver 是一個用于求解線性分配問題&#xff08;Linear Assignment Problem, LAP&#xff09; 的 Python 庫。線性分配問題是運籌學中的經典問題&#xff0c;核心是在兩個集合&#xff08;如“工人”與“任務”&#xff09;之間找到一組最…

宋紅康 JVM 筆記 Day02|JVM的架構模型、生命周期、發展歷程

一、今日視頻區間 P13-P25 二、一句話總結 JVM的架構模型&#xff1b;JVM的生命周期&#xff1b;JVM發展歷程&#xff1b; 三、關鍵圖/命令 3.1 JVM的架構模型Java程序對.class字節碼文件進行反編譯操作&#xff1a;在idea中先運行需要反編譯的代碼&#xff0c;找到對應的字節碼…

Linux新手上路 | 在Ubuntu上Pluma文本編輯器的安裝與基本使用

Linux新手上路 | 在Ubuntu上Pluma文本編輯器的安裝與基本使用一、Pluma工具介紹1.1 Pluma 工具概述1.2 主要功能1.3 適用場景二、安裝Pluma2.1 安裝方法2.2 啟動Pluma工具三、漢化方法3.1 安裝漢化包3.2 設置系統語言3.3 重新打開Pluma四、基本使用方法4.1 編寫文本內容4.2 關鍵…

React 揭秘:從新手到高手的進階之路

目錄 React&#xff1a;前端開發新寵? React 初相識? 什么是 React? React 的核心特性? 1.組件化開發 2.虛擬 DOM 與 Diff 算法 單向數據流 搭建 React 開發環境 環境準備? 創建 React 項目 項目結構解析 React 基礎語法與核心概念 JSX 語法? 基本語法規則…

八股文小記 Servlet 過濾器-Spring MVC 攔截器-Spring AOP 攔截器區別

您對執行機制的洞察非常準確&#xff01;讓我們深入分析這三種組件的調用機制及其與 AOP 節點的關系&#xff1a; 一、執行機制的本質區別組件調用機制實現原理Servlet 過濾器遞歸調用通過 FilterChain.doFilter() 顯式遞歸調用下一個節點Spring MVC 攔截器遍歷調用由 HandlerE…

qml 實現數值鍵盤

import QtQuick 2.0import QtQuick.Layouts 1.12 import"../pad" // PasswordKeyboard.qml import QtQuick 2.12ColumnLayout {id: keyboardspacing: 8// 鍵盤標題Text {text: "安全輸入"font.pixelSize: 16color: "#666"Layout.alignment: Qt.A…

PID控制算法

文章目錄引言一、基本原理1.1.簡介1.2.開環與閉環1.3.PID 的公式1.3.1.比例項&#xff08;Proportional&#xff09;1.3.2.積分項&#xff08;Integral&#xff09;1.3.3.微分項&#xff08;Differential&#xff09;1.4.連續形式與離散形式的 PID 公式1.4.1.連續形式1.4.2.離散…

MyBatis 動態數據源切換在 Spring Boot 環境下的實現方案

第一章 需求背景與技術選型1.1 多數據源場景概述在大型企業級應用中&#xff0c;單一數據庫往往無法滿足高并發和多業務線的需求&#xff0c;因此需要引入 多數據源 的架構設計。常見的多數據源場景包括&#xff1a;讀寫分離、多租戶、分庫分表以及數據源負載均衡等。讀寫分離&…

PCA降維理論詳解

文章目錄一、什么是PCA&#xff1f;二、為什么需要降維&#xff1f;三、PCA的數學原理與詳細推導視角一&#xff1a;最大化投影方差&#xff08;Maximizing Variance&#xff09;視角二&#xff1a;最小化重構誤差&#xff08;Minimizing Reconstruction Error&#xff09;四、…

Android RxJava變換操作符詳解

RxJava作為響應式編程在Android開發中的利器&#xff0c;其強大的變換操作符能夠幫助我們優雅地處理數據流。本文將深入講解RxJava中最常用的變換操作符及其實際應用場景。一、RxJava變換操作符概述變換操作符(Transformation Operators)用于對Observable發射的數據序列進行變換…

開源數據發現平臺:Amundsen 快速上手指南

Amundsen 是一個數據發現和元數據引擎&#xff0c;旨在提高數據分析師、數據科學家和工程師與數據交互時的生產力。目前&#xff0c;它通過索引數據資源&#xff08;表格、儀表板、數據流等&#xff09;并基于使用模式&#xff08;例如&#xff0c;查詢頻率高的表格會優先于查詢…

【密碼學實戰】國密SM2算法介紹及加解密/簽名代碼實現示例

引言 在信息安全領域&#xff0c;密碼算法是數據保護的核心基石。2010 年&#xff0c;中國國家密碼管理局發布了 SM2 橢圓曲線公鑰密碼算法&#xff0c;作為國產密碼標準的核心成員&#xff0c;它憑借高效安全的特性&#xff0c;逐步替代 RSA 等國際算法&#xff0c;廣泛應用于…

QT開發中如何加載第三方dll文件

文章目錄&#x1f527; 一、隱式加載&#xff08;靜態鏈接&#xff09;操作步驟&#xff1a;?? 二、顯式加載&#xff08;動態鏈接&#xff0c;推薦使用QLibrary&#xff09;操作步驟&#xff1a;&#x1f4bb; 三、直接調用Windows API&#xff08;僅Windows&#xff09;??…