prawaki
記事一覧へ戻る

開発日誌

アスペクト比を測ったら、ゲームが壊れる条件が見つかった

『Moji Survivor』の画面比率を見た目の設定だと思っていたら、遊びやすさの話でした。実測したら、特定の比率でアリーナが画面外に出る不具合まで出てきた記録です。

  • ゲーム開発
  • Unity
  • 個人開発

『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で開発しているかぎり一度も起きないので、測らなければ配信するまで気づけませんでした。