本文已参加「新人创作礼」活动,一起敞开创作之路。

Canvas Scaler 这个组件用来做全体 UI 屏幕适配的。为什么是全体适配?因为适配时还会用到 RectTransform 中的 Anchor 特点。Canvas Scaler 的缩放形式与 Canvas 的烘托形式相关:当 Canvans 烘托形式为 Screen Space – OverlayScreen Space – Camera 时,缩放形式有三种;当 Canvans 烘托形式为 World Space 时,缩放形式只要一种。

1 Screen Space 烘托形式下的缩放形式

UI Scale Mode 的三种缩放形式如下:

Unity Canvas Scaler 组件的使用

  • Constant Pixel Size:固定像素巨细形式,Canvas 画布中其他 UI 控件对象直接固定像素巨细。
  • Scale With Screen Size:随屏幕巨细改动自身巨细形式,Canvas 画布中其他 UI 控件巨细随屏幕巨细改动自身巨细。
  • Constant Physical Size:固定物理尺度形式,Canvas 画布中其他 UI 控件采用固定物理尺度。

1.1 Constant Pixel Size

不依据屏幕分辨率调整 Canvas 的缩放, 以 UI 元素的像素值 * Scale Factor 对应实在屏幕的像素点进行烘托。

  • Scale Factor:画布的缩放份额。默认况下为1,表示正常巨细。
  • Reference Pixels Per Unit:每个 UI 单位对应的像素数。

1.2 Scale With Screen Size

Unity Canvas Scaler 组件的使用

依据实在屏幕的宽高来缩放 Canvas。

1.2.1 Reference Resolution:

参考分辨率,即一开始制作时选定的屏幕分辨率,后面的选项参数都是依据它来核算的。

1.2.2 Screen Match Mode

Unity Canvas Scaler 组件的使用

1.2.2.1 Match Width or Height

依据实在屏幕的宽高比按指定的 Match 值来缩放 Canvas。 Reference Resolution:UI 的规划尺度,这个值需要自已定,也是美术做图的依据,一般为 1920 * 1080。 Match:决议 Canvas 按宽高缩放的权重值,当 Match = 0 时,按宽度进行 Canvas 等比缩放;当 Match 值 = 1 时,按高度度进行 Canvas 等比缩放。一般情况下这个值非 0 即 1,不用纠结中心值。

1.2.2.2 Expand

当屏幕分辨率大于参考分辨率时,选择改变较小的一个方向(横向仍是纵向),作为放大 Canvas Scale 的规范,另一方向上的改变则是在全体缩放今后再进行补偿性的改变。此举旨在削减扩展分辨率时因为非等比扩展而对 UI 全体布局形成影响。合适制作较小规范尺度,扩充到较大屏幕。

1.2.2.3 Shrink

和 Expand 类似,可是更合适于缩小的景象。它会在屏幕尺度缩小时,经过缩小 Canvas Scale 尽量削减因为非等比缩小对布局产生的影响。依照影响较小的一个方向缩小的份额去缩小 Canvas Scale,然后再经过变形调整别的一个方向。

1.3 Constant Physical Size

与 Constant Pixel Size 形式本质相同, Constant Pixel Size 经过逻辑像素巨细调理来保持缩放,Constant Physical Size 经过物理巨细调理来保持缩放。运用这种形式必须指定一个像素转换物理巨细的因数,运行时经过具体设备的 DPI 核算最终的 Canvas 像素巨细和缩放份额。

  • Physical Unit:用于指定 UI 位置和巨细 的物理单位。
特点 描述 核算中的 targetDPI
Centimeters 厘米 2.54
Millimeters 毫米 25.4
Inches 英寸,约 25.4 毫米 1
Points 点,1/72 英寸,1/12 派卡 72
Picas 派卡,1/6 英寸 6
  • Fallback Screen DPI:如果未获取到屏幕的 DPI,将运用此值参加核算缩放。
  • Default Sprite DPI:预设的图片像素密度。 官方代码:
float currentDpi = Screen.dpi;
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);
SetReferencePixelsPerUnit(m_ReferencePixelsPerUnit * targetDPI / m_DefaultSpriteDPI);
  • Reference Pixels Per Unit:每个 unity 单位对应的像素数,要与目前的 Dpi 再运算求出新的值,再传入Canvas中求出巨细,公式如下: 新的 Reference Pixels Per Unit = Reference Pixels Per Unit * Physical Unit / Default Sprite DPI UI巨细 = 原图巨细(Pixels) / (Pixels Per Unit / 新的 Reference Pixels Per Unit)

2 World Space 烘托形式下的缩放形式

当 Canvans 烘托形式为 World Space 时,UI Scale Mode 只要一种。

Unity Canvas Scaler 组件的使用

  • Dynamic Pixels Per Unit Canvas:缩放值取决于此值的设定值。
  • Reference Pixels Per Unit:每个 UI 单位对应的像素数。