メインコンテンツまでスキップ
YAUI - Yet Another Unity UI

YAUI (Yet Another Unity UI) は Unity 向けの UI システムです。GameObject と MonoBehaviour の上に構築され、パフォーマンスを重視して設計されています。

警告

YAUI は実験的なパッケージです。最初の安定版のリリースまでに破壊的変更が行われる可能性があります。

なぜ YAUI なのか​

Unity には 2 つの UI システムがあり、それぞれにトレードオフがあります。

  • uGUI は GameObject の上に構築されているため、Prefab、Animator、Timeline、Inspector と組み合わせて使えます。しかし、メッシュの再構築とバッチングをメインスレッドで行い、Layout Group も低速です。標準シェーダーの機能が少ないため、プロジェクトではカスタムシェーダーを追加することが多く、それがバッチングを妨げます。
  • UI Toolkit は高速で、Flexbox と豊富な標準の見た目を備えています。しかし GameObject からは独立しており、その要素に Prefab、Animator、コンポーネントを使うことはできません。

YAUI は uGUI の GameObject によるオーサリングモデルを維持します。そのうえで、uGUI では互換性を壊さずには導入できない制約を導入し、それを利用してモダンな UI エンジンのパフォーマンスを実現します。YAUI は uGUI と互換性がなく、uGUI からの移行パスもありません。

高速​

  • パネルごとに 1 ドローコール。 ボックス、画像、グリフはすべて GPU バッファ上の Quad で、頂点シェーダーで展開されます。再構築やバッチングが必要なメッシュはありません。
  • カスタムシェーダーなしで豊かな見た目。 1 つの Uber シェーダーが、角丸 (角ごとに指定可能)、ボーダー、ドロップシャドウ、アウトラインと影付きの SDF テキスト、スライス画像やフィル画像を、バッチを切らずに描画します。
  • CPU 処理の並列化。 テキスト生成とレイアウトはワーカースレッド上のジョブとして、ゲームのコードと並行して実行されます。
  • 変化がなければコストはかかりません。 セッターは変更を GPU 向けのデータに直接書き込み、変更されたチャンクだけがアップロードされます。
  • 一様グリッドを使った Burst によるヒットテストを、EventSystem に接続しています。

高度なレイアウト​

  • Yoga (React Native のレイアウトエンジン) の移植による Flexbox。ワーカースレッド上で Burst を使って実行されます。
  • レイアウトの境界: サイズが固定されたボックスは、その内側の変更が外に広がるのを止めます。変更があっても、その影響を受けるツリーの部分だけがレイアウトされます。
  • 変形 (移動、回転、拡大縮小) と不透明度はレイアウトの後に適用されるため、これらを変更してもレイアウトが再実行されることはありません。

GameObject ベース​

  • 要素は GameObject 上のコンポーネントです。Prefab で UI を組み立て、Animator や Timeline でアニメーションさせ、Inspector で Undo 付きで編集できます。
  • 入力は EventSystem と Input System UI Input Module を通して扱われます。ポインターイベント、ナビゲーション、選択は uGUI と同じように動作します。
  • パネルは画面上のオーバーレイ、またはワールド空間に描画されます。ワールド空間のパネルは、シーン内の他の半透明オブジェクトと一緒にソート・深度テストされます。

機能​

  • 要素: ボックス、テキスト、画像 (シンプル、9 スライス、フィル)、任意のテクスチャ
  • バッチを切らない矩形・角丸矩形へのクリップと、任意の形状・深さのステンシルマスク
  • Unity の Advanced Text Generator によるテキスト: シェーピング、OS フォントへのフォールバック、禁則処理、リッチテキスト、スプライト
  • コントロール: ボタン、トグルとトグルグループ、スライダー、スクロールバー、スクロールビュー、入力欄 (IME とオンスクリーンキーボードに対応)、ドロップダウン
  • YAUI の共通シェーダーコードを使ったカスタムシェーダー
  • Scene ビューでの描画とピッキング