【Unity】工具类系列——UI刘海屏适配

本文介绍了如何在Unity游戏中进行刘海屏适配,通过获取设备型号和屏幕分辨率,调整UI元素的位置以避免被刘海遮挡。提供了一种支持热更的适配方案,允许在项目上线后也能进行适配调整。适配过程涉及修改对象的Anchored Position,使用预设的gm.MNotchAdaptY_参数来设定刘海高度。

刘海屏适配
项目上线了总免不了适配问题,
注:该方案支持热更适配,哪怕是上线项目也可以及时开启适配及调整适配程度。
原理:
通过获取设备型号及计算屏幕分辨率,在根据是否刘海屏调整侧边按钮的 Anchored Position 偏移量,从而避过刘海遮挡。


```csharp
using System;
using System.Collections;
using System.Collections.Generic;
using Sirenix.OdinInspector;
#if UNITY_EDITOR
using Sirenix.Utilities.Editor;
using UnityEditor;
#endif
using UnityEngine;

[ExecuteAlways]
public class UI_NotchAdapter : MonoBehaviour
{
    public enum AdapterType
    {
        ePosY_Minus_AdaptY,
        eOffsetMaxY_Minus_AdaptY,
        eSizeDeltaY_Set_AdaptY,
        eSizeDeltaY_Minus_AdaptY,
    }

    [System.Serializable]
    public class UI_NA_Data
    {
        [LabelText("需要适配的UI对象")]
        public RectTransform mRectTransform_;
        [LabelText("适配方式")]
        public AdapterType mAdapterType_;
    }
    [ListDrawerSettings(ShowIndexLabels = true, Expanded = true), LabelText("屏幕适配数据"), ShowInInspector]
    public List<UI_NA_Data> mAdaptDatas_ = new List<UI_NA_Data>();

    private void Awake()
    {
    }

    private void OnDestroy()
    {

    }


 
    void DoAdapterLogic(bool preview = false)
    {
        if (mAdaptDatas_ != null)
        {
            for (var i = 0; i < mAdaptDatas_.Count; ++i)
            {
                var data = mAdaptDatas_[i];
                if (data != null)
                {
                    GameManager gm = null;
                    if (!preview)
                        gm = GameManager.Instance;
                    switch (data.mAdapterType_)
                    {
                        case AdapterType.ePosY_Minus_AdaptY:
                            {
                                if (data.mRectTransform_ != null)
                                {
                                    var mPos = data.mRectTransform_.transform.localPosition;               
                                    data.mRectTransform_.transform.localPosition = new Vector3(mPos.x, mPos.y - gm.MNotchAdaptY_, mPos.z);
                                }
                            }
                            break;
                        case AdapterType.eSizeDeltaY_Minus_AdaptY:
                            {
                                if (data.mRectTransform_ != null)
                                {
                                    var rSize = data.mRectTransform_.sizeDelta;
                                        data.mRectTransform_.sizeDelta = new Vector2(rSize.x, rSize.y - gm.MNotchAdaptY_);

                                }
                            }
                            break;
                        case AdapterType.eSizeDeltaY_Set_AdaptY:
                            {
                                if (data.mRectTransform_ != null)
                                {
                                    var rSize = data.mRectTransform_.sizeDelta;
                                        data.mRectTransform_.sizeDelta = new Vector2(rSize.x, gm.MNotchAdaptY_);

                                }
                            }
                            break;
                        case AdapterType.eOffsetMaxY_Minus_AdaptY:
                            {
                                if (data.mRectTransform_ != null)
                                {
                                    var rectTop = data.mRectTransform_.offsetMax.y;
                                    var rectRight = data.mRectTransform_.offsetMax.x;
                                        data.mRectTransform_.offsetMax = new Vector2(rectRight, rectTop - gm.MNotchAdaptY_);

                                }
                            }
                            break;
                    }
                }
            }
        }
    }
    // Start is called before the first frame update
    void Start()
    {
        if (Application.isPlaying)
        {
             DoAdapterLogic();
        }
    }
}

将该代码挂到需要调整的适配的ui上,需要注意的是gm.MNotchAdaptY_是刘海屏的高度,需要自己设置更换。
使用如下:在这里插入图片描述
拖动对应的对象,选好适配方式即可

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值