ゲーム UI

このページは自動翻訳されており、誤りが含まれる場合があります。誤りを見つけた場合は「このページを編集」リンクからご協力ください。

Play Mode で動く .ui ドキュメント

Turian のゲーム UI は Web や Unity の UI Toolkit のように書きます。.ui XML ドキュメントが要素を、.uss スタイルシートが見た目を記述し、C# の UiController やデータバインディングが動きを与えます。描画は Turian Studio と同じツールキット Guinevere が行います。

ドキュメントを画面に置く

  1. Assets/UI/menu.ui と Assets/UI/theme.uss(下記)を作ります。
  2. ノードを追加し、Add Component → UI → UI Document。
  3. menu.ui を Document フィールドにドロップします。
プロパティ 意味
Document 描画する .ui ドキュメント。
StyleSheets ドキュメント自身のものに加えて適用する .uss。
Mode ScreenSpaceOverlay(シーンの上に描画)または WorldSpace(シーン内のクアッドに描画)。
SortOrder 画面空間ドキュメント間の描画順。
ScaleMode、ReferenceResolution ピクセル一定、または基準解像度から画面に合わせて拡大縮小。
PanelSize ワールド空間パネルのピクセルサイズ。

ワールド空間のドキュメントは Studio のビューと CLI の描画で表示されますが、エクスポートしたゲームではまだ描画されません。クリック可能にするには UI Raycaster コンポーネントを追加します。

ドキュメント

<?xml version="1.0" encoding="utf-8"?>
<UI xmlns="https://turian.dev/ui" controller="Usercode.MainMenu">
  <Style src="Assets/UI/theme.uss" />

  <VisualElement name="root" class="screen">
    <Label class="title" text="{Title}" />
    <Button name="play" text="Play" click="OnPlay" />
    <Toggle name="music" label="Music" value="{Music, mode=TwoWay}" />
    <Button name="quit" text="Quit" click="OnQuit" />
  </VisualElement>
</UI>
  • ルートは常に <UI> です。<Style> シート、任意の <Template>、1 つのビジュアル要素を含みます。
  • 共通の属性:name(一意な id)、class(スタイルクラス)、style(インライン宣言)、tooltip、enabled。
  • 葉の要素の中のテキストはその text になります:<Label>メインメニュー</Label>。

要素

要素 備考
VisualElement 汎用コンテナー。flex-direction、gap、サイズ、配置でレイアウトします。
Label テキスト。
Button text。click を発生。
Image src、width、height。
ImageButton image-normal、image-hover、image-pressed、nine-slice="l,t,r,b"。click を発生。
TextField value、placeholder。value-changed を発生。
Toggle value、label。value-changed を発生。
ScrollView 子を縦にスクロール。
Tabs / Tab ページごとに <Tab header="…">。changed を発生。

状態を持つコントロール(TextField、Toggle、Tabs)には name を付けて、フレーム間で状態が保たれるようにします。

テンプレートとリスト

<Template name="StatRow">
  <VisualElement class="row">
    <Label text="{label}" />
    <Label binding-text="{path}" />
  </VisualElement>
</Template>

<Instance template="StatRow" label="Gold" path="Player.Gold" />

<ScrollView>
  <Repeat items="{Inventory}" as="item">
    <Label binding-text="{item.Name}" />
  </Repeat>
</ScrollView>

.uss によるスタイル

--accent: #4a90e2;

.screen  { flex-direction: column; gap: 12; padding: 24; align-items: center; }
.title   { font-size: 32; color: #ffffff; text-shadow: #000000 2 2; }
Button   { width: 220; height: 44; border-radius: 8; background-color: #2a2f3a; }
Button:hover { background-color: var(--accent); }
#quit    { background-color: #6b2b2b; }
  • セレクター:Type、.class、#name、*、Button.primary のような複合、グループ a, b。子孫・子の結合子はサポートしていません。
  • 状態::hover、:active、:focus、:disabled。
  • 変数:トップレベルで --name: value; を宣言し、var(--name) で使います。
  • レイアウト:flex-direction、flex-wrap、flex-grow、gap、width/height(ピクセルまたは %)、最小・最大サイズ、padding、margin、align-items、justify-content、align-self。
  • ボックス:background-color、border-color、border-width、border-radius。
  • テキスト:color、font-size、font-family(プロジェクトの .ttf/.otf またはシステムフォント)、text-outline、text-shadow、text-inner-shadow、text-gradient。

コードビハインドとデータバインディング

namespace Usercode;

public sealed class MainMenu : UiController
{
    public string Title => "My Game";
    public bool Music { get; set; } = true;

    public void OnPlay() => Log.Logger.LogInformation("Play が押された");
    public void OnQuit() => Log.Logger.LogInformation("Quit が押された");
}
  • 引数のない public な void メソッドはすべてイベントハンドラーで、click、value-changed、changed、submit、activated、selection-changed から名前で参照されます。
  • 属性の {Path} は、コントローラー(または別のデータコンテキスト)のプロパティにバインドし、毎フレーム読み直されます — 変更通知は不要です。binding-text="{…}" が明示的な形式で、<Bindings> ブロックでまとめることもできます。
  • モード:OneWay(既定)、TwoWay(テキストフィールドとトグルが書き戻す)、OneTime。
  • コンバーター:{Health | percent} — 組み込みは not、percent、thousands、upper、lower。独自のものは ValueConverters.Register("name", converter) で登録します。
  • 準備、毎フレームの処理、後始末には OnBind、OnUpdate(float deltaTime)、OnUnbind をオーバーライドします。

ローカライズされたテキスト

ラベルのテキストはプロジェクトの文字列テーブルから自動的に参照されます。text-key で明示的なキーを指定できます。ローカライゼーション を参照してください。

ゲームなしでのプレビュー

CLI は GPU なしでドキュメントを PNG に描画し、JSON をデータとしてバインドします:

turian-cli ui --file Assets/UI/menu.ui --out menu.png --data '{"Title":"Preview","Music":true}'

解析エラーは問題のある XML の行と列を報告します。


← すべてのドキュメント このページを編集