问题

接入 SDK 后拉起支付宝支付的时候,游戏从横屏画面切换到 SDK 的竖屏画面;这时候点击后退返回,会发现游戏虽然是横屏显示,但是触控区域与显示区域对应不上,经过仔细测试发现触控区域横向缩小了。

环境

  • Unity 5.6.6f2
  • Android 11

解决过程

横竖屏设置

刚开始的时候怀疑是旋转方向被拉起的 SDK 支付页面之类的改动了,导致游戏本身的触控区域错误

1
2
3
4
5
6
7
8
9
@Override
protected void onResume() {
    // 设置为横屏
    if(getRequestedOrientation()!=ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE){
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
    }

    super.onResume();
}

打包测试发现无效

分辨率设置

上网搜索后发现有可能是触控区域的分辨率出问题了,虽然游戏显示为正常的横屏,但是触控区域的表现是竖屏。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
private int width;
private int height;

@Override
protected void onCreate(Bundle paramBundle) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(paramBundle);
    getWindow().takeSurface(null);
    getWindow().setFormat(PixelFormat.RGBX_8888);
    this.mUnityPlayer = new UnityPlayer(this);
    setContentView(this.mUnityPlayer);
    this.mUnityPlayer.requestFocus();
    saveWidthHeight();
}

@Override
protected void onResume() {
    super.onResume();
    setLayoutParams();
    this.mUnityPlayer.resume();
}

private void saveWidthHeight() {
    if (Build.VERSION.SDK_INT >= 26) {
    Display display = getWindowManager().getDefaultDisplay();
    DisplayMetrics dm = new DisplayMetrics();
    display.getRealMetrics(dm);
    width = dm.widthPixels;
    height = dm.heightPixels;
    }
}

private void setLayoutParams() {
    if (Build.VERSION.SDK_INT >= 26) { //android 8.0
        mUnityPlayer.getView().getLayoutParams().width = width;
        mUnityPlayer.getView().getLayoutParams().height = height;
    }
}

会有一个问题,游戏之前未设置适配刘海屏,显示区域未撑满到刘海区域,这样修改后有一部分内容显示到屏幕外,而刘海区域则是空着的。

尝试使用 AndroidManifest.xml 设置刘海属性无效,最后发现只有在代码中设置刘海属性有效。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends UnityPlayerActivity{
    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
        {
            try
            {
                Window window = getWindow();

                //设置页面全屏显示
                WindowManager.LayoutParams lp = window.getAttributes();
                lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
                
                //设置页面延伸到刘海区显示
                window.setAttributes(lp);
            }
            catch (Exception e)
            {
                Log.e("activity", "not support layoutInDisplayCutoutMode!");
            }
        }
        else
        {
            Log.w("activity", "not support layoutInDisplayCutoutMode!");
        }
    }
}