パネル
パネル (YauiPanel) は YAUI のツリーのルートです。パネル自身も要素です。YauiPanel は同じ GameObject に YauiElement を必要とし、その要素がレイアウトのルートのボックスになります。要素は、階層上で最も近い上位のパネルに属します。
各パネルは 1 回のドローコールで描画されます。ただし、カスタムマテリアル、マスク、多数のテクスチャによって分割されることがあります (パフォーマンスを参照)。
描画モード
オーバーレイ
PanelRenderMode.Overlay は、uGUI の Screen Space - Overlay のキャンバスと同じように、ポストプロセスの後にパネルを画面の上に描画します。画面に描画する最後のゲームカメラの上に描画されます。URP のレンダラーの設定は必要ありません。
ルートの要素は画面全体を覆います。キャンバスのサイズ (パネル内のすべての長さの単位) はスケールモードによって決まります。
| スケールモード | 動作 |
|---|---|
ScaleWithScreenSize | ReferenceResolution を基準に画面に合わせて拡大縮小します。Match で幅に合わせる (0) か高さに合わせる (1) かを補間します。uGUI の Scale With Screen Size と同じです。 |
ConstantScale | キャンバス単位あたり ConstantScale 画面ピクセル。uGUI の Constant Pixel Size と同じです。 |
オーバーレイのパネルが複数ある場合は、SortOrder が大きいものほど手前に描画されます。
Scene ビューでは、オーバーレイのパネルは uGUI のオーバーレイのキャンバスと同じように表示されます。1 画面ピクセルが 1 ワールド単位で、左下の角が原点になります。
カメラ
PanelRenderMode.Camera は、カメラ (WorldCamera) の描画先の上に、そのカメラの描画パスの間の一点 (InjectionPoint) でパネルを描画します。オーバーレイと同じく、ルートの要素は描画先全体を覆い、キャンバスのサイズはスケールモードで決まります。ただし、基準は画面ではなくカメラのピクセルサイズ (RenderTexture に描くカメラではそのテクスチャのサイズ) です。
パネルは描く位置を名前で指定し、そのイベントはカメラのレンダラーが決めます。
- パネルを描く位置ごとに、
YauiInjectionPointアセット (Create > YAUI > Injection Point) を作ります。たとえば「HUD」や「Front」です。 - カメラのレンダラーに Yaui Renderer Feature (
YauiRendererFeature) を追加し、injection point とそのイベントを並べます。 - パネルの
WorldCameraとInjectionPointを設定します。パネルのインスペクターには、カメラのレンダラーが描くイベント、または描かれない理由が表示されます。
カメラのレンダラーに登録されていない injection point のパネルは描画されません。イベントはレンダラーごとに設定するため、同じ位置に 2D Renderer と Universal Renderer で別のイベントを与えられ、スクリプトでパネルを別のカメラに移しても位置はそのままです。イベントの欄には任意の値を入力でき、最も近い名前付きのイベントと、2D Renderer ではパスが実行される箇所が表示されます。
イベントによって、パネルが何の上に描かれ、何がパネルに掛かるかが決まります。
- カメラのポストプロセスより前なら、ポストプロセスはパネルにも掛かります。後なら掛かりません。
- URP のイベントの間の値も使えます (
RenderPassEvent.AfterRenderingPostProcessing - 20など)。パスはイベントの順に実行されるため、独自の Renderer Feature のパスの間にパネルを置いたり、カメラを重ねる代わりに 1 台のカメラで複数の UI とポストプロセスの層を描いたりできます。 - 2D Renderer はフレームの決まった箇所でだけパスを実行し、イベントをそれらの箇所にまとめます。
| イベント | 2D Renderer がパスを実行する箇所 |
|---|---|
450 (BeforeRenderingTransparents) まで | 描画の前 |
451〜550 (AfterRenderingTransparents を含む) | ポストプロセスの前 |
551〜600 (AfterRenderingPostProcessing) | ポストプロセスの後 |
| 600 より大きい値 | 最終ブリットの後、カメラの描画先の上 |
同じカメラと injection point のパネルは SortOrder の順に描画されます。そのほかの注意点です。
- パネルはパスの間に描かれるため、直前のパスの半透明オブジェクト (uGUI のキャンバスを含む) とはソートされません。
- マスクは専用のステンシルバッファを使います。カメラの深度バッファは不要で、そのステンシルの値も変更しません。
- パネルの描画の後、後続のパスのためにカメラの view と projection を元に戻します。
- ポインターイベントと座標の変換には
WorldCameraを使います。 - カスタムマテリアルは、オーバーレイと同じく
Overlayパスで描画されます。 - カメラのパネルは Scene ビューには表示されません。
ワールド空間
PanelRenderMode.World は、パネルの GameObject の Transform の位置に、平面の Quad としてパネルをシーン内に描画します。URP の半透明パスで描画されるため、他の半透明オブジェクトと一緒にソート・深度テストされます。
- キャンバスのサイズは
ReferenceResolutionです。 WorldScaleはキャンバス単位あたりのワールド単位です。既定値の 0.001 では、1080×1920 のパネルは 1.08 × 1.92 ワールド単位になります。- パネルは Transform の XY 平面上で、Transform を中心に配置されます。
EventCameraはポインターイベントを見るカメラです (未設定ならメインカメラ)。
パネルの GameObject の Transform が使われるのはワールド空間の場合だけです。パネルの下にあるすべての要素の Transform は常に無視されます。
非表示のパネル
ルートの要素の不透明度が 0 のパネルや、描くものがすべて透明なパネル (すべての要素と内容のアルファが 0 で、カスタム描画も何も描かないもの) は描画されず、描画のコストはほとんどかかりません。短い間だけ隠すパネルは、フェードアウトさせるだけで十分です。GameObject を無効にする場合と違い、再び表示するときに描画順を作り直しません。
YauiPanel.IsDrawn で、最後に描画されたフレームでパネルが描かれたかを読めます。たとえば、カメラのパネルが描かれている間だけそのカメラを有効にできます。この値は最後に描画されたフレームの状態なので、表示され始めたパネルは、スクリプトがそれを知る 1 フレーム前から描かれています。
座標
パネル内の位置はキャンバス空間で表します。単位はキャンバス単位で、原点は左上、Y は下向きです。画面上の位置 (PointerEventData.position など) はピクセル単位で、原点は左下です。
| メンバー | 変換 |
|---|---|
YauiPanel.TryScreenToCanvas / TryCanvasToScreen | 画面 ↔ パネルのキャンバス空間 |
YauiElement.ScreenToLocal / LocalToScreen | 画面 ↔ 要素のボックスのローカル空間 (描画変換の適用後) |
YauiPanel.ScaleFactor | キャンバス単位あたりの画面ピクセル (オーバーレイ)、またはカメラのピクセル (カメラ) |
YauiPanel.CanvasSize | キャンバス単位でのパネルのサイズ |
YauiPanel.CanvasToWorld | キャンバス空間 → ワールド空間 (ワールド空間のパネル) |
これらの変換は、最後に描画された状態を使います。