テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】モデルより奥にあるスプライトやUIをモデルより手前に表示させる

f:id:tsubaki_t1:20150828233646p:plain

モデルよりUIやスプライトの方を手前に配置したい時があります。例えば、ダメージエフェクトであったり、その他諸々であったり。

これを実現するもっともシンプルな方法は、カメラをもう一台用意して追記する事です。Layerを分ける必要が出ますが、後から追記したUIやスプライトを確実に後に追記することが出来ます。

 

少し面倒なのがVRでコレを行うケースで、VRの場合はこういったギミックが使いにくいです。なので、モデルより奥にあっても手前に描画させる方法についてです。

キューとZバッファ

UIの描画順番はSortingLayerで行っていますが、SortingLayerだけでは不透明なオブジェクトの手前に描画する事は出来ません。
何故かと言えば、不透明なオブジェクトはZバッファ(深度情報)を使い、描画順に関わらず「手前のオブジェクトだけを描画」するようにしている為です。

SortingLayerは描画順を制御していますが、Zバッファによるデプステストの超パワーにより、モデルの後ろにある限り描画されません。

f:id:tsubaki_t1:20150828233632p:plain

逆を言えば、Zテストを無視すればオブジェクトは描画順番に従って手前に描画されます。

docs.unity3d.com

Shaderの設定とマテリアルの設定

ZテストのON/OFFはシェーダーの設定です。なのでシェーダーを作成しマテリアルに設定、あとは各UIにマテリアルを設定すればOKです。

f:id:tsubaki_t1:20150829000028p:plain

f:id:tsubaki_t1:20150829000109p:plain

f:id:tsubaki_t1:20150829000043p:plain

gist.github.com

ちなみに、このシェーダーはZ値を問答無用で無視します。もし壁の向こうにある等で表示したくないオブジェクトがある場合、頑張ってください。

関連

理由が無い限り、こっちの方が制御は楽

raharu0425.hatenablog.com

ベースのアイディア

http://hamaluik.com/posts/a-unity-46-ui-shader-to-ignore-depth-testing/