Unity 在编辑器下模拟刘海屏显示

原因

在实现支持刘海屏时,为了可以方便在编辑器下直观查看效果,也方便其他人员进行调整,需要可以在编辑器模拟显示刘海屏。

原理

模拟显示刘海屏黑边,那么就得在左右两侧动态添加两个黑色图片,来模仿刘海屏。

代码

了防止分辨率小于刘海屏的也开启模拟,所以添加分辨率比判断,小于一定比例不是刘海屏。

/// <summary>
/// 开启模拟
/// </summary>
public static void OpenSimulate()
{
    if (UIManager.Instance == null)
    {
        return;
    }

    s_Height = 80;
    var tf = UIManager.Instance.gameObject.GetComponent<RectTransform>();
    if (tf == null)
    {
        return;
    }

    var pixelWidth = UIManager.Instance.uiCamera.pixelWidth;
    var pixelHeight = UIManager.Instance.uiCamera.pixelHeight;
    if (pixelWidth * 1f / pixelHeight < 2.1f)
    {
        // 说明不是刘海屏,强制改变分辨率
#if UNITY_EDITOR
        UnityEditor.EditorUtility.DisplayDialog("刘海屏测试", "Game 视图分辨率不是刘海屏比例比 2.1 至少!", "手动修改");
        return;
#endif
    }
    s_Height = s_Height / (pixelWidth / tf.sizeDelta.x);

    CreateSimulateUI();
}

private static void CreateSimulateUI()
{
    string canvasName = "UISimulateNotch";
    if (GameObject.Find(canvasName))
    {
        return;
    }

    var root = new GameObject(canvasName);
    Object.DontDestroyOnLoad(root);
    Canvas canvas = root.AddComponent<Canvas>();
    canvas.renderMode = RenderMode.ScreenSpaceOverlay;
    var scaler = root.AddComponent<CanvasScaler>();
    scaler.uiScaleMode = CanvasScaler.ScaleMode.ConstantPixelSize;

    GameObject child = new GameObject("Notch");
    Image img = child.AddComponent<Image>();
    img.color = Color.black;
    RectTransform rectTransform = child.transform as RectTransform;
    rectTransform.SetParent(root.transform, false);
    rectTransform.anchoredPosition = Vector2.zero;
    rectTransform.sizeDelta = new Vector2(80f, 324f);
    rectTransform.anchorMin = new Vector2(0, 0.5f);
    rectTransform.anchorMax = rectTransform.anchorMin;
    rectTransform.pivot = rectTransform.anchorMin;

    GameObject child2 = GameObject.Instantiate(child);
    rectTransform = child2.transform as RectTransform;
    rectTransform.SetParent(root.transform, false);
    rectTransform.anchoredPosition = Vector2.zero;
    rectTransform.anchorMin = new Vector2(1, 0.5f);
    rectTransform.anchorMax = rectTransform.anchorMin;
    rectTransform.pivot = rectTransform.anchorMin;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值