gohud

不透明度 — パネルの向こうのゲーム

← テーマ

ポップアップ、ダイアログ、シート、カード、HUD パネル、アラート、スナックバーは、面を不透明度 80% で描く。確認ダイアログの背後では戦いが続き、インベントリのシートの下には地図が見えている。ゲームでは これは飾りではない — プレイヤーが自分の居場所を見失わずにいられる理由だ。完全に不透明なパネルは、 ウィンドウが開いたその瞬間に、プレイヤーが立っていた場所を消してしまう。

薄くなるのは面だけだ。 文字、アイコン、ボタン、バッジ、クイックスロットははっきりしたままで、 枠と影もそのままだ。半透明のパネルがガラスに見えるのは、その輪郭が鋭いあいだだけだ。輪郭まで薄めれば、 パネルがどこで終わるのか分からなくなる。中身を薄めれば UI はもう読めない — それは透けた窓ではなく、 ただの不具合だ。だからこの値は modulate.a を通しては決して適用されない。

5つの層、具体的なものから順に

どこ単位及ぶ範囲
その呼び出しの引数 — surface.alphaGoStyle.card(…, alpha)比率 0.0–1.01つのウィンドウ
GoConfig.container_alpha_overrides[kind]比率 0.0–1.01種類のパネル、プロジェクト全体で
GoConfig.metric_overrides[<kind>_alpha]パーセント寸法をすべて1か所にまとめているプロジェクト
GoConfig.container_alpha比率 0.0–1.0すべてのパネルを一度に
テーマの GoHud/constants/<kind>_alphaパーセント見た目が決めること — 大もとはここだ

どれも設定しなければ値は 100 だ。だから古いテーマは何も変わらない。

不透明度はどこでも比率だ — テーマの中だけが例外だ。 alpha という名のフィールドも 引数も、すべて 0.0–1.0 を取る。Color.amodulate.a と同じ単位で、負の値は 「設定なし」を意味する。唯一の例外はテーマの定数だ。Theme の定数は小数を持てないからで、 その定数と、それを上書きする経路(テーマと同じ名前と整数型を共有する metric_overrides)だけが 80 と書かれる。ほかはどこもそうではない。
# 1つのウィンドウだけ — 背後の戦いを隠してはならない確認ダイアログ
surface.alpha = 0.6
sheet.alpha = 0.7
dialogs.alpha = 0.9                          # @export のフィールドも比率だ
drawer.alpha = 0.7
GoPopover.open(slot, body, {"alpha": 0.9})
var glass := GoStyle.card(Color.TRANSPARENT, -1.0, -1.0, -1.0, 0.5)

# 種類ごと — HUD はほぼ不透明に保つ。その文字は世界の上に直接載るからだ
GoUi.config.container_alpha_overrides = {
    GoTheme.BOX_PANEL: 0.7,                   # ダイアログとシートは息をつける
    GoTheme.BOX_HUD: 0.95,
}
GoUi.refresh()                               # すでに開いているウィジェットを描き直す

# プロジェクト全体 — 情報の多い世界では、パネルを不透明に戻したくなる
GoUi.config.container_alpha = 1.0
GoUi.refresh()

GoUi.surface_alpha(GoTheme.BOX_PANEL)        # 解決された比率。たとえば 0.8

この値に従うもの、従わないもの

従うもの — コンテナ無視するもの — 押すもの、そして印
GoSurface(ダイアログ、シート、ドロップダウンの背後にある唯一の外殻) · GoSheet · GoDialogs · GoDrawer · GoPopover · GoNotice · GoSnackbar · GoPromptCard · GoCoachMark · GoConsole すべてのボタン · GoSlot(クイックスロット) · GoBadge · セグメント選択 · 選択セル · チップ · 円とアバター
GoStyle.card() · hud_panel() · overlay_panel() · alert() · plate() · edge_card_panel() · style_notice_panel() · floating() · box() · surface() すべての文字とアイコン

状態が薄れたボタンは、自分が何であるかをもう伝えない。バッジは2文字を読ませるために存在する — どちらもコンテナではないから、どちらもこの値には従わない。

ポップアップメニューは不透明のままだpopup_alpha は 100)。エンジンは PopupMenu を独立した Window に載せることがあり、そこでは OS がゲームと 合成してくれない — 半透明は透けるのではなく黒く出る。下げてよいのは、サブウィンドウを埋め込んでいる プロジェクト(gui_embed_subwindows)だけだ。

実際の画面から分かった3つのこと

独自の面も薄くなる — そして、黙って壊れるのはここだ

面取りのパネル(GoStyleBoxCut)と鍛造の枠(GoStyleBoxMedieval)は StyleBoxFlat ではない — 自分で描く。不透明度をフラットの枝にだけ入れると、これらの テーマは黙ってそれを無視し、それでいて値を見るテストはすべて通ってしまう。どちらも背景を薄くし、 発光、リベット、角の彫刻、ベベルは強さを保つ。そして中世の面の質感とベベルはもともと背景のアルファに 比例していたので、パネルと一緒に薄くなる。

ここから広い話になる。bg_color.a == 0.8 は数値にすぎない。世界が透けて見え、それでも 文字が読める — これが要件だ。gohud は前者をヘッドレスの検査で確かめ、後者を仮想モニタ上で斜めの縞 の上にパネルを描いて確かめる(tests/gohud_alpha_shot.gd)— フラットの面、面取りの面、 鍛造の面で、ダークとライトの両方のテーマで。