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 ビューでの描画とピッキング