Unity SetResolution之后无法获取真实屏幕宽高

1,758 阅读1分钟

原因

在安卓机上根据画质去调整分辨率来提高帧率,通过设置【Screen.SetResolution(width, height, true);】方式,但是,发现这种手动设置分辨率后,再通过【Screen Width】去获取屏幕宽度的话,都是手动设置后的值。导致安卓手机分屏模式下,调整尺寸后,也无法获取调整后的屏幕宽高,造成画面进行拉伸。

解决

既然Unity没有接口可以获取到变化后的窗体尺寸,那么就从Java层入手。手机状态的改变,当横竖屏切换,屏幕尺寸变化,弹出键盘,系统设置改变等条件,就会触发回调事件onConfigurationChanged,然后我们自己来通知C#层,将获取到的密度无关像素尺寸跟DPI进行计算成像素,最终根据这个宽高来重设分辨率。

java层

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        UnityPlayer.UnitySendMessage("SdkManager", "OnScreenDpChanged", newConfig.screenWidthDp +"x" + newConfig.screenHeightDp);
    }

c#层

     public void OnScreenDpChanged(string screenDpStr)
     {
         LogModule.LogDebug(LogScenario.DevicesInfo, "OnScreenDpChanged {0}", screenDpStr);
         if (!string.IsNullOrEmpty(screenDpStr))
         {
             CheckScreenDpChanged(screenDpStr, false);
         }
     }

     /// <summary>
     /// 检查物理分辨率是否变化
     /// </summary>
     public void CheckScreenDpChanged(string screenDpStr, bool isPixel)
     {
         if (m_ScreenDp == screenDpStr)
         {
             return;
         }

         try
         {
             m_ScreenDp = screenDpStr;
             string[] res = screenDpStr.Split('x');
             int width = int.Parse(res[0]);
             int height = int.Parse(res[1]);

             // 如果是像素,就不需要跟DPI进行计算
             if (!isPixel)
             {
                 float dpi = Screen.dpi;
                 width = Mathf.FloorToInt(dpi / 160 * width);
                 height = Mathf.FloorToInt(dpi / 160 * height);
             }

             if (m_Width != width || m_Height != height)
             {
                 m_Width = width;
                 m_Height = height;
                 SetResolution(m_Config);
             }
         }
         catch (Exception)
         {
             // ignored
         }
     }