テラシュールブログ

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

Unityで実行時にマテリアルの差替え/追加(ロックオンエッジ的な表現)

ゲームを作っている内に、特定のオブジェクトのシェーダーを差替えたくなるケースが有ります。例えば、対象をロックオン・選択してる的な表現したり、今まで光っていなかった物を光らせたり等のケースです。

 

これについては、やり方が色々とあります。

 

ある意味一番単純で一番使われているであろう方法は、rendererのマテリアルを差替ええる方法です。マテリアルを差し替える方法は色々とありますが、こういった予定の場合はコードで差替えてしまうのが楽でしょう。

単一のマテリアルを追加・削除する。

f:id:tsubaki_t1:20140921002521g:plain

 

もう一つの方法として、Projectorを使用する方法があります。これは、Projectorコンポーネント範囲内のモデルに特定のマテリアルを追加する機構を使用しています。

つまり、ProjectorのMaterial部分にEdgeを登録しておけば、後は範囲内に入れば勝手にエッジが追加されます。

f:id:tsubaki_t1:20140921000449g:plain

f:id:tsubaki_t1:20140921093815p:plain

 

もし、範囲が超広い場合(画面全体が対象の場合)、いっそのこと画面範囲内に映るモデルのシェーダーを全て差し替える方法も考えられます。そういった場合、

SetReplacementShader(shader, null)

で全てのシェーダーを差替えてしまう手もあります。これを上手く使えば、イメージエフェクトのように全体の雰囲気を一気に変更する事が可能そうです。

下の演出は、Free nightvision shader for unity free | Unity Communityのシェーダーを使用しています。

 

f:id:tsubaki_t1:20140921003659g:plain

ちなみに、以前紹介したソナー風の演出もSetReplacementShaderを使用していました。これは、一定距離を赤く表示するシェーダーでレンダリング結果を差替えています。


Unityでソナーのような表現 - テラシュールブログ

 

なお、SetReplacementShaderはマテリアルと比べてパラメータの設定・調整が少し面倒です。

パラメータを変更するには、Shader.SetGlobalFloatを使用して、全体のシェーダーパラメータを差替えなければならないので、これをやる場合は専用コンポーネントを用意するのが良さそうです。

 

今回使ったエッジ等のシェーダーは、Silhouette-Outlined Diffuse - Unify Community Wikiをお借りしました。

 

ちなみに四角のロックオンを追加する場合、Unityでパンツが見えそうなら「見せられないよ!」する の”パンツの位置に「見せられないよ」を出す”と同じことをすれば良いです。