第1章回顧與展望_第1頁
第1章回顧與展望_第2頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第1章 回顧與展望最新的Unity UI系統(tǒng)經過開發(fā)人員多年研發(fā)方得以面世(開發(fā)過程受到了預算緊縮的考驗),其中包含了諸多最新特性并以免費方式提供給廣大用戶。在討論新系統(tǒng)之前,需要對遺留GUI系統(tǒng)(即舊系統(tǒng),具有向后兼容之特性)予以回顧,進而在此基礎上理解新系統(tǒng)的功能和應用,而傳統(tǒng)教程還停留在遺留GUI階段。在讀者理解了遺留系統(tǒng)后,本書將對新系統(tǒng)加以重點分析,這也是后續(xù)內容的主要工作。本章主要涉及以下內容:Unity遺留GUI系統(tǒng)的回顧。與遺留GUI系統(tǒng)相關的建議、技巧和講解。新系統(tǒng)特性概覽。購買 Packt 出版社書籍的讀者可通過個人賬號在。另外,讀者還可訪問,經注冊后可通過郵件方式直接獲得

2、相關文件。除此之外,作者還提供了支持論壇,讀者可直接向作者進行提問;另外,論壇中還包含了相關的注意事項,對應網址為。1.1 發(fā) 展 狀 況Unity的遺留GUI系統(tǒng)歷經多年發(fā)展添加了諸多新特性,并對性能問題有所改善??紤]到在原始實現(xiàn)基礎上得以完成,因而系統(tǒng)包含了某些限制條件,且需要向后兼容(類似于Windows操作系統(tǒng),時至今日,該系統(tǒng)仍然需要服務于采用BASIC語言編寫的程序。關于BASIC語言,讀者可訪問)。這里并非認為遺留系統(tǒng)一無是處,與Unity 4.x和Unity 5.x相比,該系統(tǒng)在新特性方面有所欠缺。在新系統(tǒng)中,采用了更為高級的設計方案以及全新的核心內容。遺留系統(tǒng)中的主要缺陷在于

3、,該系統(tǒng)僅在3D元素之上的屏幕空間內進行繪制(而非其“內部”)。對于菜單或標題中的覆蓋圖,這并無太大問題;而在3D場景中,其整合方式將變得較為困難。關于世界空間和屏幕空間的更多內容,讀者可參考Unity Answers,對應網址為。因此,在講述新系統(tǒng)的優(yōu)點之前,首先需要考查該系統(tǒng)的根源(如果讀者對遺留系統(tǒng)較為熟悉,則可忽略本節(jié)內容)。本書將遺留GUI簡稱為GUI。相應地,當討論新系統(tǒng)時,該系統(tǒng)則稱作UI或Unity UI。用戶在閱讀時不可將其混為一談。另外,讀者在Web或論壇中可能還會遇到uGUI這一類術語,該術語表示Unity UI新系統(tǒng)的研發(fā)代碼。GUI控件相關介紹如下。遺留系統(tǒng)空間針對標

4、題應用提供了基本的風格化控制。遺留系統(tǒng)中的全部控件均采用內建的OnGUI方法,并在GUI渲染階段進行繪制。在相關示例中,全部控件實例位于Assets腳本中。針對功能性GUI空間,場景中的相機須于其上綁定GUILayer組件。默認條件下,該組件位于場景中的Camera對象上,且多數情況下用戶不會對其有所察覺。若將其移除,則GUI工作時需要再次將其加入。針對OnGUI委托處理程序,該組件可視為鉤子程序,以確保其在每幀內被調用。類似于腳本中的Update方法,如果渲染操作降低了運行速度,OnGUI方法將在每幀內多次被調用。當構建自己的遺留GUI腳本時,用戶應對此引起足夠的重視。原GUI中的控件包含以

5、下內容:標簽紋理按鈕文本框(包括單行文本框、多行文本框及密碼文本框等)列表框工具欄滑塊滾動條窗口下面將對此進行逐一考查。對于GUI腳本中的示例項目,全部代碼均位于下載代碼中的AssetsScripts文件夾中。當讀者對此進行嘗試時,須創(chuàng)建新項目、場景以及腳本,針對腳本中的各個控件設置代碼,最后還需將該腳本綁定至相機對象上(將其從項目視圖拖曳至場景層次結構中的Main Camera GameObject中)。隨后,可運行該項目,或者利用ExecuteInEditMode屬性修飾當前類,進而在游戲視圖中對其進行查看。1. Label控件大多數GUI系統(tǒng)中均會首先介紹Label控件,這一類控件提供了

6、風格化的控制效果,并在屏幕上顯示只讀文本。腳本中一般會包含下列方法:void OnGUI() (new Rect(25, 15, 100, 30), Label);這將生成如圖1-1所示的屏幕顯示效果。圖1-1Label控件可通過guiText GameObject屬性()或GUIStyle(稍后將對此加以討論)調整字體設置。當設置腳本中的時,可在腳本中使用下列代碼,對應位置可位于Awake/Start函數中,或者繪制下一個文本段(采用另一種字體)之前。public Font myFont = new Font(arial); = myFont; 另外,用戶還可使用導入字體在Inspector

7、中設置myFont屬性。Label控件構成了全部控件的基礎內容,同時,其他控件均繼承自該控件,且針對顯示文本的樣式具有相同的行為。針對具體內容,Label還支持Texture的使用,但不支持文本和紋理的同時使用。對此,可使用Label控件和其他控件之間的圖層操作,進而實現(xiàn)相同的效果(控件可通過調用順序隱式地加以繪制),如下所示:public Texture2D myTexture;void Start() myTexture = new Texture2D(125, 15);void OnGUI() /Draw a texture(new Rect(125, 15, 100, 30), myT

8、exture);/Draw some text on top of the texture using a label(new Rect(125, 15, 100, 30), Text overlay);通過在調用間設置“ =/*/;”可重寫控件的繪制順序。除非特殊情況,否則不建議采用這一方法。隨后,紋理將被繪制,并與Label尺寸相匹配。默認狀態(tài)下,紋理將縮放至最小尺寸。另外,還可通過GUIStyle對其進行調整,包括修改固定的寬度值和高度值,設置拉伸特征。稍后將對GUIStyle和GUISkin加以討論。2. 紋理繪制GUI框架可簡化紋理的繪制過程,其中,DrawTexture函數與包含紋

9、理或其他控件的Label有所不同(這也是遺留GUI發(fā)展過程中的另一個特征)。實際上,這與前述Label控件相同,但僅繪制紋理而非文本,如下所示:public Texture2D myTexture;void Start() myTexture = new Texture2D(125, 15);void OnGUI() exture(new Rect(325, 15, 100, 15), myTexture);需要注意的是,在與紋理相關的全部示例中,本書提供了基礎模板并對空紋理進行初始化。在實際操作過程中,將賦予適當的紋理。除此之外,當渲染紋理時,用戶可提供縮放值和混合值,進而與當前場景適配,包

10、括紋理繪制時的寬高比控制。當縮放圖像時,應注意該操作將對遺留GUI系統(tǒng)中的圖像渲染屬性產生影響。另外,圖像的縮放行為還將影響到其繪制位置。某些時候,需要適當偏移圖像的繪制位置。例如:public Texture2D myTexture;void Start() myTexture = new Texture2D(125, 15);void OnGUI() exture(new Rect(325, 15, 100, 15), myTexture,ToFit,true,0.5f);上述代碼將在繪制區(qū)域通過Alpha混合機制(參數中設置為true)繪制源紋理,且寬高比設置為0.5。相應地,用戶可嘗試

11、其他設置結果,進而獲取期望結果。當需要采用簡單方式在全部2D/3D元素上繪制屏幕圖像時,上述方案在某些特定情況下十分有用,例如,暫?;驓g迎畫面。然而,類似于Label控件,該方案并未接收任何輸入事件(對此,可參考Button控件)。DrawTexture函數存在一個變化版本,即DrawTextureWithTexCoords函數。該函數可選取紋理在屏幕上的繪制區(qū)域,還可選擇希望繪制的源紋理區(qū)域,如下所示:public Texture2D myTexture;void Start() myTexture = new Texture2D(125, 15);void OnGUI() extureWi

12、thTexCoords (new Rect(325, 15, 100, 15),myTexture ,new Rect(10, 10, 50, 5);上述代碼在紋理位置(10,10)處,并以50像素寬、5像素高的方式根據某一源紋理(myTexture)的方式選取一個區(qū)域,隨后在設置的Rect區(qū)域繪制該紋理。DrawTextureWithTexCoords函數無法執(zhí)行縮放操作,且僅可執(zhí)行Alpha混合操作。該函數簡單地執(zhí)行繪制操作,并將所選紋理區(qū)域與初始Rect設置的尺寸進行匹配。另外,DrawTextureWithTexCoords函數還可通過遺留系統(tǒng)繪制單一的精靈對象,進而體現(xiàn)此類對象特征。

13、3. Button控件Unity還提供了相應的Button控件,并包含兩個變化版本,基本的Button控件僅支持單擊操作;而RepeatButton控件則支持按下按鈕這一行為。二者均可采用if語句并以相同方式完成實例化操作,進而捕捉按鈕的單擊操作,如下列腳本所示:void OnGUI() if (n(new Rect(25, 40, 120, 30), Button)/The button has clicked, holding does nothingif (tButton(new Rect(170, 40, 170, 30),RepeatButton)/The button has be

14、en clicked or is held down這將在屏幕上生成簡單的按鈕,如圖1-2所示。圖1-2該控件還支持基于按鈕內容的紋理應用,即針對第二個參數提供紋理值,如下所示:public Texture2D myTexture;void Start() myTexture = new Texture2D(125, 15);void OnGUI() if (n(new Rect(25, 40, 120, 30), myTexture) 類似于Label控件,文本字體可采用GUIStyle進行調整,或者設置GameObject的guiText屬性。除此之外,此處還可采用與Label相同的方式支

15、持紋理應用。其中,最為簡單的考查方式是設置可單擊的Label控件。4. Text控件類似于文本顯示這一類需求,用戶常常需要輸入文本,遺留GUI提供了相關控件,如表1-1所示。表1-1控 件描 述 TextField較為基本的文本框,僅支持單行文本且不可生成新行(即使包含了行尾符,這將在下方繪制額外行)TextAreaTextField控件的擴展,并支持多行文本。當用戶按下Enter鍵時,將添加新行PasswordFieldTextField控件的變化版本,但不會顯示輸入值,并采用替換字符予以顯示。需要注意的是,密碼自身仍以文本形式進行存儲。在使用過程中,可加密/解密實際的密碼,且不會將字符存儲

16、為純文本TextField控件的具體應用較為簡單。該控件返回所輸入的最終值狀態(tài);對于當前顯示的文本參數,還需將其傳遞至相應的變量中,如下所示:string textString1 = Some text here; string textString2 = Some more text here; string textString3 = Even more text here; void OnGUI() textString = ield(new Rect(25, 100, 100, 30), textString1); textString = rea(new Rect(150, 100,

17、 200, 75), textString2); textString = ordField(new Rect(375, 100, 90, 30), textString3, *); 字符串通常為不可變類型(常量),每次用戶改變其值時,將在內存中生成一個新字符串。此處,textString變量在類中聲明,這可視為一種高效的內存處理方式。當在OnGUI方法中聲明textString變量時,將在每幀中產生垃圾內存,讀者應對這一點有所認識。默認狀態(tài)下,文本框的顯示效果如圖1-3所示。圖1-3類似于Label和Button控件,顯示的文本字體也可通過GUIStyle 或guiText GameObje

18、ct屬性進行調整。需要注意的是,如果文本過大,則會在文本框內的顯示區(qū)域內溢出,但TextField之外的內容不會被繪制。當文本包含多行時,也存在類似的問題。5. Box控件全部控件均為通用型控件,并可用于多種用途??傮w而言,此類空間在其他控件之后繪制背景/著色區(qū)域。Box控件在單一控件內實現(xiàn)了前述控件(包括Label、Texture和Text控件)包含的多項功能以及布局選項。除此之外,該控件還可將文本和圖像作為其他控件。用戶可通過下列方式繪制包含自身內容的Box空控件:void OnGUI() (new Rect (350, 350, 100, 130), Settings);對應效果如圖1-

19、4所示。圖1-4除此之外,用戶還可據此裝飾其他控件,如下所示:private string textString = Some text here;void OnGUI() (new Rect (350, 350, 100, 130), Settings);(new Rect(360, 370, 80, 30), Label);textString = ield(new Rect(360, 400, 80, 30),textString);if (n (new Rect (360, 440, 80, 30), Button) 圖1-5讀者應注意,Box控件并不會對繪制于其上的其他控件產生影響,

20、并作為完全獨立的空間進行繪制。當考查稍后介紹的Layout控件時,了解這一點將使問題變得更加清晰。這里,Box控件充當背景,且Label、Text和Button控件繪制于其上,如圖1-5所示。Box控件可用于高亮顯示某些控件組,抑或提供簡單的背景效果(除了文本和色彩之外,還可使用圖像)。類似于其他控件,Box控件也可通過GUIStyle實現(xiàn)特定的樣式。6. Toggle復選框控件GUI系統(tǒng)中提供了復選框控件,進而可實現(xiàn)選項開/關的可視化效果。與TextField控件相同,可傳遞變量并作為參數管理切換狀態(tài),并返回新值(如果產生變化),對應代碼如下所示:bool blnToggleState =

21、false; void OnGUI() blnToggleState = e(new Rect(25, 150, 250, 30), blnToggleState, Toggle); 對應效果如圖1-6所示。圖1-6同樣,所顯示的文本字體也可通過GUIStyle或guiText GameObject屬性進行調整。7. Toolbar面板基礎控件還包含了某些實現(xiàn)了自動布局的面板,例如,可處理按鈕的排列問題,此類按鈕實現(xiàn)分組排列,且一次僅可選取單一按鈕。類似地,這一類風格的按鈕也可采用GUIStyle定義進行調整,包括修改按鈕和間距的寬度值。其中涵蓋了兩個布局選項,如下所示:Toolbar控件Se

22、lection網格選項8. Toolbar控件Toolbar控件采用水平模式排列按鈕(不支持垂直模式)。需要注意的是,通過每行單項地選取網格,可模擬垂直工具欄,稍后將對此加以討論。Toolbar返回工具欄中當前所選按鈕的索引值。另外,此類按鈕與基礎型按鈕控件并無區(qū)別,并提供了相應的選項,進而支持針對按鈕內容的文本或圖像。此處并不支持RepeatButton控件。當實現(xiàn)工具欄時,可定義一個按鈕中希望顯示的內容數組,以及控制所選按鈕的整數值,如下所示:private int toolbarInt;private string toolbarStrings;Void Start() toolbarI

23、nt = 0;toolbarStrings = Toolbar1, Toolbar2, Toolbar3 ;void OnGUI() toolbarInt = ar(new Rect(25, 200, 200, 30),toolbarInt, toolbarStrings);前述控件間的主要差別在于,需要向控件傳遞當前所選的索引值,并于隨后返回新值。繪制后的Toolbar如圖1-7所示。圖1-7如前所述,用戶還可傳遞紋理數組,進而對其進行顯示,而非僅是簡單的文本內容。9. SelectionGrid控件SelectionGrid控件表示為前述Toolbar控件的自定義版本,可在網格布局中排列按

24、鈕,經重新設置按鈕的尺寸后,可與目標區(qū)域相適應。SelectionGrid的編碼格式與Toolbar類似,如下所示:private int selectionGridInt;private string selectionStrings;Void Start() selectionGridInt = 0;selectionStrings = Grid 1, Grid 2, Grid 3, Grid 4 ;void OnGUI() selectionGridInt = tionGrid(new Rect(250, 200, 200, 60), selectionGridInt, selectio

25、nStrings, 2);SelectionGrid和Toolbar編碼方式的主要差別在于:當采用SelectionGrid時,可在一行中設置數據項的數量,控件可自動對按鈕進行布局(除非使用GUIStyle)。上述代碼的運行結果如圖1-8所示。圖1-8與單獨使用按鈕相比,這一類控件提供了更大的靈活性。10. Slider/Scrollbar控件當需要對游戲范圍進行控制時,或控制兩個值之間的變化屬性時,例如在場景中移動對象,則可使用Slider和Scrollbar控件。這一類控件實現(xiàn)了兩種類似的處理方案,并提供了滾動區(qū)域以及操控方式,進而可控制控件背后的對應值。圖1-9中顯示了并列排列的Slid

26、er和Scrollbar控件。圖1-9slimmer Slider和chunkier Scrollbar控件可通過水平和垂直模式工作,并包含了最小和最大預置許可值。Slider控件的實現(xiàn)代碼如下所示:private float fltSliderValue = 0.5f;void OnGUI() fltSliderValue = ontalSlider(new Rect(25, 250, 100,30),fltSliderValue, 0.0f, 10.0f);fltSliderValue = calSlider(new Rect(150, 250, 25, 50),fltSliderValu

27、e, 10.0f, 0.0f);11. Scrollbar控件編碼Scrollbar控件的編碼方式如下所示:private float fltScrollerValue = 0.5f;void OnGUI() fltScrollerValue = ontalScrollbar(new Rect(25, 285,100, 30), fltScrollerValue, 1.0f, 0.0f, 10.0f);fltScrollerValue = calScrollbar(new Rect(200, 250, 25,50), fltScrollerValue, 1.0f, 10.0f, 0.0f);類

28、似于Toolbar和SelectionGrid控件,用戶需要傳遞當前值,并于隨后返回更新值。然而,與其他控件不同的是,此處包含了兩個樣式點,進而實現(xiàn)工具欄的樣式化操作且對其進行單獨處理,并對滑塊的觀感實現(xiàn)更加自由的控制。正常情況下,用戶僅需使用Slider控件即可,而Scrollbar則視為ScrollView控件的基本內容。12. ScrollView控件最后一個可顯示的控件是ScrollView,并實現(xiàn)GUI元素上的遮擋效果,其中還涵蓋了水平或垂直方向上的Scrollbar。簡而言之,可在屏幕較小窗口后定義一個較大的控制區(qū)域,如圖1-10所示。圖1-10圖1-10中顯示了包含多項內容的列表

29、,并超出了ScrollView控件的可繪制區(qū)域。隨后,可通過兩個滾動欄上、下、左、右移動滾動查看器,進而對視圖進行調整。其中,背景內容隱藏于遮擋部分之后,其尺寸等同于ScrollView控件主窗口的寬度值和高度值??丶臉邮交瘎t少有不同,且不存在所謂的基本樣式,并取決于當前設置的默認GUISkin(稍后將對此加以介紹)。另外,用戶可針對各個滑塊設置獨立的GUIStyle,而非整體滑塊,也不是其各個獨立部分(例如工具欄等)。如果用戶未針對各滑塊確定樣式,則最終結果將恢復為基本的GUIStyle。ScrollView的實現(xiàn)過程相對簡單,如下所示:定義可見區(qū)域以及虛擬背景層。其中,控件將采用Begi

30、nScrollView函數進行繪制。在虛擬區(qū)域中繪制控件,ScrollView調用間的GUI繪制行為將在滾動區(qū)域內執(zhí)行。需要說明的是,ScrollView中的(0,0)表示為ScrollView有效區(qū)域的左上角位置,而非屏幕的左上角。利用EndScrollView函數關閉控件完成當前操作。例如,上述示例的實現(xiàn)代碼如下所示:private Vector2 scrollPosition = ;private bool blnToggleState = false;void OnGUI()scrollPosition = ScrollView(new Rect(25, 325, 300, 200),

31、scrollPosition,new Rect(0, 0, 400, 400);for (int i = 0; i 20; i+)/Add new line items to the backgroundaddScrollViewListItem(i, Im listItem number + i);rollView();/Simple function to draw each list item, a label and checkboxvoid addScrollViewListItem(int i, string strItemName)(new Rect(25, 25 + (i *

32、25), 150, 25), strItemName);blnToggleState = e(new Rect(175, 25 + (i * 25), 100, 25),blnToggleState, );其中定義了addScrollViewListItem函數繪制列表項(由標簽和復選框構成)。隨后,可傳遞可見區(qū)域(第一個Rect參數)、初始滾動位置以及控件后的虛擬區(qū)域(第二個Rect參數),并開始ScrollView控件操作。據此,可在ScrollView控件的虛擬區(qū)域內繪制20個列表項,并在結束和關閉控件(包含EndScrollView命令)之前使用其他輔助函數。必要時,還可實現(xiàn)Scrol

33、lView內嵌操作。ScrollView控件還包含了諸如ScrollTo等命令,該命令可將可見區(qū)域移至虛擬層坐標系內,并使其處于焦點狀態(tài)(對應坐標系源自虛擬層的左上角位置,即左上角處的(0,0)位置)。當在ScrollView控件上使用ScrollTo函數時,需要在ScrollView的Begin和End命令內對其進行調用。例如,可添加ScrollView中的按鈕,并移至虛擬區(qū)域的左上角位置,如下所示:public Vector2 scrollPosition = ;void OnGUI()scrollPosition = ScrollView(new Rect(10, 10, 100, 50

34、),scrollPosition,new Rect(0, 0, 220, 10);if (n(new Rect(120, 0, 100, 20), Go to Top Left)lTo(new Rect(0, 0, 100, 20);rollView();另外,開啟/關閉控件一側的滑塊,可使用alwayShowHorizontal和alwayShowVertical屬性定義BeginScrollView,相關內容將在更新后的ScrollView調用中予以高亮顯示,如下所示:Vector2 scrollPosition = ;bool ShowVertical = false; / turn o

35、ff vertical scrollbarbool ShowHorizontal = false; / turn off horizontal scrollbarvoid OnGUI() scrollPosition = ScrollView(new Rect(25, 325, 300, 200),scrollPosition,new Rect(0, 0, 400, 400),ShowHorizontal,ShowVertical);rollView ();13. 富文本格式平面文本往往缺乏足夠的吸引力,并迫使程序員針對全部屏幕文本創(chuàng)建圖像。然而,Unity提供了一種方式可啟用富文本顯示,即使

36、用類似于HTML的樣式定義控件上的文本(僅對標簽和顯示功能有效。對此,不建議將其與輸入欄結合使用)。在文本的HTML書寫樣式中,可采用下列標簽豐富顯示文本的效果:下列標簽將實現(xiàn)文本的粗體格式: 例如:The quick brown Fox jumped over the lazy Frog對應效果如下所示:The quick brown Fox jumped over the lazy Frog下列標簽將實現(xiàn)文本的斜體格式:例如:The quick brown Foxjumped over thelazy Frog對應效果如下所示:The quick brown Fox jumped over

37、 the lazy Frog不難發(fā)現(xiàn),下列標簽將調整文本的尺寸:作為參考,字體的默認尺寸通過字體自身設置。例如:The quick brown Fox jumped over the lazy Frog對應效果如下所示:The quick brown Fox jumped over the lazy Frog最后,還可采用color標簽確定文本的不同顏色,如下所示:其中,顏色自身使用8位的十六進制值表示,例如:The quick brownFox jumped over the lazy Frog需要注意的是,顏色采用了標準的RGBA色彩空間標記方式加以定義(參見http:/en. /wiki

38、/RGBA_color_space),各通道包含了兩個字符并構成了十六進制格式,例如RRGGBBAA。雖然顏色屬性同樣支持簡潔的RGB顏色空間,但其中未涉及A,即Alpha分量,例如RRGGBB。上述代碼的對應效果如下所示:The quick brown Fox jumped over the lazy Frog在實際結果中,單詞brown將顯示為褐色。此外,用戶還可使用顏色名稱對其進行引用,但其應用范圍有限。關于富文本的更多細節(jié)內容,讀者可閱讀相關參考手冊,對應網址為。對于文本網格,存在兩個額外的標簽,如下所示:當與現(xiàn)有網格進行關聯(lián)時,方可使用上述文本網格。此處,材質表示為與當前網格關聯(lián)的材

39、質之一,并可通過網格索引號(應用于網格上的材質數組)進行訪問。當應用于某一四邊形上時,用戶還可確定文本的尺寸、位置((x,y))、寬度和高度。與文本網格相關的文檔缺乏詳細的內容,此處僅供參考使用。當深入討論新UI系統(tǒng)時,還將提供更好的處理方法。1.2 通用控件特性針對控制流程、選擇控制以及目標行為,原有的GUI系統(tǒng)同樣提供了某些特性。這一類特性于Unity V2中被引入,可視為組件系統(tǒng)中的巨大進步。1.2.1 分組控件原有的GUI系統(tǒng)可在屏幕上實現(xiàn)控件的分組行為,并體現(xiàn)了基于組件位置的多個相對位置。這意味著,如果某一組件的位置為X 50和Y 50,則該組件內的全部子控件位置始于(50,50),

40、盡管后者的位置定義為(0,0)。類似于ScrollView控件,各組件包含起始位置和結束位置,進而定義了組件內的全部控件的范圍,如下所示:void OnGUI() /Start a group at position 50, 50. 150 width and 60 heightGroup(new Rect (50,50,150,60);/Draw a label with a 10, 10 offset in the group(new Rect (10, 10, 100, 30), Label in a Group);oup();其中,Label控件在組件界內予以繪制,由于組件起始于X 5

41、0,則Label的屏幕位置位于X 60(50 + 10)處。相應地,邊界外的任何內容均不予繪制。與其他控件類似,組件可將其中的內容定義為包含相應GUIStyle的文本或紋理。與其他控件不同,如果在函數中定義了文本內容,則文本的默認顏色為白色;若針對BeginGroup函數確定了內容參數中的文本,則默認狀態(tài)下組件中的文本表示為黑色,對應位置處于左對齊狀態(tài),而非居中位置。除此之外,默認條件下,組件并不支持富文本格式,因而需要通過GUIStyle對其進行適當調整。1.2.2 命名控件當各個控件通過腳本加以實現(xiàn)時,可在設置時對其進行命名,對于控制流程、訪問基于鍵盤操作的各個輸入欄,或者根據當前所選焦點

42、控件繼承相關邏輯時,該命名操作十分必要。與大多數其他Unity功能項不同,用戶無法直接命名控件,且不存在控件屬性上的Name輸入欄僅表示為GUI系統(tǒng)命令,進而在屏幕上繪制內容,這一點與渲染管線類似。對于Unity中的GUI控件,可簡單地通知GUI系統(tǒng),下一個即將繪制的控件包含一個名稱,如下所示:string login = Would you like to play a game?;void OnGUI() xtControlName(MyAwesomeField);login = ield(new Rect(10, 10, 200, 20), login);1.2.3 獲取焦點當控件定義了

43、對應的名稱后,隨后即可確定處于焦點狀態(tài)的控件。若使特定控件處于焦點狀態(tài),可簡單地調用下列函數:Control(MyAwesomeField);隨后,這將把用戶的輸入焦點或選擇結果調整至包含該名稱的特定GUI控件中。當控件處于焦點狀態(tài)時,通過調用下列函數,即可獲取處于焦點狀態(tài)的、特定控件的名稱:string selectedControl = meOfFocusedControl();如果處于焦點狀態(tài)的控件包含名稱,將返回針對該控件所設置的名稱;相應地,如果不存在處于焦點的控件,或者處于焦點的控件未包含相應的名稱,則函數返回空字符串。作為命名和焦點機制的示例,用戶可設置一個簡單的登錄GUI,并通

44、過驗證行為以及有效特性實現(xiàn)用戶的輸入操作。具體而言,可創(chuàng)建一個注冊表,用戶可輸入賬號和密碼以登錄游戲。出于安全考慮,密碼的長度應大于6個字符(不支持弱密碼)。在開始階段,可在項目中創(chuàng)建名為IntermediateGUI的新腳本(讀者可下載代碼以獲取完整的項目內容),并利用下列代碼替換原有內容。using UnityEngine;ExecuteInEditModepublic class IntermediateGUI : MonoBehaviour public string username = Enter username;public string password = Enter pa

45、ssword;private bool passwordInError = false;private string passwordErrorMessage =Password too short;通過登錄操作或注冊表中的參數,這將定義基礎類。另外,還需要添加簡單的函數,并對所輸入的密碼進行驗證,以滿足相關安全策略,如下所示:void CheckUserPasswordAndRegister()if (h 6)/If the password is not long enough, mark it in error/and focus on the password fieldpasswor

46、dInError = true;Control(PasswordField); elsepasswordInError = false;Control();/Register User據此,可添加相應的GUI控件,如下所示:void OnGUI() /A tidy group for our fields and a box to decorate itGroup(new Rect( / 2 - 75,t / 2 - 80, 150,160);(new Rect(0,0,150,160), User registration form);xtControlName(UsernameField)

47、;username = ield(new Rect(10, 40, 130, 20), username);xtControlName(PasswordField);password = ordField(new Rect(10, 70, 130, 20),password,*);if (passwordInError) (new Rect (10, 100, 200, 20),passwordErrorMessage);if (nt.isKey &nt.keyCode = n &meOfFocusedControl() = PasswordField)CheckUserPasswordAnd

48、Register();if (n(new Rect(80, 130, 65, 20), Register)CheckUserPasswordAndRegister();oup();需要注意的是,關鍵字Event與原有GUI系統(tǒng)(遺留系統(tǒng))相關,進而處理用戶輸入問題,稍后將對此加以詳細討論。注意,這里不應與新GUI系統(tǒng)中的UnityEvent系統(tǒng)混淆。圖1-11對應GUI效果如圖1-11所示。上述示例分別繪制了文本框以及組件中較為簡單的按鈕,且文本框均位于居中位置。代碼檢測用戶是否按下Enter鍵,以及是否位于密碼文本框內(通過meOfFocusedControl函數進行檢測),并于隨后嘗試對其

49、進行注冊。當用戶單擊Register按鈕時也會出現(xiàn)類似的情形。當用戶的密碼超過6個字符時,該用戶將被注冊;否則passwordInError標記將設置為True,進而繪制附加標記內容,告知用戶密碼有可能被破解。當查看最終結果時,還需要向場景中的活動GameObject或者Main Camera添加IntermediateGUI腳本。1.2.4 工具提示GUI控件通常會具有與其自身關聯(lián)的工具提示功能,當控件處于焦點或鼠標指針懸停于其上時,將會顯示某些額外的文本信息。工具提示的添加過程較為簡單,當使用GUIContent類進行繪制時,替換該控件的內容即可。例如,可在前述腳本中按照下列方式更新Reg

50、ister按鈕:if (n(new Rect(80, 130, 65, 20),new GUIContent(Register, My Tooltip)CheckUserPasswordAndRegister();當工具提示定義完畢后,可在屏幕某處顯示其內容,且通常作為標簽予以顯示。另外,任何控件均可顯示相應的文本(針對輸入文本框,不建議使用這一功能項)。因此,可在按鈕代碼塊之后、EndGroup函數之前加入下列代碼: (new Rect (10, 120, 65, 20), ip);這將獲取處于焦點狀態(tài)的、當前工具提示中的相關內容,并返回該控件的工具提示文本。對于文本顯示以及紋理變化,GUI

51、Content包含了多個選項,因而值得進一步考查。1.2.5 Window控件Window控件針對其他控件定義了獨立的、可繪制的窗口。窗口行為類似于ScrollView控件,但僅包含單層。任何超出窗口邊界之外的控件將不予繪制。用戶也可在Window內使用ScrollView控件,進而實現(xiàn)相同的功能。當使用獨立的Window控件時,用戶可實現(xiàn)多項功能,其中包括:Window控件的模式(modal)特征。此處,模式表示當前窗口為唯一可操控的窗口;而非模式窗口則表示并列窗口。Window控件的拖曳狀態(tài),也就是說窗口可通過鼠標或觸摸方式進行拖曳。各個Window控件的繪制順序可對彼此之上的繪制窗口進行

52、排序。如果存在多個并列窗口或模式窗口,則存在某一特定窗口處于焦點狀態(tài)。通過GUI Window控件,可開啟多個功能項。完整的Windows控件示例位于示例項目的BasicGUI腳本文件中。其中,前述各個控件位于單一的Window控件中。當創(chuàng)建Window控件時,需要通過下列簽名針對Window控件定義新的回調方法:void DoMyWindow(int windowID)在該方法中,用戶可使用前述示例添加GUI代碼。當顯示時,各個控件的位置基于窗口的左上角位置(與之前討論的Group和ScrollView控件相同)。除此之外,用戶還可針對窗口設置前述內容所討論的各種選項,如下所示:void D

53、oMyWindow(int windowID)(new Rect(25, 15, 100, 30), Label);/ Make the window Draggableindow();在Window控件方法的適當位置處,僅需調用w函數即可。根據相關屬性,可跟蹤Window控件的位置,如下所示:private Rect rctWindow1;void OnGUI()Rect rctWindow1;rctWindow1 = w(0,rctWindow1,DoMyWindow,Controls Window);通過下列屬性,可將Window控件調用至視圖中:窗口ID。Window控件開啟后的Rec

54、t位置。Window控件GUI內容的委托方法。當前窗口的名稱/標題。對于模式窗口,需要采用Window函數實例化窗口,而非Window函數,如下所示:rctWindow1 = Window(0, rctWindow1, DoMyWindow, ModalControls Window);當整合前述全部控件時,這將生成一個Window視圖,如圖1-12所示。對于完整示例,讀者可參考下載后的代碼資源包,其中設置了全部定義。圖1-121.3 GUI樣式和皮膚為了避免簡單背景以及貫穿整個項目中的單一字體,Unity提供了多種選項,進而定義原GUI系統(tǒng)中的布局和觀感樣式,此類內容定義為GUIStyle。

55、此類樣式可通過GUISkin實現(xiàn)全局應用(稍后將對此加以討論),或者針對各個控件獨立使用(如圖1-12所示)。其中,各個樣式均包含了多個選項,并定義了下列內容:名稱。針對綁定控件不同狀態(tài)的紋理或文本的顏色值(包括Normal、Hover、Active以及Focused)。控件的邊框、外邊界、內邊界及上溢尺寸(針對各條邊)。字體(包括適宜尺寸、樣式、對齊方式、自動換行以及富文本支持選項)。文本剪裁尺寸??丶械膱D像位置??丶热葜械钠圃O置。固定的寬度和高度。寬度和高度的拉伸選項。這里,建議在類中定義public GUIStyle屬性,當設置GUIStyle時,可在Editor Inspecto

56、r中對其進行調整,如下所示:using UnityEngine;ExecuteInEditModepublic class GUIStyles : MonoBehaviour public GUIStyle;void OnGUI() /Create a label using the GUIStyle property above(new Rect(25, 15, 100, 30), Label,myGUIStyle);用戶也可采用編碼方式調整GUIStyle,但此處并不建議使用這一方法,編輯器方式已然足夠。需要注意的是,設置過多的GUIStyle將降低執(zhí)行效率且難以維護。對此,可創(chuàng)建綁定至場

57、景公共對象(例如Main Camera)的單一腳本,其中包含了所定義的全部GUIStyle,其各個腳本從中使用GUIStyle引用。當利用GUIStyle屬性將前述腳本綁定至場景的GameObject上時,其在Inspector中的效果如圖1-13所示。圖1-13當在編輯器中首次打開腳本時,需要在控制臺窗口中獲取NullReferenceException,其原因在于之前尚未配置GUIStyle。如果用戶不希望直接在各個控件上統(tǒng)一使用某一樣式,則可有選擇性地創(chuàng)建GUISkin,這針對各個控件類型包含了全部樣式。隨后,可在繪制控件之前通過GUI類將其投入使用。GUISkin包含了某些附加選項并可

58、應用于GUI上,其中包括:設置是否選擇了雙擊操作。設置是否選擇了三擊操作。鼠標指針的顏色。鼠標的閃爍速度。默認的選取顏色。自定義樣式(表示為GUIStyle屬性數組,并于隨后可在控件上實現(xiàn)復用)。對此,可在單擊項目文件夾視圖中的Create按鈕,這將在項目視圖中生成新的GUISkin資源數據。通過這一選取方式,Inspector中的窗口效果如圖1-14所示。圖1-14不難發(fā)現(xiàn),針對各個控件,其中包含了針對全局樣式調整的全部選項。當使用GUISkin時,可創(chuàng)建名為GUISkins的新腳本,并采用下列代碼替換其內容:using UnityEngine;ExecuteInEditModepublic

59、 class GUISkins : MonoBehaviour public GUISkin MySkin;void OnGUI() = mySkin;(new Rect(25, 15, 100, 30), Label);/Draw the rest of your controls隨后,可將GUISkins腳本綁定至當前場景的Main Camera上(并禁用當前綁定的其他腳本),拖曳所創(chuàng)建的GUISkin,并將其應用至查看器中的My Skin腳本屬性上。通過在GUI繪制的開始階段設置皮膚,全部繪制控件可采用自定義皮膚,而非Unity提供的默認內容。另外,讀者還可根據個人喜好使用多種皮膚,即在

60、繪制控件之前適當調整皮膚即可。關于GUISkins的示例效果,用戶可嘗試安裝Unity Extra GUI Skins資源數據(對應網址為),該資源為Unity自身提供的皮膚示例集合(且完全免費)。如果用戶希望在其他項目中復用皮膚(或通過Asset Store出售皮膚資源),則可通過Unity的Export Package(位于菜單的Assets選項中)進行導出。讀者可訪問。圖1-15顯示了GUISkins數據資源示例。圖1-151.4 GUI事件和屬性為了有效地支持原有GUI系統(tǒng)中的事件系統(tǒng),Unity針對GUI交互行為提供了事件處理器,并命名為Event類?;貞浺幌?,本節(jié)曾引用了原有GUI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論