UnityのScreen.safeAreaを使うとRectTransFormのAnchorがずれてしまう問題
UnityにはiPhoneXに対応するためにScreen.safeAreaという機能があるのだけれど、これを使ってみたところ、iPhoneX以外の端末でuguiの表示サイズがおかしくなる問題が多発した。
Screen.safeAreaはiPhoneX以外の端末ではスクリーンのサイズを返すのだけれど、uguiの Reference Resolution などを使ってアプリ内部の解像度設定を変えていると、そちらの数値を取得してしまい、端末のディスプレイサイズとの間に齟齬が生じるらしい。
そのずれを抱えたまま、safeArea向けにguiのRectTransFormのAnchorの位置を設定すると、guiの表示位置もまたずれて表示されてしまう、という問題が発生する。
この影響で、ユーザーから画面が左下に寄り、縮小されて表示されている、という不具合報告が多数届いた。
あるいは逆に、拡大されすぎてアプリの一部分しか表示されていなかったりした。
ちゃんと実機でテストしなかったのが悪いのだけれど、この現象はシミュレーターでは確認できなかったので注意が必要だと思う。
色々と試したが、結局はScreen.safeAreaを使った処理はiPhoneXでしか動作しないようにしたところ、この問題が解決した。
具体的には、
//ディスプレイのサイズを取得
var display = Display.displays[0];
var screenSize = new Vector2Int(display.systemWidth, display.systemHeight);
//iPhoneXのディスプレイサイズでのみ動作する条件を設定
if(screenSize.x == 1125 && screenSize.y == 2436 || screenSize.x == 2436 && screenSize.y == 1125){
//以下にsafeAreaに関する処理を記述
}
上記のように、iPhoneXのディスプレイサイズでのみ動作するように条件を付けた。
今後、同じサイズでiPhoneXタイプでない端末が出たらやっかいだけど、いまのところはこれで問題ないようだ。
もしかしたらそのうちAndroidで同サイズの端末が出るかもしれないので、iOSでしか動かないように、さらに条件を加えておいてもいいかもしれない。
iOS.DeviceGeneration.iPhoneXで見分けることもできるらしいのだけど、DeviceGenerationはしばしば認識しそこなって、unknownを返すことがあるそうなので、使用はやめておいた。
AWS Device Farmを使ってみた
実機のテストにはAWS Device Farmを使用した。
テスト時間が1000分までは無料で、さらにテスト中の動画が見れるので、ちゃんと表示ができているか確認できて助かった。
無料分が切れると1分17セント(19円くらい)になるらしい。
このくらいの価格なら、実機を揃えるよりはるかに手軽だし、今後も使っていくことになりそうだ。
iPhoneX対応はめんどうなことになりそうな予感がしていたのでサボっていたのだけれど、対応してみたら案の定、トラブルが発生した。
もしかしたら1年限りでXタイプは消えるんじゃないかと思っていたこともあって、対応を伸ばし伸ばしにしていたのだけど、どうやら今年はXタイプが3機種も出るらしい。
なので観念して対応したが、今後もトラブルの原因になりそうで、不安を感じている。