[Unity]2D像素游戲中讓UI與世界的像素大小保持一致

在使用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的像素比率即可敞恋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谋右,隨后出現(xiàn)的幾起案子硬猫,更是在濱河造成了極大的恐慌,老刑警劉巖改执,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啸蜜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡辈挂,警方通過(guò)查閱死者的電腦和手機(jī)衬横,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)呢岗,“玉大人冕香,你說(shuō)我怎么就攤上這事『笤ィ” “怎么了悉尾?”我有些...
    開(kāi)封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)挫酿。 經(jīng)常有香客問(wèn)我构眯,道長(zhǎng),這世上最難降的妖魔是什么早龟? 我笑而不...
    開(kāi)封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任惫霸,我火速辦了婚禮猫缭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘壹店。我一直安慰自己猜丹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布硅卢。 她就那樣靜靜地躺著射窒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪将塑。 梳的紋絲不亂的頭發(fā)上脉顿,一...
    開(kāi)封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音点寥,去河邊找鬼艾疟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛敢辩,可吹牛的內(nèi)容都是我干的蔽莱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼责鳍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼碾褂!你這毒婦竟也來(lái)了兽间?” 一聲冷哼從身側(cè)響起历葛,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘀略,沒(méi)想到半個(gè)月后恤溶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帜羊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年咒程,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讼育。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帐姻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奶段,到底是詐尸還是另有隱情饥瓷,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布痹籍,位于F島的核電站呢铆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蹲缠。R本人自食惡果不足惜棺克,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一悠垛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娜谊,春花似錦确买、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至抹剩,卻和暖如春撑帖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背澳眷。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工胡嘿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钳踊。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓衷敌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拓瞪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缴罗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容