UGUI适配非全屏界面

最近在做UGUI的适配,如果是全屏界面还好,如果界面不是全屏的,需要首先设定Anchors,然后根据屏幕大小,进行缩放。

在所有的UI根节点上(我们称为UIRoot),挂载一个Canvas Scaler组件,这个组件是专门根据实际宽高比,对UIRoot的进行缩放,这个组件中的Reference Resolution(比如是1334*750)我们称为开发分辨率,所有UI尺寸是基于这个分辨率下设定的,Canvas Scaler下另一个属性Screen Match Mode是屏幕匹配的方式有三种方式,在这里我选择的是Match Width Or Height,是表示根据宽度或者高度进行适配,在选择了Match Width Or Height,下方会出现一个Match选项,对Width和Height进行加权,如果Width选择0,则是表示宽度不动,对高度进行缩放进行适配。在这里我选择的是Width为0。

当游戏运行在某一分辨率(如2436*1125)上时候,实际宽高比跟开发分辨率的宽高比会有可能不一样,Canvas Scaler组件根据实际宽高比,对UIRoot的高度进行缩放,我们称UIRoot调整后的宽高分辨率为基准分辨率,在我的项目中UIRoot高度缩小为616。这时候一些界面如果是非全屏、Anchors在屏幕左上角或其他三个角的时候,如果开发高度大于616不进行缩小的话,是会超出屏幕的。解决办法是求出基准分辨率的高与开发分辨率高的比值s,表示开发分辨率的高度缩放到基准分辨率的高度所进行的缩放,也就是非全屏界面所要进行的缩放系数,然后对非全屏界面的localScale进行赋值即可。

上代码:

public Vector3 ScaleByOriginalHeight(float height)
        {
            //canvasScaler是UIRoot根节点挂载的CanvasScaler,referenceResolutionHeight是开发分辨率的高
            float referenceResolutionHeight = canvasScaler.referenceResolution.y;
            //UIRoot根节点的高度会根据CanvasScaler组件,进行高度缩放,从而产生新的基准分辨率
            float adjustReferenceResolution = GetComponent<RectTransform>().rect.height;
            float scale = adjustReferenceResolution / referenceResolutionHeight;
            return new Vector3(scale, scale, 1);
        }

这样任何一个非全屏界面,都可以进行完美适配。

猜你喜欢

转载自blog.csdn.net/younne0915/article/details/81092823