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
相关产品推荐
相关产品推荐

