在使用Unity制作2D像素游戲時(shí)阵子,經(jīng)常會(huì)遇到Canvas中的Image與世界中的Sprite Renderer大小不一致的情況令野,即使是同一素材也會(huì)有差別:
特別是對(duì)于像素游戲郁惜,這會(huì)導(dǎo)致畫面中的邏輯像素大小不統(tǒng)一戈抄,影響觀感歌懒。
由于Unity使用了不同的方式來(lái)處理它們具壮,首先要了解它們的大小是如何計(jì)算的。
Pixels Per Unit
圖片導(dǎo)入選項(xiàng)中的Pixels Per Unit(以下簡(jiǎn)稱PPU)梯刚,表示多少個(gè)實(shí)際像素為1個(gè)Unity單位凉馆。
例如PPU設(shè)置為16,則一張16×16像素的圖片在世界中的大小為1×1個(gè)單位亡资,一張32×8像素的圖片在世界中的大小為2×0.5個(gè)單位澜共。
一張16×16像素的圖片Unit.png用于Sprite Renderer在世界中顯示的情況:
相機(jī)大小
正交相機(jī)的Size表示半個(gè)屏幕/窗口高度中能顯示多少Unity單位的內(nèi)容。
例如Size設(shè)置為3锥腻,則屏幕縱向有3×2=6個(gè)單位嗦董,圖中每個(gè)地塊大小為1個(gè)單位,縱向顯示了6個(gè)地塊瘦黑。
在Size不變的情況下京革,無(wú)論顯示分辨率奇唤、寬高比如何變化,縱向顯示的內(nèi)容總是不變的匹摇,都是6個(gè)地塊咬扇。
Canvas的Reference Pixels Per Unit與縮放模式
新建一個(gè)Canvas,Canvas Scaler中有一個(gè)Reference Pixels Per Unit參數(shù)(以下簡(jiǎn)稱RPPU)来惧,默認(rèn)為100。
此時(shí)將上面的Unit.png圖片作為Image放到UI中演顾,會(huì)發(fā)現(xiàn)與世界中Sprite Renderer的大小有差別供搀。
和世界中的物體不同,Canvas中不直接使用Unity單位钠至,而是適用于Canvas的像素大小葛虐,它的大小這樣計(jì)算:
Canvas像素大小 = 圖片像素大小 / (PPU / RPPU)
例如這里的Unit.png,它的大小為16×16像素棉钧,PPU為16屿脐,Canvas Scaler的RPPU為100,則它在Canvas中的像素大小為100×100宪卿。
需要注意的是的诵,Canva像素大小并不是實(shí)際顯示的像素大小,它受Canvas Scaler的UI Scale Mode(縮放模式)以及其他縮放參數(shù)影響佑钾。
當(dāng)UI Scale Mode設(shè)置為Constant Pixel Size(固定像素大形靼獭)時(shí),無(wú)論顯示分辨率休溶、寬高比如何變化代赁,圖片的大小都不變。Scale Factor(縮放因子)參數(shù)影響圖片的縮放倍率兽掰,例如Scale Factor為1時(shí)芭碍,Image的顯示大小始終固定為100×100,為2時(shí)孽尽,固定為200×200窖壕。
當(dāng)UI Scale Mode設(shè)置為Scale With Screen Size(隨屏幕大小縮放)時(shí),圖片的顯示大小受顯示分辨率杉女、Reference Resolution(參考分辨率)艇拍,和Match(寬高匹配)影響。
聽(tīng)起來(lái)很復(fù)雜宠纯,實(shí)際上可以理解成是另一種Constant Pixel Size模式卸夕,它具有一個(gè)隱含的縮放因子,會(huì)根據(jù)一些規(guī)則自動(dòng)變化婆瓜,縮放適應(yīng)不同分辨率和寬高比的屏幕快集。
例如顯示分辨率為1920×1080贡羔,Reference Resolution也是1920×1080,此時(shí)可以認(rèn)為內(nèi)置的縮放因子為1个初,Image的顯示大小為100×100乖寒;
當(dāng)顯示分辨率變?yōu)?680×720(21:9),Reference Resolution依然是1920×1080院溺,當(dāng)Match參數(shù)拉到Height端為1時(shí)楣嘁,此時(shí)的縮放因子為720÷1080=2/3,Image的顯示大小變?yōu)?6×66珍逸;當(dāng)Match參數(shù)拉到Width端為0時(shí)逐虚,縮放因子為1680÷1920=7/8,Image的顯示大小變?yōu)?7×87谆膳。
還有一種縮放模式Constant Physical Size(固定物理大邪劝)個(gè)人從來(lái)沒(méi)用過(guò),就不討論了漱病。
統(tǒng)一大小
以結(jié)果來(lái)看买雾,最終需要統(tǒng)一的是圖片在世界和UI中的實(shí)際顯示大小,例如一張16×16的圖片杨帽,如果在UI中作為Image顯示的實(shí)際像素大小是100×100漓穿,那么它在世界中用Sprite Renderer顯示的實(shí)際像素大小也應(yīng)該是100×100,反之亦然注盈,要么調(diào)整UI相關(guān)參數(shù)讓它匹配世界器净,要么調(diào)整世界相關(guān)參數(shù)讓它匹配UI。在此基礎(chǔ)上当凡,還要確保不同顯示分辨率和寬高比下的縮放情況山害,以及處理相機(jī)自身的縮放。
由于不同項(xiàng)目情況不同沿量,這里只介紹一種思路浪慌,只要清楚了原理其他都是相通的。
首先確定并統(tǒng)一所有圖片素材的PPU朴则,像素素材在制作過(guò)程中通常會(huì)有一個(gè)參考大小权纤,例如8×8、16×16乌妒、32×32汹想,不同參考大小可表現(xiàn)的細(xì)節(jié)也不同。
使用這個(gè)參考大小作為PPU是一個(gè)不錯(cuò)的選擇撤蚊,例如素材中每個(gè)地塊的大小為16×16古掏,PPU也設(shè)置為16,1個(gè)地塊剛好為1個(gè)Unity單位侦啸。
然后確定一個(gè)設(shè)計(jì)分辨率槽唾,也就是以此分辨率為基準(zhǔn)丧枪,其他分辨率都在它基礎(chǔ)上縮放,例如確定設(shè)計(jì)分辨率為1920×1080庞萍,將顯示分辨率和Canvas Scaler的參考分辨率都調(diào)整為這個(gè)值拧烦,此時(shí) 實(shí)際顯示分辨率 = 設(shè)計(jì)分辨率。
接下來(lái)有兩種選擇钝计,調(diào)整UI適配相機(jī)恋博,或調(diào)整相機(jī)以適配UI。
調(diào)整UI適配相機(jī)
這種方式適合一屏顯示的內(nèi)容有固定要求的情況私恬,例如要求屏幕中必須顯示32×18個(gè)地塊债沮,那么相機(jī)的大小不能變化。
根據(jù)相機(jī)大小一節(jié)践付,屏幕縱向共有相機(jī)Size×2個(gè)Unity單位秦士,用設(shè)計(jì)分辨率高度除以它缺厉,可以得到1Unity單位對(duì)應(yīng)的實(shí)際像素大小永高,即:
屏幕高度(Unity單位) = 相機(jī)Size * 2
屏幕高度(像素) = 設(shè)計(jì)分辨率高度
1Unity單位對(duì)應(yīng)像素 = 屏幕高度(像素) / 屏幕高度(Unity單位)
然后根據(jù)圖片的PPU,可以計(jì)算出圖片中的1個(gè)像素提针,實(shí)際顯示在屏幕上是多少像素命爬,也就是像素比率(Pixel Ratio):
像素比率 = 1Unity單位對(duì)應(yīng)像素 / PPU
舉個(gè)例子,當(dāng)設(shè)計(jì)分辨率為1920×1080辐脖,相機(jī)的Size設(shè)置為6饲宛,圖片大小16×16,PPU為16嗜价,此時(shí)的像素比率:
像素比率 = 1080÷(6×2)÷16 = 5.625
也就是圖片素材的1個(gè)像素艇抠,顯示在屏幕上為5.625個(gè)像素,因?yàn)槭窃O(shè)計(jì)分辨率久锥,有小數(shù)是正常的家淤,實(shí)際顯示時(shí)Unity會(huì)幫我們處理好。
得到的像素比率有什么用呢瑟由?它可以用來(lái)確定UI中圖片的大小絮重,如果UI的顯示也能符合這個(gè)像素比率,那么就做到UI和世界顯示大小一致了歹苦。
將UI Scale Mode改為Scale With Screen Size青伤,Reference Resolution設(shè)置為設(shè)計(jì)分辨率,Match調(diào)整為Height為1殴瘦。當(dāng)顯示分辨率與設(shè)計(jì)分辨率一致時(shí)狠角,Canvas不會(huì)有縮放。
根據(jù)Canvas一節(jié)蚪腋,在沒(méi)有縮放的情況下:
實(shí)際顯示像素大小 = Canvas像素大小 = 圖片像素大小 / (PPU / RPPU)
由此可以得出UI的像素比率:
UI像素比率 = 圖片像素大小 / 實(shí)際顯示像素大小 = RPPU / PPU
為了讓UI的像素比率和世界的像素比率一致擎厢,我們唯一還能調(diào)整的只有RPPU究流。按上面的例子,當(dāng)像素比率為5.625時(shí)动遭,RPPU應(yīng)該調(diào)整為16×5.625=90芬探,調(diào)整后需要點(diǎn)擊Image的Set Native Size重置大小。
調(diào)整好后厘惦,由于Canvas按高度縮放偷仿,相機(jī)也是按高度縮放,所以在不同分辨率和寬高比下都能保持一致:
如果項(xiàng)目不符合這種情況宵蕉,例如需要按寬度縮放酝静,可以試著按類似的原理調(diào)整相機(jī)大小和UI縮放。
調(diào)整相機(jī)適配UI
了解了上面的方法后羡玛,另一種情況依葫蘆畫瓢就行别智,先計(jì)算出UI的像素比率,然后調(diào)整相機(jī)大小匹配這個(gè)比率稼稿。
另外在使用Pixel Perfect Camera的情況下薄榛,相機(jī)大小不可直接調(diào)整,Pixel Perfect Camera會(huì)根據(jù)當(dāng)前各項(xiàng)參數(shù)計(jì)算出像素比率(圖中為實(shí)際顯示像素 : 圖片素材像素)让歼,按照這個(gè)值調(diào)整UI的像素比率即可敞恋。