本文へスキップ

ゲームUIスケールプレビュー · 解像度・アンカー・セーフエリア

パネルやボタンを、実際に描かれる場所で確認。目標の解像度と画面比の仮想画面にアンカープリセットで配置し、非整数スケール版と並べて見ます。

プレビューはパネルやボタンを1280 × 720から3840 × 2160までの仮想画面(4:3・16:9・16:10・21:9)に描き、Godot式のアンカーで配置し、90%のタイトルセーフや93%・95%のアクションセーフを重ね、1×・1.25×・1.5×・1.75×・2×・2.5×・3×で表示します。整数倍はピクセルアートをくっきり保ち、非整数倍はぼかします。同じチェックステージで韓国語・英語・日本語のラベルが枠に収まるかを測り、WCAGのコントラスト比(黒地に白で21:1)を計算します。ブラウザ内の計算で、エンジンのレイアウト処理ではありません。

UIパネル・ボタン・グリフシート・UIシート(PNG)をドロップ
UIラボを開く
ブラウザ内で処理し、ファイルはアップロードされません。
UIラボ:ナインスライスのガイドと複数サイズのプレビューがあるCC0のUIパネル
CC0アセット(Kenney)を開いた実際のUIラボ画面です。
出力
  • Nine-slice測定確認· Pillow
  • Bitmap font測定確認· independent .fnt parser
  • Button states測定確認· Pillow
  • Engine import未検証

スケール・セーフエリア・コントラストを数値で

整数倍では元の1ピクセルが画面ピクセルのかたまり1つになります。2×では16pxのアイコンが32pxになり、各ピクセルは2 × 2です。1.5×では元の2ピクセルで画面の3ピクセルを覆う必要があるため、最近傍フィルターでは列の幅が1pxと2pxで交互になり、線形フィルターでは隣の色が混ざって縁がぼやけます。プレビューは非整数倍をなめらかに描きます。Godot 4.2以降には倍率を切り捨てる(2.5が2になる)ストレッチのスケールモードIntegerがあり、ドキュメントはピクセルアートのゲームにviewportのストレッチモードと組み合わせて勧めています。

セーフエリアはテレビ由来です。EBU R 95(バージョン1.1、2017年)は重要な動きをすべての端から3.5%、グラフィックを5%内側に置くよう定めており、これがプレビューの描く93%のアクションセーフと90%のタイトルセーフの矩形です。95%のプリセットはよりゆるい追加の選択肢で、R 95の値ではありません。スマートフォンやコンソールは実行時に自分のセーフエリアを返すので(UnityのScreen.safeAreaはピクセル単位、GodotのDisplayServer.get_display_safe_area())、ここではプリセットではなく任意の余白として入力します。

コントラストはWCAG 2.2の式を使います。sRGBの各チャンネルを線形化し、相対輝度L = 0.2126 R + 0.7152 G + 0.0722 Bを求め、明るい色を先にして(L1 + 0.05) ÷ (L2 + 0.05)で比を出します。範囲は1:1から21:1です。達成基準1.4.3はテキストに4.5:1、大きいテキスト(18ポイント、または太字14ポイント。プレビューでは24px・18.66px)に3:1、1.4.6は7:1、1.4.11はUIコンポーネントの視覚的な部分に3:1を求めます。比は2つの単色についての値で、絵の上の文字はピクセルごとに比が変わります。

整数倍
倍率が整数で、元の1ピクセルが画面ピクセルのかたまりをちょうど覆う状態。
タイトルセーフ(グラフィックセーフ)
画面の内側90%。EBU R 95ではすべての辺に5%の余白。
アクションセーフ
画面の内側93%。EBU R 95ではすべての辺に3.5%の余白。
相対輝度
sRGBを線形化したあと0(黒)〜1(白)で表した色の明るさ。コントラスト比に使う。
アンカー
要素を親のどこに固定するかを0〜1の4つの数値(左・上・右・下)で表したもの。

例:チェックステージが計算する数値

以下の値はすべてプレビューと同じ関数で計算しています。

コントラスト  L = 0.2126 R + 0.7152 G + 0.0722 B   (先にsRGBを線形化)
白/黒              (1.00 + 0.05) / (0.00 + 0.05) = 21.0 : 1
#767676 / 白       L = 0.1812 → 1.05 / 0.2312 = 4.54 : 1   4.5:1を0.04差で満たす
白 / #3182f6       L = 0.2327 → 1.05 / 0.2827 = 3.71 : 1   UI 3:1・大きいテキスト:可 · 16pxのテキストAA:不可
セーフ 1920×1080   タイトル90% → x 96, y 54, 1728 × 972   アクション93% → x 67, y 38, 1786 × 1004
アンカー           右下、300 × 80のボタン、余白32px → x = 1920 − 300 − 32 = 1588, y = 1080 − 80 − 32 = 968
スケール           基準640 × 360 → 1920 × 1080はちょうど3×;1366 × 768は2.13× → Integerモードは2×(1280 × 720)で描く

コントラストタブの既定の色は#3182f6の上の白です。大きいラベルやアイコンには十分ですが、16pxの本文には足りません。1920 × 1080ではEBU R 95自身も幅の3.5%を67pxとしており、プレビューの値と同じです。

できること

  • 1280×720〜3840×2160、4:3・16:9・16:10・21:9の画面。Godot 4のアンカー値によるアンカープリセット。
  • セーフエリア:90%タイトルセーフ、93%・95%アクションセーフ(放送の慣例と表示)、任意の余白。
  • 1×〜3×のスケール比較、整数スケールはくっきりと表示。
  • 言語ごとのテキストあふれ(実測幅)とWCAGコントラストの式。

使い方

  1. UI要素をドロップ。
  2. 画面・アンカー・セーフエリアを選ぶ。
  3. スケール・テキストあふれ・コントラストのタブを確認。
  4. それに合わせて絵や配置を調整。

結果の確認

  • スケール比較:2×と3×のピクセルアートは縁が硬いままのはずです。1.5×の結果が許容できなければ、整数刻みか、目標の画面を割り切れる基準解像度を計画してください。
  • サイズタブ:出荷するすべての画面比(21:9を含む)で、要素の矩形がセーフエリアの数値の内側にあるはずです。
  • ローカライズタブ:すべての言語が"fits"(折り返しを許すUIなら"wraps")であるべきです。プレビューはブラウザーのフォントで測るので、ゲームのフォントでもう一度確認してください。
  • コントラストタブ:本文サイズのラベルは4.5:1以上、大きいラベルとアイコンは3:1以上であるべきです。

トラブルシューティング

症状考えられる原因確認方法対処
ピクセルアートのUIが一部のモニターでぼやけるUIが非整数倍(例:1366 × 768で2.13×)と線形フィルターで描かれているスケール比較の1.5×と2×の枠を比べるGodotではviewportのストレッチモード、Integerのスケールモード、Nearestフィルターを使う。Godotでピクセルアートがぼやけるを参照
プレビューでは収まるのにゲームでラベルがあふれるプレビューはブラウザーのフォントで測り、ゲームのフォントは幅が違う同じ文字列をゲームのフォントで測る(フォントステージで作れる)幅に余裕を持たせる、折り返しを許す、または訳を短くする
韓国語・日本語が単語の途中で切れる空白のないテキストは、プレビューの貪欲な改行が1文字単位で切るローカライズタブで行の終わる位置を確認1文字単位の改行を受け入れるか、明示的に改行を入れる。エンジンには独自の改行規則がある
21:9でだけ要素がセーフエリアからはみ出す画面の端にアンカーを付けており、横長の画面でその端が動くセーフエリアを表示して画面比を21:9に切り替えるセーフエリアの余白以上のマージンを付けるか、セーフエリアのコンテナ内にアンカーを付ける
コントラストは合格なのに絵の上のラベルが読みにくい比は2つの単色を比べるもので、文字の後ろの絵は変化している文字の後ろで最も明るいピクセルと最も暗いピクセルを測るラベルの後ろに下地のパネル・アウトライン・影を入れる

ほかの方法

方法こんなときに向いています
エンジンで目標解像度ごとにシーンを実行する実際のレイアウトが必要なとき:コンテナ、サイズフラグ、テーマの余白、エンジン自身の文字描画。
ピクセルパーフェクトチェッカーゲームのスクリーンショットがあり、整数倍で拡大されたかを知りたいとき。

出力ファイルと検証方法

「測定確認」は、ダウンロードしたファイルをページ外(Pillow・numpy・独立したパーサー)で開き直して性質を測ったという意味です。ゲームエンジンでの読み込みは試していません。

書き出し先ファイル検証
Nine-slicenine-slice.json · previews · SETUP.md測定確認 Pillowリサイズした全プレビューで四隅のブロックは拡大されません。Chromiumではバイト一致、Firefoxでは半透明ピクセルがアルファの丸め1段階ぶん変わることがあります。すき間・重なり0。
Bitmap fontfont.png · font.fnt (BMFont text) · font.json測定確認 independent .fnt parserテスト内で別に書いたパーサーで.fntを読み戻し、ヘッダーと全グリフ範囲が一致。
Button statesstates/*.png · strip · states.json測定確認 Pillownormalは元と一致(Chromiumではバイト一致、Firefoxでは半透明ピクセルの色がアルファの丸め1段階以内)。states.jsonの各範囲がストリップから該当状態を正確に切り出します。
Engine importGodot NinePatchRect · Unity Sprite border · BMFont import未検証Godot・Unityでは実行していません。

検証の根拠

ナインスライスの四隅が100×40・300×80・800×200・420×120で拡大されず、同一列12本から境界6·6·6·6を提案。ボタン状態:normalは元と一致、disabledはアルファ128のグレー、focusリングも正確。.fntのグリフ記録がJSONと一致。.poの欠落グリフを正確に列挙。白地に黒文字で21:1を測定。画像はブラウザのCanvasを通ります。Chromiumはバイトがそのまま、Firefoxは半透明ピクセルの色を乗算済みの値で1段階に丸めます(Kenneyのボタンで測定:アルファ63で最大4段階)。アルファと不透明ピクセルはそのままです。

制限

  • エンジンのレイアウト処理ではありません。コンテナ・サイズフラグ・テーマの余白はモデル化せず、アンカーの計算だけです。
  • コンソール・スマートフォンのプリセットはありません。機種ごとのセーフエリアは任意の余白として入れます。
  • テキストの幅はゲームのフォントではなくブラウザーのフォントで測った値です。
  • カーニングペアなし、フォントは1ページ、MSDFなし。SDF出力はベータです。
  • TTFのcmapを解析しないため、欠落グリフのチェックには.fntかラボのフォントが必要です。
  • アトラスは1ページで、接している要素は1つとして扱います。
  • Godot・Unityでの描画は行っていません。エンジン用の値(patch margin、L・B・R・Tの境界)はドキュメント基準で、エンジンでは未検証です。

バージョンと出典

docs/UI-LAB.mdのためにChromiumで測定しました。3840 × 2160のタイトルセーフは192, 108 · 3456 × 1944、余白64pxの左上アンカーは64, 64に置かれ、120pxの枠で英語のラベルはあふれて韓国語の例は収まり、白地に黒はちょうど21:1、#767676/白は4.54:1でした。例の値は同じ関数で計算し直しています。セーフエリアの割合はEBU R 95、コントラストの式はWCAG 2.2、整数のスケールモードはGodot 4.7の公式ドキュメントに基づきます。

参照した公式ドキュメント

よくある質問

エンジンのレイアウト計算ですか?

いいえ。アンカー計算(Unityのプリセットとも共通のGodotの4つのアンカー値)をブラウザで再現したもので、そう表示します。

コンソールのセーフエリアは?

ありません。コンソールやスマホの切り欠きの値は機種ごとに違うため、プリセットにしていません。任意の余白を使ってください。

無料ですか?アカウントは必要ですか?

このページの機能はすべて無料で、アカウントなしで使えます。透かしや制限された書き出しはありません。

スプライトはアップロードされますか?

いいえ。Studioはこのブラウザのタブ内でデコード・パック・書き出しを行います。プロジェクトはブラウザ(IndexedDB)に自動保存され、.nerulioファイルとして保存できます。

Asepriteやエンジンのプラグインは必要ですか?

いいえ。.asepriteファイルはブラウザで読み書きします。エンジン別のバンドルには必要なものが入っています(Godotはインポート設定とシーン、UnityとGodotのタイルセットは小さなエディタースクリプト)。