You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何获取Android设备的刘海尺寸?

解决Unity Android设备关闭「Render outside of safe area」后获取刘海尺寸的问题

当你关闭Unity Player Settings里的「Render outside of safe area」时,Unity会自动将整个游戏的渲染区域限制在安全区内,这时候Screen.height就等于Screen.safeArea.height,自然没法通过原来的差值法算出刘海高度了。我之前也遇到过类似的情况,这里有两个靠谱的方案可以解决你的问题:

方案一:直接调用Android原生API获取刘海参数

Unity的safeArea虽然被调整了,但Android系统本身的刘海信息还是可以通过原生API拿到。你不需要额外写Android插件,直接用C#调用原生方法即可,代码示例如下:

public static float GetNotchHeight()
{
    float notchHeight = 0f;
    #if UNITY_ANDROID && !UNITY_EDITOR
        // 检查Android版本,DisplayCutout仅支持API28及以上
        if (AndroidJNI.CallStaticInt("android.os.Build$VERSION", "SDK_INT") >= 28)
        {
            AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaObject window = currentActivity.Call<AndroidJavaObject>("getWindow");
            AndroidJavaObject windowInsets = window.Call<AndroidJavaObject>("getDecorView").Call<AndroidJavaObject>("getRootWindowInsets");
            
            if (windowInsets != null)
            {
                AndroidJavaObject displayCutout = windowInsets.Call<AndroidJavaObject>("getDisplayCutout");
                if (displayCutout != null)
                {
                    AndroidJavaObject boundingRects = displayCutout.Call<AndroidJavaObject>("getBoundingRects");
                    if (boundingRects != null && boundingRects.Call<int>("size") > 0)
                    {
                        // 获取顶部刘海的边界矩形
                        AndroidJavaObject rect = boundingRects.Call<AndroidJavaObject>("get", 0);
                        int top = rect.Call<int>("top");
                        int bottom = rect.Call<int>("bottom");
                        notchHeight = bottom - top;
                    }
                }
            }
        }
    #endif
    return notchHeight;
}

注意:这个方法能准确获取所有方向的刘海尺寸,适合需要兼容特殊设备(比如带底部刘海的折叠屏)的场景,但仅支持Android 9.0及以上版本。

方案二:利用Unity Display类获取原始屏幕尺寸

如果你的应用只需要处理顶部刘海,这个方法更简单:Display.main.systemHeight是设备的原始物理屏幕高度(包含刘海、状态栏),而Screen.height是Unity当前渲染区域的高度(也就是safeArea高度),两者的差值就是顶部刘海的高度。

public static float GetNotchHeightAlternative()
{
    float notchHeight = 0f;
    #if UNITY_ANDROID && !UNITY_EDITOR
        float originalScreenHeight = Display.main.systemHeight;
        float safeAreaHeight = Screen.height;
        // 差值即为顶部刘海高度(默认底部无刘海)
        notchHeight = originalScreenHeight - safeAreaHeight;
    #endif
    return notchHeight;
}

后续调整提示

拿到刘海高度后,你只需要把地图的Y轴起始位置设置为notchHeight,就能让地图从安全区左上角开始渲染,完美避开刘海区域了。

内容的提问来源于stack exchange,提问作者ARtyom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:07:56