こんにちは、slashです。
今回はunity(2D)でのオブジェクト表示順位についてのメモみたいなものです。
また、Ad-Virtuaのモニターを設置するときの表示順位についても触れています。
Sceneに以下のように、red、blue、greenの3つのオブジェクトを配置して、表示の優先順位に影響しそうな要素を色々変更しながら表示がどうなるか確認してみました。

Sorting Layer
Sorting Layerは下の方にある方が手前に表示されます。
以下の画像だと優先順位はLayer3 > Layer2 > Layer1となります。

実際に、各オブジェクトにSorting Layerを設定してみました。

緑のオブジェクトに最も優先順位の高いLayer3を設定しているので、緑のオブジェクトが一番手前に表示されていますね。
Order in Layer
同じSorting Layer同士での重なりの場合、Order in Layerの数値が大きい方が手前に表示されます。
ちなみに私は基本的にOrder in Layerで優先順位の制御を行って、必要があれば他の要因で優先順位を制御するようにしています。
ただ、Order in Layerよりも、Sorting Layerの設定の方が優先されるのでこの点は注意が必要です。

実際に、各オブジェクトにOrder in LayerとSorting Layerを設定してみました。
赤と青のオブジェクトは、どちらも同じSorting Layerですが、青の方がOrder in Layerの数値が大きいので、青のオブジェクトは赤のオブジェクトより手前に表示されます。
緑のオブジェクトは最も優先順位が高いSorting Layerが設定してあるので、Order in Layerの数値とは関係なく緑のオブジェクトが最前面に表示されています。
オブジェクトのZ座標
Sorting Layer、Order in Layerがどちらも同じオブジェクト同士であれば、オブジェクトのZ座標が小さい方が手前に表示されます。
2Dでのゲーム制作だと、Z座標を意識する場面は少ないかもしれませんが、全くゲームに影響しないわけではないのですね。

実際に各オブジェクトのZ座標を設定してみました。赤、青、緑のオブジェクトはどれもSorting Layer、Order in Layerは同じ設定です。
最もZ座標の数値が小さい青のオブジェクトが最前面に表示されていますね。
Render Queue
オブジェクトに何らかのマテリアル(Material)をアタッチしている場合、マテリアルのRender Queue設定が表示順位に影響する場合があります。
実際にマテリアルを作成して、オブジェクトにアタッチしてみました。

RedMaterialという名前のマテリアルを作成し、インスペクターでShederをSprites/Defaultに設定します。するとRender Queueの項目が設定可能になります。
Render QueueをGeometry(2000)に設定して、このマテリアルを赤のオブジェクトにアタッチしてみました。青、緑のオブジェクトには特に新規のマテリアルのアタッチはしていないので、デフォルトのマテリアルの状態です。

上の画像では、赤いオブジェクトはSorting Layerは最も優先順位の高いLayer3にしていますが、マテリアルのRender QueueがGeometry(2000)になっており、最奥に表示されています。
Ad-Virtuaのモニター設置時にRender Queueの設定が重要になる?
ゲーム内に広告を設置できるサービス、Ad-Virtua(アドバーチャ)というものがあります。
Ad-Virtua
https://ad-virtua.com/devs
Scene内に専用の広告モニターのオブジェクト(以下、モニターと呼称します)を配置するだけで広告が設置できるという面白いサービスですが、最初はこのモニターの表示優先順位の設定に戸惑いました。
というのもモニターはどうやら3Dオブジェクトのようで、Sorting LayerやOrder in Layerの設定項目が無く、初期設定のままオブジェクトを配置すると、どうしても他の2Dオブジェクトの背後に表示されてしまうからです。
さすがにモニターが背景よりも後ろになってしまうのは焦りました(汗)

解決方法として、公式の開発者向けマニュアルには、モニターのRender QueueをTransParent(3000以上)に設定する、というような事が書かれていますが、どうもこれだけでは少し不十分だったので私が行った対策を書いておきます。
Ad-Virtuaモニターの表示優先順位を制御するためにやったこと
対策1.モニターのRender QueueをTransParent(3000以上)に設定する
モニターのインスペクターから、Render QueueをTransparent(3000以上)に設定します。Render Queueの数値を3000よりも大きい数値にすると、モニターが他のオブジェクトよりも前面に表示される場合もありますが、レイヤーやZ座標の関係によってはそうならない事もあります。

対策2.オブジェクトのZ座標を確認する
Render Queueの設定をしてもモニターが手前に表示されない場合は、オブジェクトのZ座標を変えてみます。先ほどZ座標が小さい方が手前に表示されると書きましたが、それはここでも同じです。つまり モニターのZ座標 < 2DオブジェクトのZ座標 という状況にすれば、モニターを手前に表示させる事ができます。

対策3.他の2Dオブジェクトのレイヤー設定を確認する
モニターと他の2DオブジェクトのZ座標が等しい場合は、2DオブジェクトのSorting LayerとOrder in Layerの設定を変更する事で表示の優先順が変わる場合があります。
私が確認したところ、モニターと他オブジェクトとの表示優先順位は以下のようになっていました。
2DオブジェクトのSorting LayerがDefaultよりも順位の高いレイヤーにセットされていると、2Dオブジェクトの方が手前に表示される。(つまりモニターの方が奥に表示される)
2DオブジェクトのSorting LayerがDefaultの場合は、Order in Layerが1以上だと2Dオブジェクトの方が手前に表示される。(つまりモニターの方が奥に表示される)
もしかしたら他の条件で状況が変わるかもしれませんが、Z座標をいじらずにモニターを手前に表示させたい場合は、2Dオブジェクトのレイヤー設定を行ってみると良いかもしれません。

コメント