Unity UI とパーティクル レベルの問題カメラの深度レイヤー RenderQueue でのレイヤー順序のソート

Unity ゲーム開発では、モデル、インターフェイス、特殊効果など、カメラ (Camera)、キャンバス (Canvas)、シェーダー、その他の関連コンテンツを含むレイヤーの概念を計画する必要があります

Unity では、レンダリング順序は複数の要因によって決定され、カメラ深度、レイヤーの並べ替え/レイヤー内の順序、および RenderQueue の3 つの優先レベルに大別されます。

1.カメラ

一般的なゲーム プロジェクトの場合、 3D カメラ (パースペクティブ パースペクティブを使用)UI カメラ (正投影パースペクティブを使用) の少なくとも 2 つのカメラが作成されます
Unity では、各カメラには深度プロパティがあり、レンダリング パイプラインでのカメラのレンダリング順序を制御するために使用されます。カメラ深度の値が小さいほど、カメラのレンダリングの優先順位が高くなります。つまり、カメラは深度値が大きい他のカメラよりも前にレンダリングされます。このルールはオブジェクトのレンダリングにも適用されます。つまり、オブジェクトのカメラ深度値が小さいほど、オブジェクトのレンダリングの優先順位が高くなります。同じカメラ深度値を持つオブジェクトのレンダリング順序は、他の要素に従って並べ替えられるため、定義されていないことに注意してください。
ここに画像の説明を挿入します
写真のように 3D カメラ

ここに画像の説明を挿入します
図に示すように UI カメラ

一般に、UI カメラの深度は 3D カメラの深度よりも大きいため、3D カメラによってレンダリングされたオブジェクトの前に UI を表示できます。
カメラのクリア フラグに対してのみ深度を使用し、カリング マスクで対応するレイヤー (レイヤー) を選択することをお勧めします。
ここに画像の説明を挿入します
デフォルトでは、図に示すようにUI レイヤーがあり、デフォルトの UI レベル
のカメラは、深さの小さいものから大きいものの順に、それぞれのカリング マスク レイヤーをレンダリングします。
ワールド座標では、オブジェクト A はオブジェクト B の前にありますが、カメラ レンダリング オブジェクト A の深度がカメラ レンダリング オブジェクト B の深度よりも大きい限り、ゲーム ビューで見られる効果はそのオブジェクトであることに注意してください。 B がオブジェクト A の前にあり、オブジェクト A とオブジェクト B が同じカメラでレンダリングされる場合、通常の状況では、オブジェクト A はオブジェクト B をブロックします (ここで、通常の状況では、オブジェクト B は次の RenderQueue を通じて設定することもできるため、オブジェクト A の前にある SortingLayer、SortingOrder など)。

ここに画像の説明を挿入します

UGUI では、すべての UI 要素が Canvas の子ノードに存在する必要があります。Canvas のレンダリング モードは通常、Screen Space - Camera モードを使用し、UICamera を Canvas の Render Camera キャンバスに割り当てます。
ここに画像の説明を挿入します
これは、デフォルトでは画面空間の 2D オブジェクトであり、画面空間での並べ替え順序プロパティのみを持ちます。スペース、ソート order 属性は消え、他の 2 つの属性 (ソートレイヤー、レイヤー内の順序) になります。この時点で、キャンバス パネルに 2 つの主要な属性があることがわかります: ソート レイヤー、レイヤー内の順序
ソート レイヤーを追加するには、インスペクター ウィンドウで [タグ] -> [タグの追加] -> [ソーティング レイヤー] をクリックします。

Canvas がワールド空間に設定されている場合、ワールド空間内の Canvas の Z 値と Canvas 上の UI オブジェクトもデフォルトでレンダリング順序を決定し、カメラから最も遠いものが最初にレンダリングされます。並べ替えレイヤーが設定されている場合、レンダリング順序は並べ替えレイヤーによって決定されます。並べ替えレイヤーはカスタム識別子であり、どの並べ替えレイヤーが最初 (レイヤーとタグで設定された順序) が最初にレンダリングされます。
ここに画像の説明を挿入します
なぜこのソートレイヤーがあるのか​​というと、Canvas はたくさん作成できるため、デフォルトのソートレイヤーは Default になっています。このとき、描画順序は Hierarchy ウィンドウ内の Canvas ノードの順序に従って決まります。上のレイヤーが最初に描画されます。 、そして下のレイヤーは後でレンダリングされます。
場合によっては、この順序を壊して、上位ノードのキャンバスを後でレンダリングする必要がある場合があります。このとき、並べ替えレイヤーを高い値に設定できます。もちろん、順序を設定することで同じ値を維持することもできます。レイヤーで。(層内ソート)

order in Layer は同じ並べ替えレイヤー内で細分化された数値であり、並べ替えレイヤーが同じ場合、order in Layer の値が小さいほど早くレンダリングされます。

画面スペース内のすべては UI レイヤーにあり、並べ替えレイヤーは必要ありません。並べ替え順序 (実際にはレイヤー内の順序) のみが提供されます。デフォルトでは、ソート順序は 0 です。このとき、UI オブジェクトのレンダリング順序は、階層内に表示される順序に従って決定されます。並べ替え順序が異なる場合は、値が小さいほど最初にレンダリングされます。

UGUI はバッチを自動的にマージします。原理は、キャンバスの下にあるすべての要素をメッシュにマージすることです。キャンバスの下に多くの要素があり、要素の位置とサイズが変更される場合、すべての要素のメッシュを変更する必要があります。再び合併しました。要素が多すぎるとラグが発生する可能性があります。
より良いアプローチは、各 UI インターフェイスを Canvas として設定することです。このインターフェースの下に多くの要素がある場合は、さらに多くの Canvas をネストすることを検討できます。特に位置やサイズが頻繁に変更される要素の場合、これにより要素をメッシュにマージする際のオーバーヘッドを軽減できます。ただし、Canvas の入れ子が多すぎるのは良くなく、メッシュの結合は減少しますが、各 Canvas が DrawCall を単独で占有するため、DrawCall は再び起動します。

NGUI での自動バッチ処理は通常、Panel で実行されます。同じマテリアル (マテリアル) の複数の UI 要素を同じパネルに配置すると、NGUI はそれらを 1 つの描画呼び出しに結合しようとするため、描画操作の数が減り、レンダリング パフォーマンスが向上します。この組み合わせた描画操作により、CPU と GPU の負荷が軽減されます。描画呼び出しは通常、より高価な操作の 1 つであり、バッチ処理が多すぎるとメモリ使用量の増加につながる可能性があるためです (WebGL は注意してください!!!! )。を呼び出すと、より大きな頂点と三角形のデータが生成される場合があります。したがって、UI を設計する際には、パフォーマンスとメモリのバランスを考慮する必要があります。

Order in Layer は Sorting Layer の内部ソートであるため、Sorting Layer を使用すると 2 レベルのソートとなり、ほとんどの場合、レンダリング順序の要件を解決できます。
もちろん、複数の UI カメラが作成される場合は、異なる Canvas が異なる UI カメラにバインドされ、カメラの深さと組み合わせると 3 レベルの並べ替えになりますが、通常はあまり多くの UI カメラを作成しません。

例えば、ワールド空間のキャンバスに掛けられたキャラクター名やスプライトで実現されるマスクは、ソートレイヤーやレイヤー内の順番を調整することで実現できます。

さらに、ParticleSystem には Sorting Layer と Order in Layer もあります。企画側からはこのようなご要望をいただくことが多いです

2 つの UI AB の間に C パーティクルを挿入する必要があります。この場合、パーティクルの Order in Layer を使用せずに、AB を逆アセンブルして RenderQueue を調整する必要があります (理由は概要で述べます)

RenderQueue はレンダリング順序を調整します。RenderQueue
ここに画像の説明を挿入します
について言及するときは、Unity の組み込みレンダリング キューについても言及する必要があります。

Background(1000) 最も早くレンダリングされたオブジェクトのキュー。

ジオメトリ (2000) 不透明オブジェクトのレンダリング キュー。ほとんどのオブジェクトはこのキューを使用してレンダリングする必要があります。これは Unity Shader のデフォルトのレンダリング キューでもあります。

AlphaTest (2450) には、透過チャネルとアルファ テストが必要なオブジェクトのキューがあり、Geomerty よりも効率的です。

Transparent(3000) 半透明オブジェクトのレンダリング キュー。一般に、深度を書き込まないオブジェクトの場合、アルファ ブレンドなどがこのキューでレンダリングされます。

オーバーレイ (4000) 最後にレンダリングされたオブジェクトのキュー。通常はレンズ フレア、スクリーン パッチなどのオーバーレイ エフェクトです。
Unity でのレンダリング キューのセットアップも非常に簡単です。手動で作成する必要も、スクリプトを記述する必要もありません。シェーダーにタグを追加するだけです。もちろん、そうでない場合は、これを追加すると、それがデフォルトのレンダリング キュー ジオメトリになります。たとえば、オブジェクトを透明レンダリング キューでレンダリングする必要がある場合は、次のように記述できます:
{ "Queue" = "Transparent"}
シェーダのレンダリング キューは、シェーダのインスペクタ パネル、またはコードRenderQueue で制御してレンダリング順序を調整します

RenderQueue > 2500 のオブジェクトは、RenderQueue <= 2500 のオブジェクトより確実に前にあります。つまり、レンダリング中に、大きい RenderQueue が小さい RenderQueue をブロックします。Sorting Layer と Order in Layer がどのように設定されていても、機能しません。

2 つの RenderQueue が同じキュー内にある場合、上位の並べ替えレイヤーは間違いなく並べ替えレイヤーの前にあり、RenderQueue とレイヤー内の順序は無視されます。並べ替えレイヤーの同じ前提下でのみ、上位の並べ替えレイヤーは並べ替えレイヤーよりも低くなります。RenderQueue を無視して、前にある Layerの順序を指定します (上で説明しましたが、今日この間違いを犯しました)。並べ替えレイヤーがレイヤー内の順序と同じである場合、RenderQueue のレベルが、高い方を前にして調べられます。

今後、パーティクルと NGUI の SetRenderder メソッド、およびスパインと NGUI のソート メソッドを更新する予定です。

Unity レンダラーのユニティパーティクルエフェクト レベルの問題
については、Unity の SortingLayer、Order in Layer、および RenderQueue の記事を参照してください。

おすすめ

転載: blog.csdn.net/qq_45498613/article/details/132611609