Unityのスプライトの描画順は「SortingLayer、Order In Layer、Z値」の順番で設定します。
このSortingLayerですが、実はLineRendererやParticleRenderer、Trail RendererといったSpriteRenderer以外にも適応されます。正しくは透明やブレンドを利用するレンダラーはSorting LayerがDefaultに設定されており、その描画順に影響を受けます。
そのため、Defaultより前のSortingLayerが指定されたスプライトがある場合、例えZ値的に手前にあったとしても奥に描画されます。
下の画像はスフィアを表示したMeshRendererにTransparentのシェーダーを付与して描画した結果です。球のZ値の方が手前に描画されているのですが、描画順はSortingLayerの順番に従って描画されています。
左の絵はDefaultより手前、右はDefaultより奥に描画される設定です。
以前はプロパティが露出しておらずコードで設定する必要がありましたが、最近はパーティクルに設定が追加されており、割と簡単にこのSortingLayerを設定することが可能です。
以下以前の方法
これを回避する手っ取り早い方法は、MeshRendererにもSortingLayerを指定してしまう方法があります。
実はrendererにsortinglayer変数があり、ここにレイヤー名を指定することでsortinglayerを指定することが出来ます。またsortingOrderからOrder In Layerを指定することも出来ます。
_renderer.sortingLayerName = "レイヤー名";_renderer.sortingOrder = Order in layerの値;
で、一々設定するのが面倒なので、この辺りを指定するコンポーネントを作成しました。Rendererをアタッチしたコンポーネントに追加して使用します。
SortingLayerはタグから取得してTypoを防いでいます。
SortingLayerを設定する。ShaderにTransparentとかParticle使っている場合はコレで描画順が制御出来る
他にも描画順の設定方法は、「Cameraを複数用意して描画順に従い描画する」「Z値で描画順を指定する」といった事でも可能です。
ただし「Camera複数」は描画制御に若干の難があり、「Z値」は奥行きのあるモデルやエフェクトは奥行きが鑑賞しないように配置する必要があるので少し難しいところがあります。
なお、この方法が使えるのは透明を使っている「スプライト」や「StandardShaderのTransparent/Fade」、「Transparentシェーダー云々」「パーティクルのシェーダー」です。要は透明を使っているシェーダーは描画順にコレを使ってるってだけの話です。
関連
Unity2DのSpriteとParticleSystemの描画優先度設定 - Qiita