Unity筆記——4.UI模塊基礎及優化


基本UI元素

構成UI元素的組件中包括顯示推向和字符串的可視組件Visual Component以及控制交互UI元素的交互組件Interaction Component

可視組件Visual Component

圖像Image

在圖像Image組件中有Source Image、Color、material、Image Type等屬性

圖像類型Image Type
Simple

當Image Type屬性設置為Simple時,組件會適應Rect Transform的范圍來顯示Sprite,當調整Rect Transform的大小時,精靈將直接拉伸顯示

圖片類型設置為Simple時,會有一個保持長寬比Preserve Aspect Ratio的屬性,未勾選保持長寬比屬性時,精靈會無視其原本的長寬比直接鋪滿顯示在Rect Transform的范圍內,勾選后,可以保持精靈原始的長寬比以最大尺寸顯示在Rect Transform組件范圍內

Set Native Size選項可以重置精靈為原始尺寸(等倍像素)

Sliced

當Image Type屬性設置為Sliced時,顯示的是在Sprite Editor中切片后的精靈,切片操作將圖像分為9個區域,只4個角的尺寸保持不變,四邊以及中心部分其余進行拉伸顯示

圖片類型設置為Sliced時,會有一個填充中心Fill Center屬性,來確定是否對圖像的中心部分進行渲染

Tiled

當Image Type屬性設置為Tiled時,會以精靈為一個圖樣,像貼瓷磚一樣在Rect Transform范圍內鋪滿排列顯示,圖樣的基准點時Rect Transform的左下方

當使用的精靈使用Sprite Editor設置了切片時,將會介於Sliced和Tiled之間進行顯示,精靈的四角不變,四邊進行拉伸,中心進行平鋪排列,中心部分圖樣的基准點也位於左下方

和Sliced一樣,設置后會有一個Fill Center屬性來決定是否顯示中心部分

Filled

當Image Type屬性設置為Filled時與Simple一樣會在Rect Transform的范圍內進行顯示,同樣有保持長寬比Preserve Aspect Ratio的屬性和Set Native Size的選項

除了和Simple相同的屬性,設置為Filled圖像類型之后,可以通過Fill Method屬性、Fill Amount屬性、和Clockwise屬性對如何進行塗抹和塗抹多少進行設置

其中,Fill Method可以選擇Horizontal、Vertical、Radial90、Radial180、Radial360

Sprite Editor

SpriteImport

導入紋理時,將紋理類型Texture Type設置為Sprite(2D and UI)后,下方會出現一些Sprite的屬性

  • Sprite Mode
  • Sprite Tag
  • Pixel Per unit
  • pivot

SpriteEditor

並且會有一個Sprite Editor的選項,在Sprite Editor中選中精靈后,所選精靈周圍會出現顯示范圍的藍色長方形、用於設置精靈切片的綠色小手柄和軸心位置的標志,Sprite Editor窗口右下角會出現所選中精靈的Name、Position、Border、Pivot等信息

當Sprite Mode設置為Multiple時,可以在Sprite Editor窗口的上方的Slice選項卡中可以選擇自動生成、Grid By Cell Size或者Grid By Cell Count來生成新的精靈

Sprite Packer

紋理圖集功能的模式可以在Project Settings | Editor中設置Sprite Packer的模式來啟用Sprite Packer,模式有:

  • Disabled,禁用Sprite Packer功能
  • Enabled For Builds,構建時生成紋理圖集
  • Always Enabled,Play模式和構建模式下都生成紋理圖集

設置過Sprite Packer的模式后,在Project面板中選擇紋理,設置Import Settings的Packing Tag,之后就會在設置的模式下,將設置了相同Packing Tag的紋理匯集到一個紋理圖集中(Sprite Packer所生成的紋理圖集最大為2048像素*2048像素)

從Windows菜單中選擇Sprite Packer,可以打開Sprite Packer窗口,可以在Sprite Packer窗口中確認生成的紋理圖集

文本Text

在Unity中創建一個Text游戲對象,其上附加的有Rect Transform組件、Canvas Render組件和Text組件

Text組件包含的屬性:

  • Horizontal Overflow屬性可以選擇包裹Wrap和溢出Overflow,選擇Wrap時會將超出范圍的文本自動換行顯示,選擇Overflow時不做換行顯示

  • Vertical Overflow屬性,設置文本過長無法容納於文本范圍的高度時的換行方法,可以選擇截斷Truncate和溢出Overflow,選擇Truncate時將不會顯示超出范圍的文本,而溢出則仍然顯示

  • Best Fit屬性,當勾選Best Fit屬性時會忽略在Font Size屬性中設置的值,會介於設置的最大值和最小值之間進行顯示

  • Rich Text屬性,勾選后可以使用與HTML標記語言相似的格式來修飾文本

交互組件Interaction Component

按鈕Button

按鈕Button是一個附加了Image組件和Button組件的游戲對象,其下包含一個Text的子對象,Text子對象用於顯示按鈕標簽的文本

切換開關Toggle

切換開關時一個附加了Toggle組件的游戲對象,其下包含一個Background子對象(其下包含了Checkmark子對象)和Label子對象

切換開關組Toggle Group

切換開關組是一個附加了Toggle Group組件的游戲對象,在一組Toggle的Group屬性中設置為此Toggle Group

滑塊Slider

滑塊Slider是一個附加了Slider組件的游戲對象,其下包含一個Background子對象、一個Fill Area子對象(其下包含一個Fill子對象)、一個Handle Slide Area子對象(其下包含一個Handle子對象)

滾動條Scrollbar

滾動條Scrollbar是一個附加了Image組件和Scrollbar組件的游戲對象,其下包含了Sliding Area子對象(其下包含一Handle子對象)

滾動視圖ScrollRect

滾動視圖是一個附加了Scroll Rect組件、Image組件、Mask組件的游戲對象,其下包含了一個Scroll Content的子對象

自動布局系統Auto Layout System

布局元素Layout Element組件雖然擁有自身尺寸的決定性信息,如最小尺寸、推薦尺寸、自適應尺寸,但是並不直接改變自身的尺寸,而是基於這些尺寸決定性信息由布局控制器計算並設置

當使用自動布局系統時,布局控制器可以自動控制的屬性稱之驅動屬性Driven Property,手動無法變更該屬性

布局元素Layout Element

布局元素Layout Element指由布局控制器來控制位置和大小的UI元素,通過為附加了Rect Transform組件的游戲對象添加Layout Element組件來布局元素提供決定其尺寸的信息

  • 最小尺寸Minimum Width/Height,當沒有足夠的空間分配給布局元素時,因為設置了最小尺寸,所以會為了使最終尺寸不小於設置的最小尺寸而超出布局范圍

  • 推薦尺寸Preferred Width/Height,在由足夠的空間時,布局元素會被以推薦的尺寸進行顯示,當空間不夠時,會調整為布局元素在自身的Rect Transform中以推薦尺寸顯示

  • 自適應尺寸Flexible Width/Height,當布局空間有空余時,為布局元素分配的空余的相對尺寸,默認值為1

布局控制器Layout Controller

布局控制器基於布局元素提供的信息(最小尺寸、推薦尺寸、自適應尺寸),首先將布局元素按最小尺寸進行布局,如果空間足夠則使用推薦尺寸,如果仍有剩余空間時,則基於布局元素的自適應尺寸進行布局,布局控制器包括:Content Size Fitter、Aspect Ratio Fitter和Horizontal、Vertical以及Grid Layout Group三種布局組

Content Size Fitter

Content Size Fitter時為所附加的布局元素設置尺寸限制的布局控制器,可以固定布局元素的最小尺寸或推薦尺寸

Content Size Fitter組件包括Horizontal Fit屬性以及Vertical Fit屬性,分別用於指定適合布局元素寬度、高度的尺寸,它們的選項有一下三種:

  • UnConstrained,不自動設置布局元素的尺寸
  • Min Size,使用布局元素的最小尺寸自動設置寬度或高度
  • preferred,適應布局元素的推薦尺寸自動設置寬度或高度

Aspect Ratio Fitter

Aspect Ratio Fitter組件是為布局元素設置寬高比限制的布局控制器,可以固定布局元素的寬高比,可以忽略最小尺寸、推薦尺寸等布局信息

Aspect Ratio Fitter組件中有Aspect Mode屬性用於指定決定布局元素位置和尺寸的方法,以及Aspect Ratio屬性,用於設置布局元素的寬高比

Aspect Mode可以選擇:

  • None,不自動設置布局元素的位置和尺寸
  • Width Controls Height\Height Controls Width,基於布局元素的寬度或高度自動設置高度或寬度
  • Fit In Parent,自動設置布局元素的寬、高、位置、錨點,來適應父元素的內測
  • Envelope Parent,自動設置布局元素的寬、高、位置、錨點,來適應父元素的外側

布局組Layout Group

布局組Layout Group是可以控制多個布局元素位置和尺寸的布局控制器,主要有Horizontal Layout Group、Vertical Layout Group以及Grid Layout Group

Horizontal/Vertical Layout Group

Horizontal Layout Group組件和Vertical Layout Group組件都有Padding、Spacing、Child Alignment、Child Force Expand屬性

  • Padding,設置子布局元素到布局組內部的編劇
  • Spacing,設置子布局元素之間的間距
  • Child Alignment,設置子布局元素的對其位置
  • Child Force Expand,勾選后,如果布局組有空余,則會擴大布局元素以消除布局組內的空余,擴大的子布局元素是按照布局元素設置的自適應尺寸來決定的
Grid layout Group

Grid Layout Group組件是把布局元素以網格狀進行排列放置的布局組,與上兩個布局組不同的是Grid Layout Group忽略布局元素的最小尺寸、推薦尺寸、自適應尺寸,而為布局元素設置cell size屬性中指定的尺寸

  • Padding,設置子布局元素到布局組的邊距
  • Cell Size,cell size屬性的X、Y分別表示寬高
  • Spacing,設置子布局元素之間的間距
  • Start Corner,設置開始放置子布局元素的位置
  • Start Axis,設置開始放置子布局元素的方向
  • Child Alignment,設置子布局元素的對其位置
  • Constraint,為網格的列數和行數設限,Constraint設置為Flexible時,網格的列數和行數沒有限制,Fixed Column Count和Fixed Row Count通過設置Constraint Count分別為網格的列數和行數設限

優化UGUI

對畫布進行分組

畫布組件主要任務有:一、管理在層次窗口中繪制UI元素的網格並發出渲染這些UI元素的Draw Call;二、將材質相同的網格合並進行批處理,來降低Draw Call數

當畫布或者其下的子對象發生變動時,畫布就需要對其下所有的UI元素重新生成網格(只是改變UI元素的顏色屬性時不需要重新生成畫布),之后才能發出Draw Call,所以在單個畫布中構建整個游戲的UI並且UI頻繁發生變化會導致CPU的使用率大幅上升

所以,可以采用使用多個畫布的解決方案,基於游戲時UI的更新頻率進行分組,完全靜態、偶爾動態、連續動態,將分好組的UI分別放到不同的畫布中,這樣可以極大的減少UI變動時重新生成網格的工作量

通過畫布組或者isActive屬性來隱藏UI

通過畫布組或者isActive屬性來隱藏UI,不要通過控制單個UI元素的alpha來隱藏,因為當UI元素Color屬性的alpha值為0時,仍會發出Draw Call,如果要隱藏UI元素可以更改其isActive屬性

當使用了CanvasGroup組件時,也可以通過CanvasGroup組件控制其下所有UI元素的alpha透明度,設置畫布組的alpha值為0來隱藏UI元素並且不發出Draw Call

畫布組,創建一個空的游戲對象在上面附加一個CanvasGroup組件,之后將多個需要統一管理的UI元素設置為其子UI元素,就可以通過畫布組CanvasGroup組件的屬性來同意修改其子UI元素的屬性,當畫布組被嵌套時,可以通過Ignore Parent Groups屬性來忽略父級畫布組中設置的屬性

通過禁用父畫布來隱藏UI元素

當使用UI的布局系統時,因為頻繁的禁用和啟用其子UI元素,會導致不斷的布局污染,可以選擇禁用這些子UI元素的畫布組件設置畫布組件的enable屬性為false(需要注意的是,設置畫布組件為false時,畫布組建對象下的UI元素雖然隱藏了,但是子UI對象上的Monobehaviour方法還是會繼續運行,禁用畫布只是停止了UI渲染和交互)

禁用掉無交互的UI元素的Raycaster Target

UI元素具有Raycast Target選項,允許該UI元素通過單擊、觸摸或者其他行為進行交互,當任一交互行為發生時,GraphicRaycaster組件執行一個for循環來對像素到邊界框進行檢查,確定交互的是哪一個UI元素,當禁用掉無需交互UI的Raycast Target選項后,就減少了GraphicRaycaster組件需要進行迭代的數量

避免在UI系統上使用Animator組件

如果在UI系統中使用Animator組件,那么運行時的每一幀,Animator組件都要改變UI元素的屬性,導致不斷的畫布污染,不斷的重新生成網格消耗更多的CPU

優化ScrollRect組件

ScrollRect組件是用來制作滾動視圖的UI元素,滾動其他UI元素時畫布需要不斷的定期重新生成它們,所以需要通過對多種方式盡量優化ScrollRect組件的性能

  • 確保使用RectMask2D

  • 在ScrollRect組件上禁用Pixel Perfect

  • 手動停用ScrollRect活動

REF

文檔

https://docs.unity3d.com/Manual/com.unity.ugui.html

書籍

Unity游戲優化、精解UGUI


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM