Unity高級開發(fā)-項目與屏幕適配
1、游戲屏幕適配
屏幕適配是為了讓我們的項目能夠跑在各種電子設(shè)備上(手機,平板,電腦)
那么了解是適配之前首先要了解兩個知識點:
1-1、什么是像素?
單位面積中構(gòu)成圖像的點的個數(shù)。
特點:單位面積內(nèi)的像素越多,分辨率越高,圖像的效果就越好。
1-2、什么是分辨率?
分辨率可以從顯示分辨率與圖像分辨率兩個方向來分類。
示分辨率(屏幕分辨率)是屏幕圖像的精密度,是指顯示器所能顯示的像素有多少.分辨率的單位有:(dpi點每英寸)、lpi(線每英寸)和ppi(像素每英寸)。
特點:
圖像的分辨率越高,所包含的像素就越多,圖像就越清晰,印刷的質(zhì)量也就越好。
同時,它也會增加文件占用的存儲空間。
1-3、移動設(shè)備分辨率 –以iphone 為例

2、什么是適配?
什么是適配?
適應(yīng)、兼容各種不同的情況
游戲開發(fā)中,適配的常見種類
¤系統(tǒng)適配
針對不同版本的操作系統(tǒng)進行適配,例如Unity3D 5.4系統(tǒng)
¤屏幕適配
針對不同大小的屏幕尺寸進行適配,例如Iphone5s,iphone7
iPhone的尺寸
3.5inch、4.0inch、4.7inch、5.5inch
iPad的尺寸
7.9inch、9.7inch
屏幕方向
豎屏
橫屏
3、Unity3D 中的屏幕分辨
3-1.
屏幕的寬高比(Aspect Ratio) = 屏幕寬度/屏幕高度
3-2.
Unity2D中攝像機鏡頭的尺寸決定了我們實際看到游戲內(nèi)容的多少,在編輯器中我們可以通過調(diào)整攝像機Camera的orthographicSize屬性值來調(diào)整攝像機的大小

注:Unity3D中這個比例的默認值是100,即100像素等于1單位。
如果我們的游戲屏幕有640像素高,那么實際換算成單位高度則是6.4個單位,
當我們攝像機的orthographicSize值是3.2時,攝像機大小剛好與屏幕大小相等
4、Unity3D中的屏幕適配設(shè)置
4-1:像素適配設(shè)置(固定分辨率)

2、屏幕寬高比
屏幕的寬高比Aspect Ratio = 屏幕寬度/屏幕高度

5、Unity3D中的攝像機設(shè)置
Unity編輯器中只能直接調(diào)整攝像機的高度,那攝像機的寬度是如何確定的呢?
答案就是我們最前面提到的屏幕寬高比。Unity會根據(jù)當前屏幕實際的寬高比和攝像機的orthographicSize值來計算出攝像機的寬度值,即:
攝像機實際寬度 = 攝像機orthographicSize * 2 * 屏幕寬高比
即是
攝像機實際寬度 = 攝像機高度 * 屏幕寬高比
我舉個例子說明一下,iPhone4的屏幕像素為640*960,寬高比為2:3,假設(shè)Pixels To Units值為100,那么如果設(shè)攝像機高度size值為4.8,那么攝像機實際寬度按照公式算出6.4,剛好就是屏幕的單位寬度。
6、Unity3D中的圖片像素比設(shè)置

6、Unity3D:關(guān)于適配的一些UI問題解決
這里就是重中之重,也是坑點較多的地方
調(diào)整相機為設(shè)計尺寸,添加Canvas到場景中進行UI設(shè)計,但是Canvas默認大小和相機并不重合。
怎么辦?
6-1:辦法1:
調(diào)整Canvas的Render Mode屬性為Screen Space - Camera:
將映射游戲內(nèi)容的Camera拖入Render Camera中,下一個屬性Plane Distance表示UI
與Camera的在Z軸距離(其實就是變相反映了UI的Z軸位置)。
接著在Canvas Scaler屬性里將Ui Scale Mode屬性設(shè)置為Scale With Screen Size,
表示Canvas會根據(jù)屏幕比例縮放。
下面的Reference Resolution,表示UI寬和高一半的大小。例如設(shè)計尺寸為640x960,
則x應(yīng)為640 / 2 = 320,寬應(yīng)為960 / 2 = 480。
下面的Screen Match Mode屬性選中Match Width Or Height,表示采用寬度(上文有提到過)
或高度(Unity自帶適配方式)適配。然后Match調(diào)整為0或1,0表示完全寬度適配,
1表示完全高度適配,其他值表示介于兩者之間采用比例適配

6-2:辦法2:
調(diào)整Canvas的Render Mode屬性為World Space
1、將Event Camera設(shè)置為映射游戲內(nèi)容的Camera。
2、然后調(diào)整Rect Transform組件中的Width和Height為設(shè)計尺寸的寬和高,同時將Scale屬性的X和Y都調(diào)整為0.01(對應(yīng)unity2d默認情況下像素Pixels與引擎單位Unit對應(yīng)比例100)。這時,Canvas的寬高正好與攝像機相同。
這兩種方法都可以將UI調(diào)整為與設(shè)計尺寸一致,并且在編輯器中運行與真機中運行效果保持一致。

6-3:辦法3:
給攝像機掛下圖腳本就可以搞定比例問題:

6-4:設(shè)定好就如下圖所示

解決屏幕分辨率適配的問題,其實就是解決如何讓游戲攝像機尺寸限定在給定范圍的問題。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LeoPlayerSetting : MonoBehaviour {
? ? void Update()
? ? {
? ? ? ? //? 按ESC退出全屏??
? ? ? ? if (Input.GetKey(KeyCode.Escape))
? ? ? ? {
? ? ? ? ? ? Screen.fullScreen = false;? //退出全屏? ? ? ? ? ?
? ? ? ? }
? ? ? ? //設(shè)置7680*1080的全屏??
? ? ? ? if (Input.GetKey(KeyCode.B))
? ? ? ? {
? ? ? ? ? ? Screen.SetResolution(1920, 1080, true);
? ? ? ? }
? ? ? ? if (Input.GetKey(KeyCode.C))
? ? ? ? {
? ? ? ? ? ? Screen.SetResolution(Screen.width, Screen.height, true);
? ? ? ? }
? ? ? ? //按A全屏??
? ? ? ? if (Input.GetKey(KeyCode.A))
? ? ? ? {
? ? ? ? ? ? //獲取設(shè)置當前屏幕分辯率??
? ? ? ? ? ? Resolution[] resolutions = Screen.resolutions;
? ? ? ? ? ? //設(shè)置當前分辨率??
? ? ? ? ? ? Screen.SetResolution(resolutions[resolutions.Length - 1].width, resolutions[resolutions.Length - 1].height, true);
? ? ? ? ? ? Screen.fullScreen = true;? //設(shè)置成全屏,??
? ? ? ? }
? ? }
}
7、適配總結(jié)
1.游戲有效內(nèi)容,指游戲中一定需要完整顯示在屏幕上的內(nèi)容;
2.游戲?qū)嶋H內(nèi)容,指全部的游戲內(nèi)容,包括有效內(nèi)容和主要是為了適配多分辨率的或其他不重要的目的而增加的內(nèi)容。
實際的分辨率適配問題與三個尺寸相關(guān),他們分別是:攝像機尺寸,游戲內(nèi)容尺寸(包括有效內(nèi)容尺寸和無效內(nèi)容尺寸)和實際屏幕尺寸。
8、了解游戲中的攝像機
相機(Camera)
是向玩家捕獲和顯示世界的設(shè)備。通過自定義和操縱攝像機,
你可以使你的游戲表現(xiàn)得真正獨特。您在場景中攝像機的數(shù)量不受限制。
他們可以以任何順序設(shè)定放置在屏幕上的任何地方,或在屏幕的某些部分。

8-1、攝像機屬性:

Clear Flags 清除標識
確定了屏幕哪些部分將被清除,方便多個攝像機畫不同的游戲元素

Skybox 天空盒:這是默認設(shè)置。屏幕上的任何空的部分將顯示當前相機的天空盒。
如果當前的相機沒有設(shè)置天空盒,它會默認在渲染設(shè)置(Render Settings )選擇天空盒
Solid Color 純色
任何空部分,屏幕顯示為當前相機的背景色。
Depth Only 僅深度
如果你想繪制一個玩家的槍,又不讓它內(nèi)部環(huán)境被裁剪,你會設(shè)置深度為0的相機繪制環(huán)境,
和另一個深度為1的相機單獨繪制武器。武器相機的清除標志(Clear Flags )應(yīng)設(shè)置 為depth only。
Don't Clear 不清除
此模式不清除顏色或深度緩存。每一幀在下一幀結(jié)束后繪制,看上去像是涂抹(smear-looking)的效果。
這在游戲中不常用,最好是在自定義著色器(custom shader)上使用。
Rendering Path-渲染路徑
定義什么繪制方法被用于相機的選項

Use Player Settings 使用玩家設(shè)置:在玩家設(shè)置(Player Settings.)相機使用哪個渲染路徑。
Vertex Lit 頂點光照 :所有被這個相機渲染的物體都將渲染成Vertex-Lit物體。
Forward 正向渲染:所有對象每材質(zhì)渲染只渲染一次,和Unity 2.x中的標準一樣
Deferred 延遲照明:所有物體將在無光照的環(huán)境渲染一次,然后在渲染隊列尾部將物體的光照一起渲染出來。
Traget Texture-目標紋理:

渲染紋理 (Render Texture)包含相機視圖輸出。這會使相機渲染在屏幕上的能力被禁止。
補充:Vertex Lit:頂點光照
這個Shader是Vertex-Lit,是最簡單的Shader之一。這個Shader渲染代價是非常小的
所有照射在該物體上的光源通過一次光能傳遞渲染完成并且只計算頂點光源。
因為是Vertex-Lit,所以不會有任何基于像素渲染的效果,例如:Light Cookies,Normal Mapping
和Shadows。這個Shader對模型的細分同樣更加敏感,假如在很靠近立方體的地方放置一個
點光源,并且應(yīng)用這個Shader,這個光源只會在此角落進行計算
General shader performance 通常的著色器性能
Unlit. This is just a texture, not affected by any lighting.?不發(fā)光。這只是一個紋理,不被任何光照影響
VertexLit. 頂點光照
Diffuse. 漫反射
Normal mapped. ?法線貼圖,比漫反射更昂貴:增加了一個或更多紋理(法線貼圖)和幾個著色器結(jié)構(gòu)
Specular. This adds specular highlight calculation. ?高光。這增加了特殊的高光計算
Normal Mapped Specular. Again, this is a bit more expensive than Specular. ?高光法線貼圖。這比高光更昂貴一點
Parallax Normal mapped. This adds parallax normal-mapping calculation. ?視差法線貼圖。這增加了視差法線貼圖計算
Parallax Normal Mapped Specular..?視差高光法線貼圖。這增加了視差法線貼圖和鏡面高光計算
作者:雷潮
鏈接:https://www.jianshu.com/p/95cb4621206e
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。