Unity全屏圖片適應


美術設計效果圖使用一個固定屏幕分辨率,為何和實際顯示屏幕分辨率區分開,我把它叫做設計分辨率,按照這個大小做出效果圖,導出背景圖可以對圖片壓縮比設計分辨率小。
依照設計分辨率對圖片分辨率寬高進行等比縮放,這樣超出屏幕顯示區域的內容不可見,背景圖片也不會拉升(可能會因為圖片分辨率太小縮放后模糊)。

// UnityEngine.Screen 獲取屏幕分辨率
public static Vector2 GetScreenSize()
{
    return new Vector2(Screen.width, Screen.height);
}

設計分辨率是美術同學參照某個固定分辨率制作效果圖,比如我固定設計分辨率是1334*750.
圖片分辨率通過self.imageBg.transform.sizeDelta獲取。

在Canvas Scaler手動指定屏幕拉伸分辨率,讓Canvas RectTransform寬高永遠不小於當前分辨率,以當前分辨率對界面Canvas拉伸。

這么個小Canvas Scaler參數概念還真是多,英語不好看個文檔還要翻譯(*  ̄︿ ̄)

UI Scale Mode: Scale With Screen Size

按照Reference Resolution分辨率對屏幕分辨率拉伸處理,使屏幕分辨率不小於Reference Resolution分辨率,這樣的好處是所有分辨率下的UI圖片都會是原始分辨率或者輕度拉伸,不會有過度縮放帶來的圖片模糊或者銳化,上文說的設計分辨率就是這個Reference Resolution。

Screen Match Mode用屏幕分辨率寬高比對畫布分辨率進行縮放。
重點說下Screen Match Mode的Expand和Shrink:

  • Expand (screenWidth / screenHeight) > (resolutionWidth / resolutionHeight),以Height為基准對Width縮放。
  • Shrink (screenWidth / screenHeight) > (resolutionWidth / resolutionHeight),以Width為基准對Height縮放。

其實弄個Canvas隨便調下參數看看結果,都比純粹文字好理解吧,文字只是記錄我的理解結果。

回到全屏圖片適應話題,設計分辨率確定了,接下來要開始換算,計算出分辨率下的圖片縮放比。

function GetFullScreenSpriteSize(spriteWidth, spriteHeight)
    local retWidth, retHeight = 0, 0

    local size = PlatformDevice.GetScreenSize()
    local screenWidth, screenHeight = size.x, size.y
    local designWidth, designHeight = GetDesignResolution()

    -- 根據屏幕分辨率寬高比,計算出新的Canvas resolutionSize,得到UI需要顯示的分辨率
    if (screenWidth / screenHeight) > (designWidth / designHeight) then
        -- 屏幕長,對Canvas寬拉伸到屏幕比例
        designWidth = screenWidth / screenHeight * designHeight
    else
        -- 屏幕高,對Canvas高拉伸到屏幕比例
        designHeight = screenHeight / screenWidth * designWidth
    end

    -- 對圖片縮放,圖片分辨率和設計分辨率相差大的邊作為縮放比,等比例縮放圖片
    local scaleRate = 1
    if (designWidth / designHeight) > (spriteWidth / spriteHeight) then
        scaleRate = designWidth / spriteWidth
    else
        scaleRate = designHeight / spriteHeight
    end
    retWidth = spriteWidth * scaleRate
    retHeight = spriteHeight * scaleRate

    return retWidth, retHeight
end

這么一段代碼看似和Unity UI控件沒什么關系,設計分辨率也是GetDesignResolution()=1334750中寫死,但解讀過程中不禁好奇為什么是1334750,難道僅僅是美術同學設計稿尺寸嗎,那和Canvas縮放有什么關系,為何圖片縮放到Canvas大小要考慮這么個分辨率,而不是直接獲取Canvas的分辨率對圖片縮放呢,這個設計分辨率和Camera的渲染分辨率也沒有關系,工程內的Camera viewport也沒有定義分辨大小,所以產生一個❓這個設計分辨率是怎么回事,從哪里來,為何參與圖片全屏計算。

搞清楚上一個設計分辨率問號后,新的疑問產生:為何要選擇UI Scale Mode-Screen Match Mode-Expand,原因似乎很簡單,如果從1334750的設計尺寸放到手機21801080呢(現在都是越來越大的分辨率),那圖片要拉伸2倍圖片要糊啦,選擇Expand的目的就是盡可能保持原有的圖片分辨率不做太大的圖片拉伸,保持原有的圖片視覺體驗。


免責聲明!

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



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