原因
在安卓机上根据画质去调整分辨率来提高帧率,通过设置【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
}
}