ドット絵調ゲームのベスト解像度は?

解像度とアスペクト比

レトロゲームのアスペクト比は1:1の正方形!?

  • ファミコン:256×240(内部比率 16:15)
  • スーパーファミコン:256×224(内部比率 16:14)

スーパーファミコンのほうが縦解像度が少ない点が気になるが、これは表示領域(オーバースキャン領域)との関係によるものである。
横解像度はどちらも256ドットで共通しており、設計思想としてはほぼ同系統である。

アスペクト比については、内部解像度だけを見ると16:15や16:14と正方形に近い比率になる。しかし、当時の表示装置は4:3のブラウン管テレビである。

ブラウン管では、ゲームの256ドット幅はそのまま表示されるのではなく、4:3の画面いっぱいに引き伸ばされる。そのため、実際の表示では横方向に約1.25倍程度拡大されて表示されていた。

つまり、当時のゲームは「4:3で横に引き伸ばされる前提」で設計されている。
現在の正方形ピクセルのディスプレイで256×240をそのまま表示すると、1つ目の画像のように、横方向がやや詰まって見えることになる。

アスペクト比は4:3としたら解像度は?

レトロゲームを完全再現したいわけではないので、この辺の仕様差は深追いせず、
レトロゲーム的な横解像度(256ドット)を基準に考えると、

  • 256×192(4:3)

となり、Y方向を48ドット分削ることになる。
縦240を基準に4:3へ合わせると、

  • 320×240(4:3)

となり、横方向が256より広くなる。

ファミコンなどの背景画像(256幅前提)をそのまま使う場合は、256基準で設計しないとトリミングが発生する。
背景を新規制作するのであれば、どちらの解像度設計でも問題はない。

DTDの解像度とアスペクト比

ファミコンのアスペクト比には合せない

まず初めに、アスペクト比を決めるところからスタートしよう。ファミコンと同じ4:3だとタワーディフェンス型のゲームは横幅が足りず、更に、DTDでは画面中央にタイピングに関する画面を表示するので、そのエリアも確保したい。そうなると多くのPCが採用している16:9のアスペクト比が良いように思う。

スーパーファミコンの解像度256×224(内部比率 16:14)から16:9に変更する。

縦の224を基準にすると

  • 398.2222×224

横の256を基準にすると

  • 256×144

もし昔のTVが4:3ではなく16:9だったら、ファミコンの解像度は256×144になっていたかな?
16×16のマップチップで考えると、横16、縦9という数になる。

アスペクト比16:9での最適解像度は?

横16個だと少ないので、倍の32個にしたい。そうなると解像度は512×288だ。この解像度の整数倍は

  • 256×144(1倍)16×9
  • 512×288(2倍)32×18
  • 1024×576(4倍)64×36
  • 1536×864(6倍)96×54
  • 2048×1152(8倍)128×72

となってしまい、よくある画面解像度と異なってしまう。
よくある画面解像度は次のとおりだ。

  • 320×180(1倍)20×11と余り
  • 640×360(2倍)40×22と余り
  • 1280×720(4倍)80×45
  • 1366×768(例外)85と余りx48
  • 1920×1080(6倍)120×67と余り
  • 2560×1440(8倍)160×90

16×16のマップチップとの相性が悪い。そこで、マップチップが欠けないように16の倍数を優先し、余る分を余白(+XX) とすると、次のようになる。

  • 320×176(+4)(1倍)20×11
  • 640×352(+8)(2倍)40×22
  • 1280×704(+16)(4倍)80×44
  • 1280(+86)x704(+64)(4倍)80×44
  • 1920×1056(+24)(6倍)120×66
  • 2560×1408(+32)(8倍)160×88

16:9の解像度に近い16の倍数の仮想解像度が得られる。

ということでDTDのアスペクト比は16:9(内余白あり)とし、解像度はマップチップの数的にもちょうど良さそうな640×352(+8)に決めた。

結論

仮想解像度は 640x352 とし、上下 8px(上、下それぞれ 4px ずつ)を余白として扱う。実行時は各解像度に整数倍で拡大し、余った部分は黒帯(余白)として描画しない。

画面解像度が 1366x768 のユーザーは、2倍に拡大され、左右は 43px ずつ、上下は 32px ずつ黒帯が表示される。

Unityのカメラ周りの設定

Main Camera に Pixel Perfect Camera を追加すること

カメラ

Main Camera (Pixel Perfect Camera)

  • Reference Resolution640 x 352
  • Assets Pixels Per Unit16
  • Upscale Render TextureON(ドットの歪み防止に推奨)
  • Pixel SnappingON
  • Crop FrameXYON(黒帯を出すため)
  • Stretch FillOFF

キャンバス

Canvas (UI)

  • Render ModeScreen Space - Camera
  • Pixel PerfectON
  • Render CameraMain Camera をアサイン

Canvas Scaler

  • UI Scale ModeConstant Pixel Size(スクリプトにより自動制御)
  • Reference Pixels Per Unit16

Pixel Perfect Canvas Scaler Sync(自作Script)

  • Canvas Scaler:自分自身のコンポーネントをアサイン
  • Reference Width640
  • Reference Height352

パネル

キャンバスの下に1つ仮のパネルを配置して、その下にUIを組み立てる。画面サイズが変わって「黒帯」が出たときも、UIが常にゲーム画面内に収まるようにする。

Rect Transform

  • Width640
  • Height352
  • 揃えCenter, Middle

スプライト

スプライトのインポート設定

  • Texture TypeSprite (2D and UI)
  • Filter ModePoint (no filter)
  • CompressionNone
  • Pixels Per Unit16 または 8
    • 基本 (16bit風)16
    • 粗め (8bit風)8(16基準より2倍大きく表示される)

Asepriteファイル(.aseprite)を直接使用する場合
ファイルを右クリック > Properties から Pixels Per Unit を設定可能です。Compression 等はインポーターが自動的に None として扱ってくれます。

Image(シーン配置時)

  • Native Size:スプライトを割り当てた後、Set Native Size ボタンをクリックして、PPUに基づいた正しい比率(1ピクセル=1ドット)を維持すること。

コメントする