UGUI-- Canvas Scaler 分辨率自适应组件
1、CanvasScaler是什么
用于分辨率自適應(yīng)的畫布縮放控制器,主要負(fù)責(zé)在不同分辨率下UI控件大小自適應(yīng),并不負(fù)責(zé)位置,位置由之后的RectTransform組件負(fù)責(zé),提供了3種分辨率自適應(yīng)的模式?
2、基本概念:
(1)屏幕分辨率:Game窗口中的Stats統(tǒng)計(jì)數(shù)據(jù)窗口看到的當(dāng)前“屏幕”分辨率(Screen)會(huì)參與分辨率自適應(yīng)的計(jì)算
(2)畫布大小和縮放系數(shù):選中Canvas對(duì)象后在RectTransform組件種看到的寬高和縮放(Width,Height,Scale)
寬高 * 縮放系數(shù) = 屏幕分辨率
(3)Reference Resolution:參考分辨率,在縮放模式的寬高模式中(UI Scale Mode = Scale With Screen Size)出現(xiàn)的參數(shù),參與分辨率自適應(yīng)的計(jì)算??
總結(jié):
屏幕分辨率——當(dāng)前設(shè)備的分辨率,編輯器下Game窗口中可以看到
參考分辨率——在Scale With Screen Size適配模式中出現(xiàn)的關(guān)鍵參數(shù),參與分辨率自適應(yīng)的計(jì)算
畫布寬高和縮放系數(shù)——分辨率自適應(yīng)會(huì)改變的參數(shù),通過屏幕分辨率和參考分辨率計(jì)算而來
分辨率大小自適應(yīng)——通過一定的算法以屏幕分辨率和參考分辨率參與計(jì)算得出縮放系數(shù),該系數(shù)會(huì)影響所有UI控件的縮放大小
3、CanvasScaler的三種適配模式
(1)Constant Pixel Size(恒定像素模式):無(wú)論屏幕大小如何,UI始終保持相同像素大小
Scale Factor:縮放系數(shù),按此系數(shù)縮放畫布中的所有UI元素
改變時(shí),Canvas下的各個(gè)對(duì)象的Scale不會(huì)改變,但是Canvas的寬高和縮放系數(shù)會(huì)改變
Reference Pixels Per Unit:單位參考像素,多少像素對(duì)用Unity中的一個(gè)單位(默認(rèn)要給單位為100像素),圖片設(shè)置中的Pixels Per Unit設(shè)置,會(huì)和該參數(shù)一起參與計(jì)算
恒定像素模式的計(jì)算公式:
UI原始尺寸 = 圖片大小(像素) / (Pixels Per Unit / Reference Pixels Per Unit)
Pixels Per Unit 屬性顯示在圖片的 Inspector 窗口中
該計(jì)算公式會(huì)影響?Set Native Size 之后的圖片大小(Set Native Size 即將圖片恢復(fù)為“UI原始尺寸”)
注意:如果想讓圖片顯示在 Image 對(duì)象上,需要將圖片拖到 Image 的 Source Image 屬性上,但需要先將圖片的類型,即圖片的 Inspector 窗口中的 Texture Type 修改為 Sprite ,然后點(diǎn)擊 Apply后(此時(shí)圖片文件前會(huì)有一個(gè)箭頭符號(hào))才能進(jìn)行以上操作
在該模式下不會(huì)進(jìn)行分辨率大小的自適應(yīng),會(huì)讓UI始終保持設(shè)置的尺寸大小,無(wú)論Game窗口如何縮放,相應(yīng)的UI大小都不會(huì)改變,一般在進(jìn)行游戲開發(fā)時(shí)極少使用這種模式,除非通過代碼計(jì)算來設(shè)置縮放系數(shù),即:
可以通過代碼得到屏幕分辨率,通過該分辨率可以計(jì)算得到相應(yīng)的縮放系數(shù),然后通過一定的規(guī)則計(jì)算新的縮放系數(shù),通過代碼設(shè)置Canvas的Scale Factor屬性,就可以在該模式下對(duì)不同的分辨率改變UI的大小
(2)Scale With Screen Size(縮放模式):根據(jù)屏幕尺寸進(jìn)行縮放,隨著屏幕尺寸放大縮小,最常用的模式
Reference Resolution:參考分辨率(美術(shù)方面出圖的標(biāo)準(zhǔn)分辨率)
縮放模式下的所有匹配模式都會(huì)基于參考分辨率進(jìn)行自適應(yīng)計(jì)算
Screen Match Mode:屏幕匹配模式,當(dāng)前屏幕分辨率寬高比不適用參考分辨率時(shí)(例如1920*1080的寬高比為16:9),用于分辨率大小自適應(yīng)的匹配模式:
Expand:水平或垂直拓展畫布區(qū)域,會(huì)根據(jù)寬高比的的變化放大縮小畫布,可能有黑邊:
該模式會(huì)將Canvas Size(即Canvas的寬和高)進(jìn)行寬或高擴(kuò)大,讓它高于參考分辨率,計(jì)算公式是:
縮放系數(shù)(Scale) = Mathf.Min(屏幕寬/參考分辨率寬,屏幕高/參考分辨率高);
畫布尺寸=屏幕尺寸(即屏幕分辨率)/縮放系數(shù)
表現(xiàn)效果:最大程度的縮小UI元素,保留UI控件所有細(xì)節(jié),可能會(huì)留有黑邊(即有多余的畫布不顯示任何內(nèi)容,如果過寬,兩側(cè)黑邊,如果過窄,上下黑邊)
eg:假設(shè)參考分辨率為(1920,1080),屏幕分辨率為800*600,那么
縮放系數(shù)= Mathf.Min(800/1920,600/1080) = 0.41667
畫布尺寸=(800,600)/0.41667=(1920,1440)
Shrink:水平或垂直裁剪畫布區(qū)域,會(huì)根據(jù)寬高比的變化來放大縮小畫布,可能會(huì)裁剪
該模式將Canvas Size進(jìn)行寬或高收縮,讓他低于參考分辨率,計(jì)算公式是:
縮放系數(shù)(Scale) = Mathf.Max(屏幕寬/參考分辨率寬,屏幕高/參考分辨率高);
畫布尺寸=屏幕尺寸/縮放系數(shù)
表現(xiàn)效果:最大程度的放大UI元素,讓UI元素能夠填充滿畫面,可能會(huì)出現(xiàn)裁剪
Match Width Or Height:以寬高或者二者的平均值作為參考來縮放畫布區(qū)域
Match:確定用于計(jì)算的寬高匹配值
計(jì)算公式:
// 取平均值之前,先取相對(duì)寬度和高度的對(duì)數(shù)
float logWidth = Mathf.Log(屏幕寬/參考分辨率,2)
float logHeight?= Mathf.Log(屏幕高/參考分辨率,2)
// 在對(duì)數(shù)空間中變換是為了獲得更好的性能以及更準(zhǔn)確的結(jié)果
float logWeightedAverage = Mathf.Log(logWidth,logHeight,m_MatchWidthOrHeight)
scaleFactor = Mathf.Pow(2, logWeightedAverage)
表現(xiàn)效果:
主要用于只有橫屏模式或者豎屏模式的游戲,
豎屏游戲:Match = 0
將畫布寬度設(shè)置為參考分辨率的寬度,并保持比例不變,調(diào)整Game窗口高度,UI大小不會(huì)改變,屏幕越高可能會(huì)有黑邊,越矮可能會(huì)被裁剪
橫屏游戲:Match = 1
將畫布高度設(shè)置為參考分辨率的高度,并保持比例不變,調(diào)整Game窗口寬度,UI大小不會(huì)改變,屏幕越長(zhǎng)可能會(huì)有黑邊,越短可能會(huì)被裁剪
(3)Constant Physical Size(恒定物理模式):無(wú)論屏幕大小和分辨率如何,UI元素始終保持相同物理大小(與恒定像素模式基本相同,只不過添加了不同的算法)
DPI:(Dots Per Inch,每英寸點(diǎn)數(shù))圖像每英寸長(zhǎng)度內(nèi)的像素點(diǎn)數(shù),即像素密度,兩個(gè)擁有相同分辨率的不同尺寸大小的屏幕的DPI是不同的,屏幕小的DPI更高
Physical Unit:物理單位,使用的物理單位種類
計(jì)算公式:根據(jù)DPI算出新的Reference Pixels Per Unit(單位參考像素)
換算:1 英寸 = 2.54 cm = 25.4 mm = 72 point = 6 picas (即Physical Unit)
新單位參考像素 = 單位參考像素 * Physical Unit / Default Sprite DPI
再使用模式一:恒定像素模式的公式進(jìn)行計(jì)算:
原始尺寸 = 圖片大小(像素) / (Pixels Per Unit / 新單位參考像素)
Fallback Screen DPI:備用DPI,當(dāng)找不到設(shè)備DPI時(shí),使用此值
Default Sprite DPI:默認(rèn)圖片DPI
恒定像素模式與恒定物理模式的區(qū)別:
相同點(diǎn):都不會(huì)進(jìn)行縮放,圖片有多大顯示多大,不會(huì)進(jìn)行分辨率大小的自適應(yīng)
不同點(diǎn):相同尺寸不同DPI設(shè)備像素點(diǎn)區(qū)別,像素點(diǎn)越多細(xì)節(jié)越多,同樣像素,DPI較低的設(shè)備看起來的尺寸可能會(huì)大于DPI較高的設(shè)備。
舉個(gè)例子:同樣是1920*1080的分辨率,手機(jī)的DPI高于電腦的DPI,那么一個(gè)圖片如果是5個(gè)像素點(diǎn)的長(zhǎng)度,在恒定像素模式中電腦上的長(zhǎng)度是大于手機(jī)上5個(gè)像素點(diǎn)的長(zhǎng)度的,此時(shí)兩者顯示的大小就不一樣,而恒定物理模式就是為了讓手機(jī)和電腦上顯示效果在視覺上長(zhǎng)度是相同的
特殊模式:3D模式
當(dāng)Canvas的渲染模式設(shè)置為World Space,即世界空間3D渲染模式時(shí),這時(shí) Canvas Scaler的UI Scale Mode縮放模式會(huì)強(qiáng)制變?yōu)閃orld 3D世界模式
Dynamic Pixels PerUnit:UI中動(dòng)態(tài)創(chuàng)建的位圖(例如文本Text)中,單位像素?cái)?shù)(類似密度)
Reference Pixels Per Unit:單位參考像素,多少像素對(duì)應(yīng)Unity中的一個(gè)單位(默認(rèn)一個(gè)單位為100像素)
主要用于控制該模式下的像素密度
總結(jié)
以上是生活随笔為你收集整理的UGUI-- Canvas Scaler 分辨率自适应组件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记录~OPENCV读图失败的三种情况,其
- 下一篇: 利用JAVA画一颗小心心