アスペクト比を測ったら、ゲームが壊れる条件が見つかった
『Moji Survivor』の画面比率を見た目の設定だと思っていたら、遊びやすさの話でした。実測したら、特定の比率でアリーナが画面外に出る不具合まで出てきた記録です。
『Moji Survivor』を作りながら、UnityのGameビューを16:9のまま進めていました。深く考えずに選んだ設定です。
ところが表示設定を切り替えたとき、UIの位置が変わることに気づきました。調べていくと見た目の話ではなく遊びやすさの話で、最後には不具合が1つ出てきました。
画面に映る範囲が、そのまま難易度になる
このゲームは四方から敵が湧いて、それを自動攻撃で捌いていく形式です。ここで効いてくるのが、画面にどれだけ映るかです。
映る範囲が広いほど、敵の接近に早く気づけます。身構える時間が増えるぶん、単純に有利になります。つまり画面比率が違うと、同じゲームでも難しさが変わります。
見た目の好みの問題だと思っていたので、ここは意外でした。
縦が固定で、横だけが伸びる
2Dの正射影カメラで大きさを決めるのはorthographicSizeですが、これは画面の縦半分の大きさです。横幅を直接指定する項目はありません。
横に映る幅 = orthographicSize × アスペクト比 × 2
このゲームはorthographicSizeが5.2なので、縦に映る範囲はどの環境でも10.40で固定です。変わるのは横だけになります。
- 16:9では18.49×10.40
- 16:10では16.64×10.40
表示を切り替えてもワールドが動いていないように見えたのは、これが理由でした。プレイヤーもアリーナも画面中央にあるので、縦が変わらなければ動いて見えません。動いていたのはUIだけです。
測ったら、思っていた原因は外れていた
当初は「16:9とFull HDで表示が変わる」と思っていました。診断用のスクリプトを書いて実測したところ、これは間違いでした。
- 16:9 Aspectは1493×840で、比は1.77738
- Full HDは1920×1080で、比は1.77778
どちらもほぼ正確な16:9です。Canvas Scalerの拡大率は幅の比と高さの比を補間して決まるので、比が一致していればMatchをどこへ動かしても結果は変わりません。実測でも、移動量は0.02ピクセルと0.00ピクセルでした。
犯人はFree Aspectでした。Gameビューの初期状態で、実測すると1669×840、比は1.987です。ここを起点に切り替えていたので、UIが動いていました。この比ではMatchを端まで振るとUIが9.15ピクセル動き、大きさも10.5%変わります。
副産物のほうが重大だった
カメラの可視半幅とアリーナの広さを突き合わせて、こうなりました。
- アリーナの端はx = ±8.5
- 可視半幅は
orthographicSize×アスペクト比なので、5.2×比 - したがって比が8.5÷5.2 = 1.635を下回ると、アリーナの端が画面外に出る
16:10は1.600です。可視半幅は8.32しかなく、アリーナの端が見えません。敵は±9.0から湧くので、見えない場所に自分と敵がいる状態になります。
そしてSteam Deckの画面は1280×800、つまり16:10です。ブラウザで配信すれば窓の比は任意になります。16:9で開発しているかぎり一度も起きないので、測らなければ配信するまで気づけませんでした。