読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

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

UnityのSpriteとパーティクルとかモデルの描画順番について

f:id:tsubaki_t1:20150106003030g:plain

Unityのスプライトの描画順は「SortingLayerOrder In LayerZ値」の順番で設定します。

このSortingLayerですが、実はLineRendererParticleRendererTrail RendererといったSpriteRenderer以外にも適応されます。正しくは透明やブレンドを利用するレンダラーはSorting LayerDefaultに設定されており、その描画順に影響を受けます。

そのため、Defaultより前のSortingLayerが指定されたスプライトがある場合、例えZ値的に手前にあったとしても奥に描画されます。

下の画像はスフィアを表示したMeshRendererTransparentのシェーダーを付与して描画した結果です。球のZ値の方が手前に描画されているのですが、描画順はSortingLayerの順番に従って描画されています。

左の絵はDefaultより手前、右はDefaultより奥に描画される設定です。

f:id:tsubaki_t1:20150106002539p:plain

以前はプロパティが露出しておらずコードで設定する必要がありましたが、最近はパーティクルに設定が追加されており、割と簡単にこのSortingLayerを設定することが可能です。

f:id:tsubaki_t1:20160221003741j:plain

以下以前の方法

 

これを回避する手っ取り早い方法は、MeshRendererにもSortingLayerを指定してしまう方法があります。

 

実はrenderersortinglayer変数があり、ここにレイヤー名を指定することでsortinglayerを指定することが出来ます。またsortingOrderからOrder In Layerを指定することも出来ます。

_renderer.sortingLayerName = "レイヤー名";
_renderer.sortingOrder = Order in layerの値;

 

で、一々設定するのが面倒なので、この辺りを指定するコンポーネントを作成しました。Rendererをアタッチしたコンポーネントに追加して使用します。

SortingLayerはタグから取得してTypoを防いでいます。

f:id:tsubaki_t1:20150106004010p:plain

f:id:tsubaki_t1:20150106004018p:plain

 


SortingLayerを設定する。ShaderにTransparentとかParticle使っている場合はコレで描画順が制御出来る

 

https://raw.githubusercontent.com/wiki/tsubaki/Unity_UI_Samples/img/SortingLayer.gif

 

他にも描画順の設定方法は、「Cameraを複数用意して描画順に従い描画する」「Z値で描画順を指定する」といった事でも可能です。

ただし「Camera複数」は描画制御に若干の難があり、「Z値」は奥行きのあるモデルやエフェクトは奥行きが鑑賞しないように配置する必要があるので少し難しいところがあります。

 

なお、この方法が使えるのは透明を使っている「スプライト」や「StandardShaderのTransparent/Fade」、「Transparentシェーダー云々」「パーティクルのシェーダー」です。要は透明を使っているシェーダーは描画順にコレを使ってるってだけの話です。

関連

Unity2DのSpriteとParticleSystemの描画優先度設定 - Qiita

Effect の sortingLayer を設定するスクリプト | Unity | Obake Solutions

Unity4.3 2D描画の上にParticleが表示されない - kamemo -Unityはじめました-