gohud

3つの層

← テーマ

プリセットは3つをまとめて束ねたものだ。空のままにした項目はデフォルトに落ちる。

層決めるもの変え方
Theme 色、サイズ、文字の大きさ、そしてエンジンが描くものすべての形 — ボタンのパネル、入力欄、タブ、トグルの絵 .tres を書くか、tools/make_theme.py で生成する
GoSkin コードが描くものすべての形 — スティック、クイックスロットの面、コーチマークのリング、チップ、スケルトン、区切り線、セクション見出し 継承して、気にするメソッドだけを上書きする
GoIconSet 名前で引くアイコン — デフォルトの84枚、あるいはその上に重ねる中世セットの彫刻風16枚。テクスチャパックでもアイコンフォントでもよく、呼び出すコードはどちらでも同じだ セットを丸ごと渡すか、いくつかの名前だけ差し替える
Theme だけでは足りない理由。 StyleBoxFlat が持つ角は丸だけだ — 半径を 0 にすれば直角になるが、その中間は存在しない。斜めに切り落とした角、1辺だけ太い縁、外へにじむ発光。 エンジンはそのどれも描かない。しかもスティックとコーチマークは _draw() の中で描かれており、 テーマはそこへ届かない。

選ぶ

GoUi.use_preset(GoThemePresets.SCIFI_DARK)

この1行でテーマ・スキン・アイコンが入れ替わる。エディタからは プロジェクト設定 → Gohud → Theme → Preset、設定リソースからは GoConfig.preset で指定する。

1つだけ自分のものを使う

GoUi.use_preset(GoThemePresets.SCIFI_DARK)
GoUi.config.icons = my_icons     # アイコンだけ自前、ほかはプリセットのまま

theme・skin・icons を明示的に設定すると、プリセットより優先される。

組み込みの14プリセット

プリセットパネルスキン · アイコン
default_dark · default_light段階的な影を持つ丸い StyleBoxFlat のパネル。主ボタンは押すと沈み、離すと持ち上がるGoSkin · デフォルトアイコン84種
scifi_dark · scifi_lightネオンの縁と発光を持つ面取りの GoStyleBoxCut パネル。フォーカス印は GoStyleBoxBracketGoSkinSciFi — 六角形のスティック · デフォルトアイコン
medieval_dark · medieval_light鍛造した GoStyleBoxMedieval の枠 — 鉄と革、あるいは羊皮紙 — にリベットと角飾りをメニューだけへGoSkinMedieval · デフォルトの上に彫刻風16種
material_light · material_dark 新登場アプリ画面向けの Material 3 Expressive — 48dp のタッチ領域に 40dp のピル型ボタン、28dp のダイアログ、塗りのカード、アウトラインの入力欄、Expressive のスライダー。アプリ部品(ナビゲーションバー・アプリバー・FAB・検索バー・チップ・進捗・日付選択)は M3 のコンポーネントトークンに従うGoSkinMaterial · デフォルトのアイコン
kids_light · kids_dark 新登場子ども向け — おもちゃ箱:太い縁取りと、押すと沈むしっかりした段のあるキー、くぼんだ入力欄、泡のタブ、ゼリーのバー、部品ごとに違うクレヨンの色、キャンディのクイックスロット、ステッカーのバッジ、虹色のジョイスティックとクレヨン色のチャート。サイズとプロジェクトのフォントはそのまま。GoSkinKids · デフォルトのアイコン
arcade_light · arcade_dark 新登場GoStyleBoxArcade が描くアーケード筐体:どのキーも上から下へのグラデーション、白い光沢、押すと沈む段で塗られて紺色のインクの輪郭に収まり、ラベルはインクで縁取った白い文字 — プライマリは緑、キーは青、危険は赤、小さなキーはラベンダー色。ボードは淡い内側を色の枠で囲んだ厚いもので、ウィンドウには金色のタイトルバナーと丸い赤の閉じるキー。GoSkinArcade · デフォルトのアイコン
comic_light · comic_dark 新登場GoStyleBoxComic が描くマンガのコマ:どの面にも太いインクの輪郭とくっきりした影があり、面を押すと影が消える。インクで描いたトグル、チェックボックス、スライダーのつまみ、ウィンドウには黄色のタイトルキャプション。輪郭の太さ、影の大きさ、影を出すかどうかは GoConfig の設定だ。GoSkinComic · デフォルトのアイコン

14種類を並べて

プリセット名だけを変えた同じギャラリー画面だ — ウィジェットのコードは1行も違わない。 どれも縦に持ったスマホ、390×844 だ。

default_dark プリセットの gohud ウィジェットギャラリー
default_dark
default_light プリセットの gohud ウィジェットギャラリー
default_light
scifi_dark プリセットの gohud ウィジェットギャラリー
scifi_dark
scifi_light プリセットの gohud ウィジェットギャラリー
scifi_light
medieval_dark プリセットの gohud ウィジェットギャラリー
medieval_dark
medieval_light プリセットの gohud ウィジェットギャラリー
medieval_light
material_light プリセットの gohud ウィジェットギャラリー
material_light
material_dark プリセットの gohud ウィジェットギャラリー
material_dark
kids_light プリセットの gohud ウィジェットギャラリー
kids_light
kids_dark プリセットの gohud ウィジェットギャラリー
kids_dark
comic_light プリセットの gohud ウィジェットギャラリー
comic_light
comic_dark プリセットの gohud ウィジェットギャラリー
comic_dark
arcade_light プリセットの gohud ウィジェットギャラリー
arcade_light
arcade_dark プリセットの gohud ウィジェットギャラリー
arcade_dark

中世 — 鉄、革、そして羊皮紙

medieval_dark は暗い鉄と革にアンティークゴールドを合わせる。medieval_light は羊皮紙とインクを使う。どちらも GoSkinMedieval と既存のウィジェット、そして彫刻の描き込みを入れた オリジナルアイコン16種を使う。ナビゲーション用のアイコンは元のセットに落ちる。

GoUi.use_preset(GoThemePresets.MEDIEVAL_DARK)
# または: GoUi.use_preset(GoThemePresets.MEDIEVAL_LIGHT)

プリセットは UI を作る前に選ぶ。GoConfig.theme・skin・icons を 明示的に指定した場合は、そちらが優先されたままだ。 res://addons/gohud/examples/medieval/medieval.tscn を開いて F6 を押せば、動くキャラクターシート・ 雑嚢・クエストジャーナルが見られる。ボタンでバリアントを切り替え、アイテムの詳細を開ける。

中世 鉄 — キャラクター・インベントリ・クエストの画面
鉄と革
中世 羊皮紙 — キャラクター・インベントリ・クエストの画面
羊皮紙とインク

メニューの枠にはリベットと小さな角飾りがあり、常に見えている HUD は縁を静かに保つ。 体力・マナ・スタミナは赤・青・オリーブで塗る。Cinzel はタイトルとサブタイトルに限って使い、 本文はホスト側またはデフォルトのフォントのままだ。同梱フォントのライセンスは assets/fonts/cinzel/OFL.txt にある。

彫刻セットが描き直すのは bag、book、box、coin、crown、 flag、heart、key、map、potion、shield、 star、sword、user で、さらに scroll と seal を足す。 それ以外の名前はデフォルトセットに落ちるので、close や settings はどのプリセットでも 同じ絵のままだ。Cinzel が持つのはラテン文字なので、各言語の見出しには shape.fonts から 専用のフォントを与える。

テストスイートが両バリアントで確かめること。 中世スキンが選ばれていること。メニューと HUD のパネルが 鍛造の枠で、角飾りはメニューにだけ付くこと。タイトルが Cinzel を使い、本文は継承したフォントを保つこと。 彫刻アイコンが DPITexture としてインポートされること。実物のクイックスロットがスキンを使うこと。 複製したスキンのダイヤルを変えると、プリセットに触れずにスロットへ届くこと。そして戻したときに、 デフォルトと SF のジオメトリが復元されること。

自分だけの王国を作る

python3 addons/gohud/tools/new_theme.py kingdom --from medieval_dark
# themes/palettes/kingdom.json を編集してから:
python3 addons/gohud/tools/make_theme.py kingdom
godot --headless --path . --import
# GDScript では、ウィジェットを作る前に:
GoUi.use_preset(&"kingdom")

JSON テーマは別の JSON テーマを継承できる。書かなかった値は親の設定をそのまま保ち、 循環する継承は拒否される。生成されたプリセットは親のアイコンセットを引き継ぐ。

設定効果
shape.material0: 鉄 · 1: 革 · 2: 羊皮紙。表面の模様を決める。
shape.grain_alpha質感の不透明度。0 にすると無地の面になる。
shape.ornament_scale · shape.bevel_strengthメニューの角飾りの大きさと、ベベルのハイライトの強さ。
shape.fontstitle・subtitle・caption・body・button の役割を、アドオン内の res:// フォントファイルへ割り当てる。書かなかった役割は継承したフォントのままだ。
skin.dialsクイックスロットの角丸、リベットの表示、質感、ハイライト。ダイヤルの全一覧は下の表にある。

Material 3 — アプリ画面のための見た目 新登場

material_light と material_dark は Material 3 Expressive を gohud に持ち込む — M3 コンポーネントの 形・大きさ・文字組みを、すべての数値を公式の M3 トークンセット(material-web、 tokens/versions/latest)から読んで再現した。ゲームのメニューよりもアプリらしく見せたい画面に使う: ショップ、受信箱、アカウントや設定のページ、ランキング、コンパニオンアプリ。

GoUi.use_preset(GoThemePresets.MATERIAL_LIGHT)
# または: GoUi.use_preset(GoThemePresets.MATERIAL_DARK)
material_light の gohud ギャラリー — ピル型ボタン、塗りのカード、アウトラインの入力欄
material_light
material_dark の gohud ギャラリー
material_dark
material_light の確認ダイアログ — ゲームの上に出た 28dp の角とピル型ボタン
GoDialogs · material_light
ゲームの上に出た material_dark の確認ダイアログ
GoDialogs · material_dark

変わるもの

部分Material 3 では
ボタンピル型(角は完全な丸)。下地は高さ 40dp で 48dp のタッチ領域の中央に置かれるので、押せる範囲は狭まらない。compact ボタンの下地は 32dp。ラベルはウェイト 500 の Roboto だ。
ダイアログとシート28dp の角(extra-large)、24dp の内側余白、24sp の見出し — GoDialogs、GoSurface、GoSheet、そしてその上に作られたすべてのポップアップ。
カード12dp の角と 16dp の内側余白を持つ塗りのカード。
入力欄とスライダーアウトラインのテキスト入力欄。背の高いハンドルを持つ Expressive のスライダー。
チップとセグメント選択8dp の角(small)。
アプリ部品GoNavBar、GoAppBar、GoFab、GoSearchBar、チップ、GoProgress、GoDatePicker は M3 のコンポーネントトークンに従う。
文字タイトル、サブタイトル、キャプション、ボタンには同梱の Roboto を使う。本文はプロジェクトのフォントのままなので、韓国語・日本語・中国語・アラビア語もそのまま描ける。
不透明度すべてのパネルが不透明だ — M3 のサーフェスはベタ塗りだからだ。(デフォルト、SF、中世のパネルは不透明度80%なので、ゲームが透けて見える。)
スキンGoSkinMaterial:ドロワーは M3 のモーダルサイドシート、コンソールの面は M3 のフローティングツールバーで、バナーは surface_container_low の上に載る。
仕様が読みやすさに道を譲るところ。 M3 は無効なラベルを38%まで薄くするが、gohud は読めるように 4.5:1 を 保つ。スナックバーは明るい下地のままにしてある — 文字の色はウィジェットが選ぶトークンなので、反転した下地では暗い地に 暗い文字が載ってしまう。tools/check_contrast.py は、この2つの見た目もほかのすべてと同じように測る。

Roboto は SIL Open Font License 1.1(assets/fonts/roboto/OFL.txt)で提供されており、Material プリセットだけが使う。

キッズ — おもちゃ箱 新登場

kids_light(クリームとピーチの地にぶどう色のプライマリ)と kids_dark(ブルーベリーの地、 お日さま色のプライマリ、ミントのピル)は、子ども向けのゲームや学習アプリのために作った見た目だ — ぽってりして、明るくて、 ぷにぷにで、小さな指が思わず押したくなるもの。

GoUi.use_preset(&"kids_light")
# または: GoUi.use_preset(&"kids_dark")
kids_light の gohud ギャラリー — クレヨン色のゼリーキャンディのボタン
kids_light
kids_dark の gohud ギャラリー — 夜空色のページに広げたおもちゃ箱
kids_dark
kids_light の確認ダイアログ — お日さま色のタイトルリボンと丸いキャンディの閉じるボタン
GoDialogs · kids_light
kids_dark の確認ダイアログ — ミントのタイトルリボンとキャンディの閉じるボタン
GoDialogs · kids_dark

変わるもの

部分キッズの見た目では
すべての面GoStyleBoxJelly が描くゼリーキャンディ:太い縁取り、押せるものすべての下にあるしっかりした段、上が明るく下が濃い本体、左上の白いつや。キー、リストの行、折りたたみの見出し、入力欄、バー、スライダー、パネルがみなこれをまとう。
押したとき段が消えて面がその位置へ沈み、続いてゼリーのようにぷにっとつぶれる — 一瞬横に広く平たくなり、弾むように戻る。gohud が作るすべてのボタンで動き、reduce_motion で止まる。
入力欄、タブ、バーテキスト入力欄は同じゼリーを内側に返したもの — くぼんだ井戸だ。タブは泡、バーにはゼリーのつやがある。
色部品の種類ごとに自分のクレヨンの色をまとう。ほかのすべての見た目と同じ生成器が選ぶので、コントラストの関門はすべて通ったままだ。
ウィンドウウィンドウのタイトルの後ろにお日さま色のリボン(夜はミント)— タイトルは1行に収まるよう15まで縮む — と、危険のクレヨン色に白い×を描いた丸いキャンディの閉じるボタン。
スキンの部品GoSkinKids:クイックスロットはクールダウン中に沈むキャンディのブロック、バッジはステッカー、チップとナビゲーションのピルは小さなゼリー、アバターは丸いキャンディ、スティックは虹色、チャートはクレヨン、アラートと通知はしっかりした縁のステッカーメモだ。
不透明度パネル、カード、通知、ポップアップは不透明だ。
サイズは変わらない。 縁取りと段は各コントロールの矩形の内側に描かれ、どの面もテーマが与えた内側余白を保つので、 別の見た目でレイアウトした画面はそのままのレイアウトを保ち、自前でサイズを固定したホストも同じ部品を測ることになる。 プロジェクトのフォントもそのままなので、ラテン文字以外の文字もそのまま描ける。
すべてのスキンのクイックスロット・スティック・チップ — デフォルト、キッズ、Material、中世、SF
スキンが描く部品 — キッズの行は2番目

自分だけのおもちゃ箱を作る

python3 addons/gohud/tools/new_theme.py candy --from kids_light
# themes/palettes/candy.json を編集してから:
python3 addons/gohud/tools/make_theme.py candy
GoUi.use_preset(&"candy")

コミック — 太いインク 新登場

comic_light(紙のようなクリーム色のページに白いパネル、コバルトのプライマリ)と comic_dark(夜のページに スレート色のパネル、クリーム色の輪郭、黄色のプライマリ)は、どの面もマンガのコマのように描く — 太いインクの輪郭の後ろに くっきりした影を落とす。

GoUi.use_preset(&"comic_light")
# または: GoUi.use_preset(&"comic_dark")
comic_light の gohud ギャラリー — くっきりした影を落とすインクのキー、行、バー
comic_light
comic_dark の gohud ギャラリー — 夜のページにクリーム色のインク
comic_dark
comic_light の確認ダイアログ — 黄色のタイトルキャプションとインクで描いた丸い閉じるボタン
GoDialogs · comic_light
comic_dark の確認ダイアログ — スレート色のカードに黄色のキャプション
GoDialogs · comic_dark

変わるもの

部分コミックの見た目では
すべての面GoStyleBoxComic が描く:インク色の太い輪郭の中に表面の色を塗り、右下へくっきりした影を落とす。キー、リストの行、入力欄、タブ、バー、スライダー、パネル、ポップアップがみなこれをまとう。
押したとき影が消えて、面がその位置へ沈む。
コントロールトグル、チェックボックス、ラジオボタン、スライダーのつまみもインクで描かれ、それぞれに小さな影が付く。
ウィンドウウィンドウのタイトルの後ろに黄色のキャプションと、インクで描いた丸い閉じるボタン。
スキンの部品GoSkinComic:クイックスロット、チップ、バッジ、アバター、通知、ナビゲーションバー、FAB、日付のセルがインクで描かれ、スティックのノブは影を落とし、チャートは太い原色を使う。
不透明度パネル、カード、通知、ポップアップは不透明だ。HUD カードは 92% 不透明。

インクと影の設定

GoConfig の3つの設定が、すべてのコミックの面を一度に変える。作り直すものは何もない — 値を入れたそばから画面が描き直される。

GoUi.config.comic_border_width = 2.0   # 輪郭 (dp) — 既定は 3
GoUi.config.comic_shadow_size = 6.0    # 影 (dp) — 既定は 4
GoUi.config.comic_shadow = false       # どこにも影を出さない

ウィジェット1つだけなら、設定に関係なく独自の道を行ける:

GoStyle.comic_shadow(skip_button, false)     # このボタンは平らに
GoStyle.comic_shadow(card, true, true)       # このカードとその中身すべては影を保つ
GoStyle.comic_border(title, 5.0)             # これだけ輪郭を太く
サイズは変わらない。 輪郭と影は各コントロールの矩形の内側に描かれ、どの面もテーマが与えた内側余白を保つので、 別の見た目でレイアウトした画面はそのままのレイアウトを保つ。プロジェクトのフォントもそのままだ。
コミックスキンが描いたクイックスロット・スティック・チップ
コミックスキンが描く部品

自分だけのコミックを作る

python3 addons/gohud/tools/new_theme.py inked --from comic_light
# themes/palettes/inked.json を編集してから:
python3 addons/gohud/tools/make_theme.py inked
GoUi.use_preset(&"inked")

アーケード:塗られたキーと厚いボード 新登場

arcade_light(空色のページに白いボード)と arcade_dark(夜のページに紺色のボード)は、 どの画面もアーケード筐体のように仕立てる:どのキーも塗られている — 上が明るく下へいくほど深くなるグラデーション、 白い光沢のひと筋、押すと沈む段を紺色のインクの輪郭に収める — そしてどのボードも厚い。淡い内側を 色の枠が囲む。

GoUi.use_preset(&"arcade_light")
# または: GoUi.use_preset(&"arcade_dark")
arcade_light の gohud ギャラリー — 空色のページに、緑・青・赤・ラベンダー色で塗ったキーと青い枠の HUD ボード
arcade_light
arcade_dark の gohud ギャラリー — 夜のページに同じ鮮やかなキー
arcade_dark
arcade_light の確認ダイアログ — 枠付きのボードに、金色のタイトルバナー、丸い赤の閉じるキー、青と緑に塗ったキー
GoDialogs · arcade_light
arcade_dark の確認ダイアログ — 紺色のボードに金色のバナー
GoDialogs · arcade_dark

変わるもの

部分アーケードの見た目では
キーGoStyleBoxArcade が描く:グラデーションの本体、左上の角を回り込む白い光沢、より深い色の段、紺色のインクの輪郭。プライマリキーは緑、普通のキーと選ばれたタブは青、危険なキーはコーラル色と赤、小さなキーとほかのタブはラベンダー色だ。
ラベル塗られたキーにはどれも、インクで縁取った白い文字。どの塗りも、そのラベルがグラデーションのどの高さでも読めるまで調整される — WCAG と同じく縁取りを文字の一部として数え、4.6:1 以上。
押したとき段が消え、キーがその位置へ沈んで、また跳ね返る。
ボードパネル、カード、HUD カード、ポップアップは厚い:自分の光沢と段を持つ色の枠(ウィンドウは 6dp、カードと HUD カードは 4、メニューと通知は 3)が、インクの線で縁取った淡い内側を囲む。これを収めるために内側余白が少し広がるので、文字が枠に触れることはない。
入力欄とバー入力欄とバーの溝はくぼんだ内側だ。バーの塗りは、その色の明るい塗り色で塗った光沢のあるチューブ。
ウィンドウインクで縁取った白いタイトルを載せた金色のバナーと、白い×の入った丸い赤の閉じるキー。
スキンの部品GoSkinArcade:クイックスロットとチップはキーキャップで、クールダウン中のスロットには金の縁が灯り、バッジは明るいプレート、アラートは自分の色の枠で囲まれ、選ばれたカードには金の縁が灯る。FAB は金色のキー、スティックは4つの矢印の付いた光沢のあるパッドだ。
不透明度パネル、カード、通知、ポップアップは不透明だ。HUD カードは 94% 不透明。

キー1つを自分の色で塗る

テーマはキーを種類ごとに塗る。キーごとに自分の色を持たせたいメニューは、1つずつ塗ればいい — ホバーの面は少し明るく、 押した面は少し深くなり、無効の面はくすんだままだ:

menu.add_child(GoStyle.arcade_paint(GoStyle.button("Resume", _resume, GoStyle.Tone.PRIMARY), Color("#4ACB3E")))
menu.add_child(GoStyle.arcade_paint(GoStyle.button("Shop", _shop), Color("#FF8A1E")))
GoStyle.arcade_paint(stage_card, Color("#E3343D"), true)   # ボードの枠と、その中のすべてのキー
ラベルはいつでも読める。 白いラベルが読めない塗りは、読めるようになるまで明るく、または深く調整されるので、 渡した色は出発点にすぎない。ほかの見た目では arcade_paint() は何もしない。
キーの大きさは変わらない。 段と光沢は各キーの矩形の内側に描かれるので、別の見た目でレイアウトした画面は そのままのレイアウトを保つ。ボードは文字が枠に触れないよう、中身に少しだけ多く余白をとる(カードと HUD カードは 12dp、 下は 15)。プロジェクトのフォントもそのままだ。
アーケードスキンが描いたクイックスロット・スティック・チップ — 光沢のあるキーキャップと4つの矢印のパッド
アーケードスキンが描く部品

自分だけのアーケードを作る

python3 addons/gohud/tools/new_theme.py cabinet --from arcade_light
# themes/palettes/cabinet.json を編集 — *_vivid の色が塗りの色だ — してから:
python3 addons/gohud/tools/make_theme.py cabinet
GoUi.use_preset(&"cabinet")