- Unity3D高级编程:主程手记
- 陆泽西
- 616字
- 2022-01-07 14:46:28
4.4.3 Layout模块
从图4-5的Layout模块的文件夹结构可以看出,Layout的主要功能都是布局方面的,包括横向布局、纵向布局和方格布局等。总共12个文件,有9个带有Layout字样,它们都是用于处理布局的。
图4-5 Layout模块的文件夹结构图
除处理布局内容外,其余3个文件CanvasScaler、AspectRatioFitter、ContentSizeFitter则是用于调整屏幕自适应功能的。
从ContentSizeFitter类、AspectRatioFitter类都带有Fitter字样可以了解到,它们的功能都是处理屏幕自适应。其中ContentSizeFitter类处理的是内容的自适应问题,而AspectRatioFitter类处理的是朝向的自适应问题,包括以长度为基准、以宽度为基准、以父节点为基准、以外层父节点为基准这四种类型的自适应方式。
另外,CanvasScaler类提供的功能非常重要,它操作的是Canvas整个画布针对不同屏幕进行的自适应调整。
由于代码量比较多,这里着重看看CanvasScaler类里的代码,其CanvasScaler类的核心函数源码如下:
protected virtual void HandleScaleWithScreenSize() { Vector2 screenSize = new Vector2(Screen.width, Screen.height); float scaleFactor = 0; switch (m_ScreenMatchMode) { case ScreenMatchMode.MatchWidthOrHeight: { // 在取平均值之前,我们先取相对宽度和高度的对数, // 然后将其转换到原始空间 // 进出对数空间的原因是具有更好的行为 // 如果一个轴的分辨率为两倍,而另一个轴的分辨率为一半,则widthOrHeight值为 0.5时,它应该平整 // 在正常空间中,平均值为(0.5 + 2)/ 2 = 1.25 // 在对数空间中,平均值为(-1 + 1)/ 2 = 0 float logWidth = Mathf.Log(screenSize.x / m_ReferenceResolution. x, kLogBase); float logHeight = Mathf.Log(screenSize.y / m_ReferenceResolution. y, kLogBase); float logWeightedAverage = Mathf.Lerp(logWidth, logHeight, m_ MatchWidthOrHeight); scaleFactor = Mathf.Pow(kLogBase, logWeightedAverage); break; } case ScreenMatchMode.Expand: { scaleFactor = Mathf.Min(screenSize.x / m_ReferenceResolution.x, screenSize.y / m_ReferenceResolution.y); break; } case ScreenMatchMode.Shrink: { scaleFactor = Mathf.Max(screenSize.x / m_ReferenceResolution.x, screenSize.y / m_ReferenceResolution.y); break; } } SetScaleFactor(scaleFactor); SetReferencePixelsPerUnit(m_ReferencePixelsPerUnit); }
在不同的ScreenMathMode模式下,CanvasScaler类对屏幕的适应算法包括优先匹配长或宽的、最小化固定拉伸及最大化固定拉伸这三种数学计算方式。其中在优先匹配长或宽算法中介绍了如何使用Log和Pow来计算缩放比例。