mcpField
R
responsive-ui

responsive-ui

github.com/jame581デザイン・UI889203 回インストール5 日前に更新
リポジトリ

responsive-ui について

Godot 4.3+ 開発者向けのレスポンシブ UI スキルです。解像度やストレッチ設定、自動調整レイアウト、モバイル対応、複数画面サイズでのテストを扱います。

主な機能

  1. 01ビューポートとストレッチの設定
  2. 02アスペクト比の適応方式の選択
  3. 03ピクセルアートと DPI スケーリング
  4. 04モバイルのセーフエリアと入力への対応
  5. 05複数の解像度でのテスト

活用シーン

  1. 01異なる画面比率に HUD を適応
  2. 02ピクセルアートに整数スケーリングを適用
  3. 03ノッチや仮想キーボードへの対応
  4. 04複数解像度のスモークテスト

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jame581/godotprompter --skill responsive-ui

インストール後、Claude Code で/responsive-uiを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
adaptive-layouts.md
dpi-scaling.md
mobile.md
pixel-art-setup.md

詳細

Godot 4.3+ のレスポンシブ UI

すべての例は、非推奨 API を使用せずに Godot 4.3+ を対象としています。まず GDScript、次に C# を示します。

関連スキル: Control ノードのレイアウトとテーマについては godot-ui、プラットフォーム固有のエクスポート設定については export-pipeline、初期プロジェクトの解像度設定については godot-project-setup、タッチ入力とデスクトップ入力の適応については input-handling、ロケールごとのレイアウト調整については localization、セーフエリアとノッチへの対応については mobile-development を参照してください。


1. 解像度のプロジェクト設定

Project > Project Settings > Display > Window で、基準解像度とストレッチの動作を設定します。

主な設定と、project.godot の [display] セクションにおけるキーは次のとおりです。

設定project.godot のキー推奨値
ビューポートの幅window/size/viewport_width1920(または基準となるデザイン幅)
ビューポートの高さwindow/size/viewport_height1080(または基準となるデザインの高さ)
ストレッチモードwindow/stretch/modecanvas_items(ほとんどのゲーム)
ストレッチのアスペクト比window/stretch/aspectexpand(画面全体に表示)または keep(レターボックス表示)
スケール係数window/stretch/scale1
スケールモードwindow/stretch/scale_modefractional。ピクセルアートには integer

Godot 4.7+: Godot 4.7 で新規作成されたプロジェクトでは、display/window/stretch/mode のデフォルトが canvas_items、display/window/stretch/aspect のデフォルトが expand になっています(以前は disabled/keep)。つまり、上記の推奨値が初期設定になりました。以前のバージョンで作成されたプロジェクトには変更がなく、プロパティのデフォルト値は引き続き disabled です。そのため、アップグレード時には両方を明示的に設定してください。4.7 移行ガイドを参照してください。

エンジンは起動時にこれらの設定を一度だけ読み込みます。後から ProjectSettings.set_setting() で変更しても反映されません。実行時には、代わりに対応する Window プロパティを設定してください。

GDScript:

# Read current viewport size
var viewport_size: Vector2 = get_viewport().get_visible_rect().size

# Change stretch mode at runtime (takes effect immediately)
get_window().content_scale_mode = Window.CONTENT_SCALE_MODE_CANVAS_ITEMS

C#:

// Read current viewport size
Vector2 viewportSize = GetViewport().GetVisibleRect().Size;

// Change stretch mode at runtime (takes effect immediately)
GetWindow().ContentScaleMode = Window.ContentScaleModeEnum.CanvasItems;

2. ストレッチモードの比較

モードproject.godot の値描画最適な用途
canvas_items"canvas_items"ウィンドウの解像度で描画されます。2D ノードと UI はデザイン解像度からスケーリングされるため、テキストが鮮明に保たれますほとんどの 2D ゲームおよび UI 中心のゲーム
viewport"viewport"ビューポート全体がデザイン解像度で描画され、ストレッチされます。サブピクセルブレンディングは発生しませんピクセル単位で正確な出力が必要なピクセルアートゲーム
disabled"disabled"自動スケーリングは行われません。ビューポートはウィンドウサイズになるため、ウィンドウを大きくすると、同じピクセルサイズのまま表示範囲が広がります(アンカーとコンテナによるレイアウトは引き続き適用されます)複雑なカスタムスケーリング、Control の HUD を備えた 3D ゲーム

各モードの選び方:

  • canvas_items — デフォルトの推奨設定です。あらゆる解像度で滑らかにスケーリングされます。Control ノードとアンカーで構築された UI は自然に対応します。content_scale_factor と組み合わせると、高 DPI でもテキストとアイコンが鮮明に保たれます。
  • viewport — 描画をデザイン解像度に固定します。整数スケーリングとニアレストネイバー補間を組み合わせることで、クラシックなピクセルパーフェクト表示を実現できます。意図的に粗いピクセルにしたい場合を除き、高 DPI ディスプレイでの使用は避けてください。
  • disabled — 完全な手動制御が必要な場合に使用します。たとえば、Godot によるスケーリングを行わずに、セーフエリアや特殊なアスペクト比に UI を適応させる必要がある 3D ゲームなどです。

3. アスペクト比の処理

Project > Project Settings > Display > Window > Stretch > Aspect または window/stretch/aspect キーで設定します。

モード表示結果用途
keepレターボックス(上下に黒帯)またはピラーボックス(左右に帯) — 設計時の領域が正確に維持されますクロップしてはならない固定レイアウトのゲーム(例:スコア制のアーケードゲーム、パズル)
expand画面全体に表示され、横長または縦長のディスプレイではゲームの表示領域が広がりますアクションゲーム、プラットフォーマー — プレイ領域が広く表示されるのは問題ではなく、むしろ利点です
keep_width幅が固定され、縦長の画面(モバイルのポートレート表示)では高さが広がります横方向の配置を厳密に保つ縦向きモバイルゲーム
keep_height高さが固定され、横長の画面では幅が広がります縦方向の配置を厳密に保つ横向きゲーム(例:横スクロールゲームの HUD)

アダプティブ UI を使った expand は、デスクトップとモバイルの両方を対象とするゲームに最も汎用性の高い選択肢です。HUD 要素を画面の端にアンカーして、拡張された表示領域に追従するようにします。


4. ピクセルアートの設定

鮮明なピクセルアートゲームにするには、Project Settings → Display → Window → Stretch → Mode = viewport を設定し、ベース解像度をネイティブのピクセルサイズ(例:320×180)にします。テスト時にウィンドウを大きくするには、Window Width/Height Override(例:1280×720)を設定します。不均一なピクセルを避けるには、整数スケーリング(Stretch → Scale Mode = integer)を使用します。

プロジェクト設定、整数スケーリングスクリプト、ニアレストネイバー補間のフィルターオーバーライドについては、references/pixel-art-setup.md を参照してください。


5. DPI スケーリング

Retina/高 DPI ディスプレイでは、content_scale_factor を設定して UI 全体を比例的に拡大縮小します。実行時に DisplayServer.screen_get_dpi() を照会すると、デバイスごとにスケーリングを調整できます。

content_scale_factor の設定方法と DPI の照会パターンについては、references/dpi-scaling.md を参照してください。


6. モバイルでの考慮事項

モバイル特有の考慮事項は 4 つあります。タッチ入力(タップ、スワイプ、マルチタッチ)、セーフエリアのインセット(ノッチ/ダイナミックアイランドを避ける)、画面の向きの固定(縦向き/横向きの固定)、仮想キーボード(UI が隠れないように表示/非表示を処理すること)です。

各項目の GDScript 全文と、iOS/Android 固有の注意点については、references/mobile.md を参照してください。


7. アダプティブレイアウト

アンカープリセットとコンテナーノードで、ほとんどの処理を行えます。size_flags_horizontal/vertical(FILL、EXPAND、SHRINK_CENTER、SHRINK_END)を使って、子要素がコンテナーのスペースをどのように使用するかを制御します。実行時の解像度変更は get_viewport().size_changed で検出できます。

アンカーとコンテナーを組み合わせた方法、解像度変更の検出、size_flags の全リファレンスについては、references/adaptive-layouts.md を参照してください。


8. 複数の解像度でのテスト

エディターのプレビューサイズ

エディターのビューポートでは、Editor > Editor Settings > Run > Window Placement を使って、特定のサイズでゲームを起動できます。または、2D エディターのツールバーにあるビューポートサイズセレクターを使います。

Project > Project Settings > Display > Window > Size > Window Width/Height Override でテスト用のウィンドウサイズを設定します。ベースのビューポートサイズはそのままに、ゲームウィンドウがそのサイズで開きます。

--resolution CLI フラグ

コマンドラインから解像度を指定して起動します。

# Windows
godot.exe --path "C:/projects/mygame" --resolution 1280x720

# Linux / macOS
godot --path /projects/mygame --resolution 1280x720

# Run an exported binary at a specific size
./mygame.x86_64 --resolution 375x812
一般的なテスト解像度
解像度アスペクト比一般的な用途
1920×108016:9標準的な1080pのデスクトップ/テレビ
2560×144016:91440pの高DPIデスクトップ
1280×72016:9ローエンドのデスクトップ/最低目標
640×36016:9ピクセルアートの基準解像度(320×180の2倍)
2732×20484:3iPad Pro — 16:9以外のアスペクト比をテスト
390×844~19.5:9iPhone 14の縦向き
844×390~19.5:9iPhone 14の横向き
1080×240020:9Androidの縦長ポートレート
360×800~20:9Androidローエンド端末の縦向き

戦略: 常に基準デザイン解像度、16:9より横幅が広い解像度(例:21:9のウルトラワイド)、そして縦幅が長い解像度(例:モバイルの縦向き)でテストします。この3つのケースで、レイアウトの不具合の大半を検出できます。


9. チェックリスト

  • 基準ビューポートサイズ(viewport_width/viewport_height)がエディターのデザインキャンバスと一致している
  • ストレッチモードを意図的に選択している:ほとんどのゲームではcanvas_items、ピクセルアートではviewport
  • アスペクト比モードを選択している:固定レイアウトのコンテンツでkeepが必要な場合を除き、expand
  • ピクセルアートゲームでは、viewportストレッチ+Nearestテクスチャフィルター+integerストレッチスケールモードを使用している
  • すべてのHUD Controlノードで、固定のposition値ではなく、最も近い端にアンカーを設定している
  • ボタンや操作可能な要素にcustom_minimum_sizeを設定し、タップ対象のサイズを下回って縮小しないようにしている(モバイルでは最低44×44 pxを推奨)
  • スペースを埋める要素のsize_flags_horizontal/size_flags_verticalをSIZE_EXPAND_FILLに設定している
  • ウィンドウのサイズ変更にレイアウトを対応させる必要がある箇所で、get_viewport().size_changedシグナルを接続している
  • DisplayServer.get_display_safe_area()からセーフエリアのインセットを取得し、ルートのMarginContainerに適用している
  • 高DPI/Retinaディスプレイ向けに、起動時にDisplayServer.screen_get_dpi()を基にcontent_scale_factorを設定している
  • タッチ入力はマウスイベントだけでなく、InputEventScreenTouch/InputEventScreenDragで処理している
  • 画面の向きを正しいモード(SCREEN_LANDSCAPE/SCREEN_PORTRAIT)にロックしている。回転させる場合はSCREEN_SENSORを使用している
  • モバイルでは、仮想キーボードの表示後に高さを取得し、UIコンテンツを上に移動させている
  • 最低限、デザイン解像度、ウルトラワイド(21:9)1つ、モバイルの縦向き解像度1つでテストしている
  • 複数解像度でのスモークテストを自動化するため、CIまたはプレイテストのスクリプトで--resolutionフラグを使用している

コメント