在学习Canvas Scaler组件之间,让咱们先来了解一下什么是像素、图片分辨率、屏幕分辨率、像素比以及宽高比。html
像素:像素指的是图像最小的单位,是独立的一个色块(像素点),一张图片就是由这些像素点构成的,单位面积内像素点越多,越密集,那么图像就会越清晰。canvas
图片分辨率:图像分辨率是指每英寸图像内的像素。图像分辨率是有单位的,叫像素没英寸。分辨率越高,像素的点密度越高,图像越逼真。c#
屏幕分辨率:屏幕所能显示像素的多少,分辨率1920x1080的意思就是水平方向含有像素数为1920个,垂直方向像素数为1080个。屏幕尺寸同样的状况下,分辨率越高,显示效果越精细和细腻。markdown
像素比:是指每一个格子(像素)是方的仍是扁的。1:1就是正方的,4:3是有点扁的,16:9是很扁。app
宽高比(画面比):指视频图像的宽度和高度之间的比例。ide
注意:oop
好比一部电影,分辨率是640 * 360,画面宽高比是16:9(640:360),那么像素比正好是1:1。布局
Unity官方对于Canvas Scaler的定义是"The Canvas Scaler Component is used for controlling the overall scale and pixel density of UI elements in the Canvas. This scaling effects everything under the Canvas, including font size and image borders"。意思是Canvas Scaler组件用于控制在画布上全部的UI元素的缩放比例和像素密度。而且这个缩放比例会影响全部在Canvas上面的东西,包括字体大小和图片边界。学习
为了适用不一样分辨率,咱们可能须要容许适当的UI总体性的缩放,外加一些尽量少的局部微调,这样能够达到一个比较理想的效果。Canvas Scaler就是负责该功能的组件。字体
当Canvas的Render Mode为Screen Space - Overlay或者是Screen Space - Camera时,Canvas Scaler的UI Scale Model有三个选项,分别是:Constant Pixel Size、Scale With Screen Size、Constant Physical Size,以下图所示:
当Canvas的Render Mode为World Space时,Canvas Scaler的UI Scale Model只有一个为Wordl默认选项,且不可更改,以下图所示:
下面来详细介绍一下Constant Pixel Size、Scale With Screen Size、Constant Physical Size这三种模式。
说明: 当屏幕分辨率设置为1000 * 1000时,建立一个Canvas,再在Canvas里面添加一张宽高为100 * 100的图片。
参数详解:
当Scale Factor设置为1时,Canvas的宽高为1000 * 1000,图片的宽高为100 * 100,以下图所示:
当Scale Factor设置为2时,Canvas的宽高为500 * 500,图片的宽高仍是为100 * 100,以下图所示:
总结: 不管屏幕大小如何,UI元素都保持相同的像素大小。使用该模式时,能够在屏幕上按像素指定UI元素的位置和大小。这也是画布在未附加任何画布缩放器时的默认功能。可是借助画布缩放器中的”Scale Factor”设置,能够向画布中的全部UI元素应用常量缩放。
说明 当屏幕分辨率设置为1000 * 1000时,建立一个Canvas,再在Canvas里面添加一张宽高为800 * 600的图片,UI布局设计分辨率设置为800 * 600。
总结: 屏幕越大,UI元素越大。使用该模式时,能够根据指定分辨率像素来指定位置和大小,若是当前屏幕的分辨率大于参考分辨率,则画布会保持参考分辨率,可是会放大以便适应屏幕。若是当前屏幕的分辨率小于参考分辨率,则画布会相应缩小以适应屏幕。
说明: 与 Constant Pixel Size 模式本质相同, Constant Pixel Size 经过逻辑像素大小调节来维持缩放,Constant Physical Size 经过物理大小调节来维持缩放。使用这种模式必须指定一个像素转换物理大小的因数,运行时经过具体设备的 DPI 计算最终的 Canvas 像素大小和缩放比例。
///<summary>
///Handles canvas scaling for a constant physical size.
///</summary>
protected virtual void HandleConstantPhysicalSize()
{
float dpi = (currentDpi == 0 ? m_FallbackScreenDPI : currentDpi);
float targetDPI = 1;
switch (m_PhysicalUnit)
{
case Unit.Centimeters: targetDPI = 2.54f; break;
case Unit.Millimeters: targetDPI = 25.4f; break;
case Unit.Inches: targetDPI = 1; break;
case Unit.Points: targetDPI = 72; break;
case Unit.Picas: targetDPI = 6; break;
}
SetScaleFactor(dpi / targetDPI);
//设置Canvas中每一个单位有多少像素
SetReferencePixelsPerUnit(m_ReferencePixelsPerUnit * targetDPI / m_DefaultSpriteDPI);
}
复制代码
总结: 不管屏幕大小和分辨率如何,UI元素都保持相同的物理大小。使用该模式时,能够在屏幕上按照物理单位指定UI元素的位置和大小。此模式要求设备正确报告其屏幕DPI(分辨率)。对于不报告DPI的设备,能够指定回退DPI