unity中单位是米还是厘米_2019-08-22Unity中的单位长度与像素之间的关系
一:什么是像素?
像素是由很多個小方格組成,每一個小方格上都存儲了位置信息和色彩信息。像素是圖像的最小單位
分享一個知識點:圖像分為兩類,位圖和矢量圖
位圖(點陣圖):由多個像素組成,當放大時被分為多個色塊,而且放大的位圖屬于失真狀態(tài)。平時拍照,掃描的圖片等都屬于位圖
矢量圖:通過數(shù)學(xué)公式計算獲得的圖像,無論怎樣放大都不會失真,但是難以呈現(xiàn)色彩層次豐富的逼真圖像
二:圖像分辨率與屏幕分辨率
——圖像分辨率:每英寸圖片內(nèi)有多少個像素點,單位為PPI(Pixels Per Inch),像素每英寸。例如72ppi代表每英寸包含72個像素點
——屏幕分辨率:屏幕每行的像素點數(shù)屏幕每列的像素點數(shù)。例如1280720代表橫向1280像素縱向720像素,其總數(shù)為1280*720=921600個像素
三:像素的作用
——為什么圖像(位圖)放大后會變得模糊?
例如這是一張135*145的圖,左邊為正常情況下的全圖,右邊為放大之后的局部圖。明顯的看出放大之后圖像失真了變得模糊了。那為什么圖像會變得模糊呢?
這是因為圖像放大后圖像分辨率變小了,也就是每英寸顯示的像素點數(shù)變少,所以變得模糊了。正常情況下單位面積內(nèi)可以顯示所有的像素點數(shù)比如10000個,而放大后單位面積內(nèi)只能顯示1000個像素點數(shù)。
所以不難理解單位面積內(nèi)的像素點越多,圖像就會越清晰越逼真。
image
image
——為什么分辨率越高的顯示器越清晰?
例如兩個顯示器,A的分辨率是640480,B的分辨率是16001200,那么A屏幕上能夠顯示的像素為640*480個,明顯少于B屏幕能夠顯示的像素,這也就是為什么分辨率越高的屏幕越清晰
假設(shè)有兩個不同尺寸大小的屏幕A和B,A的尺寸比B大,但是他們的分辨率相同,那么他們同樣清晰,不存在A比B清晰
四:Unity中的單位與圖片像素的關(guān)系
image.png
在Inspector面板的圖像設(shè)置中有一個Pixels Per Unit參數(shù)。它代表Unity的一個單位長度包含本圖片多少個像素
在Unity中創(chuàng)建的Cube等基本圖形默認就是一個Unity單位長度,一個單位長度在unity世界坐標中代表1米
例如默認值為100,則代表一個Unity單位包含本圖片中100個像素
例如還是這張小烏龜?shù)膱D片,它是135像素*145像素。
那么它占了多少個Unity單位呢?
當Pixels Per Unit為100時則圖片在高度上占了145/100=1.45個Unity單位高,左圖所示。
當Pixels Per Unit為50時則圖片在高度上占了145/50=2.9個Unity單位高,右圖所示。
將圖片放到場景中查看,驗證所得的結(jié)論
image.png
image.png
五:Camera在正交模式下的Size與像素和Unity之間的關(guān)系
現(xiàn)在已經(jīng)明白了Unity中單位與像素之間的關(guān)系,其實它與相機的視口也存在一定的關(guān)系。
結(jié)論是這樣的:相機高度占的單位長度=相機的size * 2
例如當前Camera的size為3,那么屏幕高度應(yīng)該占了23=6個Unity單位,左圖所示
例如當前Camera的size為2,那么屏幕高度應(yīng)該占了22=4個Unity單位,右圖所示
在場景中查看,驗證結(jié)論
image.png
image.png
既然屏幕高度的單位長度/2是相機的size大小,那么屏幕寬度占的單位長度與相機size大小有什么關(guān)系呢?
例如當前Camera的size為1,左圖所示,可以看出是3個多單位長度。
例如當前Camera的size為0.5,右圖所示,可以看出是1個多單位長度。
很明顯屏幕寬度占的單位長度與相機size大小沒有關(guān)系
image
image
既然屏幕寬度占的單位長度與相機size大小沒有關(guān)系,那么屏幕寬度與什么有關(guān)系呢?
新建一個cube,因為cube的長和寬都是1個單位長度。
調(diào)整Camera的size為0.5,則在屏幕高度上應(yīng)該是0.5*2=1個單位長度,也就是正好可以放下1個cube。
例如屏幕的分辨率為5:4,如左圖所示。
例如屏幕的分辨率為16:9,如右圖所示。
不難發(fā)現(xiàn),無論怎樣調(diào)整分辨率,相機顯示的單位高度都不會改變,但是仔細觀察兩種不同分辨率下的Game窗口,天空盒占的范圍不一樣。
image.png
image.png
所以得出結(jié)論:相機高度占的單位長度只由Camera的size決定,而相機寬度占的單位長度是由于分辨率不同再通過一個比例計算出來的。
是這樣計算的
image.png
又因為相機高度占的單位長度=相機的size*2,所以總結(jié)出來一個公式:
image.png
六:為什么場景視圖的Scale不是1呢
還有一個問題就是為什么在Game視圖中的Scale不為1。
image.png
image.png
改變不同的分辨率后測試后發(fā)現(xiàn)不同分辨率的Game視圖不但Scale不為1而且還是不同的。
繼續(xù)測試,當分辨率為23041440時(我的屏幕最大分辨率為這個),當Game窗口小時,Scale為0.256,當Game窗口大時,Scale為0.586。
image.png結(jié)論:因為我們的屏幕太小了,無法顯示這個分辨率的畫面所以只能將相機畫面等比例縮放,并不影響游戲。
比如我這臺電腦的分辨率為23041440,而我游戲場景設(shè)置的分辨率為2560*1440,那么無論場景視圖放到多大Scale都不可能為1。而如果游戲場景設(shè)置的分辨率比較小時在你的Game窗口就有可能會顯示不縮放的Scale比例。
7.一個比較繞的關(guān)系
比如一張圖片的分辨率為1024219,然后游戲視圖分辨率為1280720。設(shè)置Pixels Per Unit為219,相機size為0.5,圖片應(yīng)該是正好為屏幕的高度。可是圖片的寬度分辨率明明是219像素,為什么卻在游戲視圖中變成了720像素了呢。
因為相機的高度為1個單位長度,而圖片也是一個單位長度,所以圖片會輸出整個畫面的高度,所以才會顯示720像素的高度。
8.對于2D游戲中的一些素材如何做到自適應(yīng)
對于背景,按鈕等都會用UGUI繪制,UGUI有可視化的自適應(yīng)設(shè)置功能,但對于2D游戲中的精靈圖片呢。
現(xiàn)在需要一張地面的圖片始終與屏幕寬度一致,屏幕的分辨率為9:16,圖片的分辨率為1024219。放到場景中發(fā)現(xiàn)它并不能滿足我們的要求。
image.png第一種方法:調(diào)整相機的size
如果想讓高度充滿屏幕則size=圖片的高度分辨率/Pixels Per Unit/2。
如果想讓寬度充滿屏幕則size=圖片寬度占的單位長度/屏幕寬高比/2。
例如它的Pixels Per Unit為100。
則圖片寬度占的單位長度=1024/100=10.24,屏幕寬高比=9/16=0.562,則size=10.24/0.562/2=9.1。
將相機的size調(diào)整為9.1,發(fā)現(xiàn)圖片的寬度正好與屏幕的寬度吻合。
image.png
第二種方法:調(diào)整圖片的Pixels Per Unit
例如相機的size為20。在不改變相機size的情況下,讓圖片與屏幕的寬度相符合。
屏幕長寬比=9/16=0.562,則size=20。則屏幕寬度的單位長度=0.562202=22.48。
又因為圖片的分辨率為1024219。所以Pixels Per Unit=1024/22.48=44.91。
調(diào)整圖片Pixels Per Unit為44.91,發(fā)現(xiàn)圖片的寬度正好與屏幕的寬度吻合。
image.png
但是對于實際的項目來說需要做到動態(tài)自適應(yīng),而不是我們計算出來手動去修改數(shù)值。
1.首先可以改變圖片的Pixels Per Unit,但是發(fā)現(xiàn)它是只讀的屬性。
image.png
2.根據(jù)不同分辨率改變相機的size的話場景中的其他元素都會受到影響。
由于以上兩種方法都無法適用,所以對于2D精靈圖片的自適應(yīng)應(yīng)該去改變圖片的自身scale(這種方法會讓圖片拉伸變形,我還沒有找到更好的解決辦法)。
例如相機的size為15,屏幕的分辨率為9:16,圖片的分辨率為1024219,圖片的Pixels Per Unit為100。
則屏幕長寬比=9/16=0.562,屏幕寬度占的單位長度=0.56215*2=16.86。
我們可以這樣理解。
當圖片scaleX為當前scale時,圖片寬度占的單位長度=1024/100=10.24。
當圖片的scale為X時,屏幕寬度占單位長度=16.86。
可以列一個方程:圖片scaleX/10.24=X/16.86。解出X=1.646。
將圖片的scaleX設(shè)置為1.646,發(fā)現(xiàn)圖片的寬度正好與屏幕的寬度吻合。
image.png
所以我們可以寫一個自適應(yīng)的腳本掛載到需要自適應(yīng)的物體上
\\
using UnityEngine;
public class Adjust : MonoBehaviour
{
private SpriteRenderer spriteRenderer;//精靈渲染組件
private float imageWidth;//圖片的寬度
private void Start()
{
spriteRenderer = GetComponent();
imageWidth = spriteRenderer.bounds.size.x;//圖片的寬度
ReSize();
}
//重新定義Scale
private void ReSize()
{
float scrreenWidth = Screen.width;//屏幕的寬度
float screenHeigth = Screen.height;//屏幕的高度
float cameraHeightUnit = Camera.main.GetComponent().orthographicSize * 2;//屏幕高度占的單位長度
float targetWidth = cameraHeightUnit * scrreenWidth / screenHeigth;//屏幕寬度占的單位長度
//公式:當前物體的scale.x/當前圖片寬度=目標的scale.x/屏幕寬度占多少個單位長度
float targetScaleX = transform.localScale.x / imageWidth * targetWidth;//求出目標的scale.x
Vector3 targetScale = transform.localScale;
targetScale.x = targetScaleX;
transform.localScale = targetScale;
}
}
\\
9.不同設(shè)備的分辨率自適應(yīng)
先提兩個概念
1.游戲有效內(nèi)容:指游戲中一定要完整顯示在屏幕上的內(nèi)容。
2.游戲?qū)嶋H內(nèi)容:指游戲的全部內(nèi)容,其中包括有效內(nèi)容和為了適配不同分辨率而增加的不重要的內(nèi)容。
總結(jié)
以上是生活随笔為你收集整理的unity中单位是米还是厘米_2019-08-22Unity中的单位长度与像素之间的关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。