該文解決如下問題
- 美術(shù)特效在制作UI特效的時(shí)候無法保證在運(yùn)行中的效果
- 在不同屏幕分辨率下ui 特效與UI不匹配
- 特效需要直接掛載到ui上
解決方案
- 在粒子特效創(chuàng)建時(shí)修改縮放
- 在游戲啟動(dòng)時(shí)修改 Camera 的 size 屬性
對(duì)比兩個(gè)方案明顯修改Camera 屬性更簡單赖舟, 并且對(duì)性能沒有影響
規(guī)則
規(guī)定UI運(yùn)行的基礎(chǔ)環(huán)境
- 游戲是橫板游戲
- 定義一個(gè)基礎(chǔ)分辨率 比如1136x640
- 定義基礎(chǔ)像素與Unity 單位的轉(zhuǎn)換 (默認(rèn)是100)
- Canvas Render Mode 為Screen Space
- Canvas Scaler 為 Scale Width Screen Size
- Canvas Match With Or Height值為0 , (盡量匹配屏幕寬度, 高度自適應(yīng))
- UI 攝像機(jī)為 Orghographic.
- UI攝像機(jī)的基礎(chǔ)Size = 640 / 100 / 2 = 3.2
在游戲啟動(dòng)時(shí)動(dòng)態(tài)修改
float defaultRadio = 1136f/ 640f; // 獲得默認(rèn)的寬高比例
float defaultSize = 640f / 100 / 2;
float radio = (float)Screen.width / (float)Screen.height;
float scale = radio >= defaultRadio ? 1 : defaultRadio / radio;
float cameraSize = defaultSize * scale;
GetUICam().size = cameraSize;
背后機(jī)制
在正交攝像機(jī)中size 的含義是從屏幕中心到屏幕頂部之間的距離晤柄,而這個(gè)距離
是以1個(gè)Unity單位來定的,一般我們可以理解為(米),其中一個(gè)單位可以
以一個(gè)Unity Cude 的默認(rèn)寬高來確定,比如下面:
property.png
screen.png
題外話
那我如果ui 想用 透視投影該怎么弄?
首先是計(jì)算高度 height = distance * tan(fov/2)
根據(jù)實(shí)際項(xiàng)目, 我把問題限制在如何在
適配方案是通過屏幕分辨率動(dòng)態(tài)調(diào)整Camera 中的Size 以達(dá)到UI 與特效匹配的效果.
流程如下:
1> 首先定義
相關(guān)知識(shí)點(diǎn):
什么是Pixels Per Unit?
正交相機(jī)中的Size 是什么含義?
Canvas Scaler 中的Scale Width Scene Size 會(huì)如何影響到UI特效的播放?
適配中的難題是:
UGUI 會(huì)根據(jù)屏幕改變, 特效也是. 而UGUI 中使用的是像素單位.