unity 刘海 适配 safeArea取不到值

Unity.safeArea.y 一直是0 安卓的刘海屏,这是为什么

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
Unity的safeArea属性用于获取屏幕的安全区域(包括屏幕边缘的安全区域和刘海屏的安全区域),以便进行UI适配。在安卓的刘海屏上,由于刘海区域被视为安全区域的一部分,因此可以通过safeArea属性来获取刘海屏的安全区域,然后进行UI适配。

Unity的safeArea属性在Unity 2017.2及更高版本中引入,可以在iOS和安卓设备上使用。但是,在某些安卓设备上,可能无法正确获取刘海屏的安全区域,导致safeArea.y始终为0。

这可能是由于安卓设备的不同导致的。有些设备可能没有正确实现safeArea属性,或者在获取安全区域时存在一些限制。您可以尝试使用设备的特定API来获取安全区域,例如DisplayCutout.getSafeInsetTop()方法,该方法返回刘海屏的安全区域顶部的高度。

以下是一个示例代码,用于获取安卓设备上的刘海屏的安全区域:

#if UNITY_ANDROID && !UNITY_EDITOR
using UnityEngine.Android;
#endif

...

Rect safeArea = Screen.safeArea;
#if UNITY_ANDROID && !UNITY_EDITOR
if (Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead))
{
    // 获取 DisplayCutout 对象
    AndroidJavaObject displayCutout = Screen.currentResolution.Call<AndroidJavaObject>("getCutout");

    if (displayCutout != null)
    {
        // 获取刘海屏的安全区域
        int top = displayCutout.Call<int>("getSafeInsetTop");
        safeArea.y += top;
        safeArea.height -= top;
    }
}
#endif

// 在此处使用 safeArea 进行 UI 适配

注意,上述代码需要您的应用程序在AndroidManifest.xml文件中声明读取外部存储的权限(即<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />),并且需要用户在应用程序启动后授予该权限。

希望这些信息能帮助您解决问题。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢