Onoty3D

Unityに関するメモとか

DepthMaskを使ってみる

過去にTwitterに挙げてたネタをすくい上げ。

ビームはBeamManPさんのサンプル(※)を利用させていただいておりますが、スカートに穴が空く表現部分は、DepthMaskというものを利用しています。
※BeamManPさんのサンプル

DepthMaskは、Unityでの描画順(RederQueue)を利用して、オブジェクトにマスクをかけるというものです。

参照

DepthMask - Unify Community Wiki

オブジェクトの一部をマスクする - Unityな日々(Unity Geek)

これを利用することで、
・単純に特定のオブジェクトを非表示する
・特定オブジェクトを非表示にすることで、そのオブジェクトによって隠されていたものをみえるようにする
なんてことが出来るようになります。

利用例として

【Unity】マウスだけでリンの服を透けさせてみた(やってみた編)【String】 ‐ ニコニコ動画:GINZA

Oculus Rift でミクさんに画面の中から出てきて頂いた ‐ ニコニコ動画:GINZA

等があります。

作り方

DepthMaskの作り方はUnityエディタのProjectViewでCreate>Shaderとやって、まずShaderを作ります。

Shaderが出来たら、中のコードをはじめに掲げたサイト内にあるShaderのコードに書き換えて保存します。

次にMaterialを作ります。同様にCreate>Materialとやりますが、先ほど作ったShaderを選択した状態で、Create>Materialとやると、はじめから選択したShaderが適用されたMaterialが作成されるので便利です。

このMaterialを適用させたオブジェクトが、マスクになります。


とりあえず適当な球体をつくって、それに適用させてみました。

f:id:onoty3d:20150312203135p:plain

このままだと、マスクのRederQueueが"Geometry+10"で2010、他のオブジェが大体2000なので、何もマスクされません。

よって、マスクしたい対象のRederQueueを2010より大きくします。

前述のサイトでは、別途SetRenderQueue.csというスクリプトを用意して、マスクしたい対象のRenderQueueを3000に引き上げていますが、直接手で書き換えるのが早い場合もあります。

というわけで手で書き換えます。書き換え方法として、RenderQueueに関するERALさんのツイートが非常にわかりやすく参考になります。

https://twitter.com/eral_r_l/status/495866386581712897

f:id:onoty3d:20150312203301p:plain

スカートだけに穴を開けたいので、スカートに適用されたMaterialのRenderQueueを変更します。

ただし初期状態の場合、スカートに適用されたMaterialのTex_Dressは上着やその他にも適用されているため、これのRenderQueueを変えてしまうと、スカート以外もマスクされるようになってしまいます。

よって、スカートだけのMaterialを先につくります。

Tex_Dressを複製し、Tex_Skirtという名前にします(名前はなんでもいいけど)。
それをプロ生ちゃんのSkinedMeshRendererのElement2,3(スカートの表と裏)に適用させます。

f:id:onoty3d:20150312203508p:plain

次にインスペクタのタブ上で右クリックして、モードをDebugに切り替えます。

f:id:onoty3d:20150312204502p:plain

Materialの表示項目が変化するので、Tex_SkirtのCustomRenderQueueの値を-1から2020(2010より大きな値)に変更します。

f:id:onoty3d:20150312203550p:plain

これで無事スカートがマスクされました!

f:id:onoty3d:20150312203603p:plain


Tweetを投稿した時は、さらにこの球体をプレハブにして、ビームが当たった瞬間、その場にそれをinstantinateして、穴が開いたように見せかけていました。

このやり方だとどんどんオブジェクトが増えるので、実用的ではないと思いますが、こういった小ネタくらいなら手軽で有用だと思います。