工作回顾--UI适配、场景、屏幕异型区域

前言

目标

1.实现屏幕尺寸 1:1 到 1:2 到 2:1 全适配
2.屏幕异型区域适配
3.留出广告banner空间
4.部分UI元素要依赖其他元素居中、部分UI元素固定尺寸等

部分效果展示:

1080*2340:
请添加图片描述
1080*1920:
请添加图片描述
1080*1080:
请添加图片描述

Canvas设置

Render Mode

在这里插入图片描述
使用Camera,因为Camera的渲染有sorting layer可以设置,而且不会遮挡粒子特效。
另外,相比Overlay,Overlay的渲染顺序在最后,会覆盖所有场景,粒子效果会有遮挡。

Canvas Scaler

UI Scale Mode在这里插入图片描述
选用Scal With Screen Size,根据屏幕尺寸缩放,不打算留黑边,但这种方式会考虑不同分辨率下,UI元素相对位置的问题。
Scale With Pixel Size: UI元素保持像素尺寸不变,性能开销小,试用场景:精准控制像素场景、像素绘画等、像素完美游戏。不适用于自适应布局,高DPI设备保持视觉一致性
在这里插入图片描述
参考分辨设置了1080*1920
其中的Screen Match Mode 选用 Expande
在这里插入图片描述
Expande会根据长宽选择更接近屏幕的进行缩放,可能出现空白
Shrink相反,其实也是裁剪画布来适应屏幕
Match:
实际缩放值 = 实际屏幕尺寸 / 参考分辨率尺寸
最终缩放 = Lerp(宽度缩放, 高度缩放, Match值)

UI层级

在这里插入图片描述
Canvas下分 bot、mid、top、。。。等
每一个UI的界面都是一个预制体,不同类型UI通过自己写的UIManager加载在对应的canvas下,起到层级覆盖的效果。
(通过自己的框架来管理,框架结构的文章连接://TODO)
在这里插入图片描述

特殊调整

标题图片、图标的y轴位置 居中于 canvas顶部和中间元素。

在这里插入图片描述
步骤:
获取顶部间隙
根据锚点设置坐标
在这里插入图片描述
在这里插入图片描述

根据屏幕比(1:1~1:2.5),设置中间图片容器的sizeDelta,让其他元素不超出,同时满足sizeDelta的尺寸是3:2

高:宽大于参考比例,就按照宽设置尺寸
否则,按照高设置尺寸
在这里插入图片描述

异型区域适配(安全区域适配)

在这里插入图片描述
自动空出刘海屏、水滴屏等异型区域的宽度
通过Unity的API来设置Cavas的Anchors的Min和Max

Screen.safeArea、Display.main.systemWidth、Display.main.systemHeight

anchorMin.x表示左边距离边界的距离比例,anchorMin.y表示下边距离边界的。anchorMin.y则表示剩下的两条边。
在这里插入图片描述

    public class SafeArea : MonoBehaviour
    {
        private RectTransform rectTrans;
        private Rect safeArea;
        private void Awake()
        {
            Debug.Log("SafeArea Awake called");
            rectTrans = GetComponent<RectTransform>();
            rectTrans.anchorMin = Vector2.zero;
            rectTrans.anchorMax = Vector2.one;
            rectTrans.anchoredPosition = Vector2.zero;
            rectTrans.sizeDelta = Vector2.zero;
            AdaptAnchorsValue();
        }

        private void LateUpdate()
        {
            if(safeArea == Screen.safeArea) return;
            AdaptAnchorsValue();
        }

        private void AdaptAnchorsValue()
        {
            safeArea = Screen.safeArea;
            var maxWidth = Display.main.systemWidth;
            var maxHeight = Display.main.systemHeight;
            var anchorMin = safeArea.position;
            var anchorMax = safeArea.position + safeArea.size;
            anchorMin.x /= maxWidth;
            anchorMin.y /= maxHeight;
            anchorMax.x /= maxWidth;
            anchorMax.y /= maxHeight;

            rectTrans.anchorMin = anchorMin;
            rectTrans.anchorMax = anchorMax;
        }
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dr.勿忘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值