DepthMaskを使ってみる
過去にTwitterに挙げてたネタをすくい上げ。
BeamManP(@BeamManP)さんのビームを使ってみた! 被験体はプロ生ちゃん。 pic.twitter.com/M7lgSMZrqF
— オノッチ (@onotchi_) 2015, 1月 6
ビームは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を適用させたオブジェクトが、マスクになります。
とりあえず適当な球体をつくって、それに適用させてみました。
このままだと、マスクのRederQueueが"Geometry+10"で2010、他のオブジェが大体2000なので、何もマスクされません。
よって、マスクしたい対象のRederQueueを2010より大きくします。
前述のサイトでは、別途SetRenderQueue.csというスクリプトを用意して、マスクしたい対象のRenderQueueを3000に引き上げていますが、直接手で書き換えるのが早い場合もあります。
というわけで手で書き換えます。書き換え方法として、RenderQueueに関するERALさんのツイートが非常にわかりやすく参考になります。
https://twitter.com/eral_r_l/status/495866386581712897
スカートだけに穴を開けたいので、スカートに適用されたMaterialのRenderQueueを変更します。
ただし初期状態の場合、スカートに適用されたMaterialのTex_Dressは上着やその他にも適用されているため、これのRenderQueueを変えてしまうと、スカート以外もマスクされるようになってしまいます。
よって、スカートだけのMaterialを先につくります。
Tex_Dressを複製し、Tex_Skirtという名前にします(名前はなんでもいいけど)。
それをプロ生ちゃんのSkinedMeshRendererのElement2,3(スカートの表と裏)に適用させます。
次にインスペクタのタブ上で右クリックして、モードをDebugに切り替えます。
Materialの表示項目が変化するので、Tex_SkirtのCustomRenderQueueの値を-1から2020(2010より大きな値)に変更します。
これで無事スカートがマスクされました!
Tweetを投稿した時は、さらにこの球体をプレハブにして、ビームが当たった瞬間、その場にそれをinstantinateして、穴が開いたように見せかけていました。
このやり方だとどんどんオブジェクトが増えるので、実用的ではないと思いますが、こういった小ネタくらいなら手軽で有用だと思います。