VertExmotionでおきゅたんのほっぺをつつく。
この記事はUnity アセット真夏のアドベントカレンダー 2018 Summer!の11日目の記事です。
自分の中のロードマップでは拙作Character Particleの機能追加版がすでに公開されている予定であったため、本来そちらを紹介するつもりでしたが、全然出来ていないので、保険で予告タイトルに含めていたVertExmotionの方を取り扱います。
VertExmotion
VertExmotionは、シェーダーで頂点を移動させることにより、オブジェクトをプルンプルンに見せたり出来るアセットです。
揺れ表現、例えば揺れものスクリプトを使う場合は対象モデルにボーンが必須になりますが、このアセットはメッシュの頂点移動での揺れ表現の為、ボーンが無いものにも利用できます。
アセットはノーマルとPro版がありますが、Pro版ではすべてのソースコードの公開と新機能のベータ版、優先サポートなどが保証されています。
これをつかって、今回はおきゅたんのほっぺをツンツン(タプタプ?)してみました。
こんな感じ。
ちょっとまだツメが甘いですが、調整を重ねた暁には、「おきゅたんツンツンシステム」として設立したいと思っております。
さて設定方法。
解説動画があるんで、大まかな部分はそちらを参照してください。
初期操作としては、揺らしたいモデルのSkinnedMeshRendererにVertExmotionスクリプトをセットし、さらにそのマテリアルのシェーダをVertExMotionに対応したものにする感じです。
Rendererが複数のマテリアルをもつ場合は、動かしたいサブメッシュのマテリアルのみシェーダーを変える感じで大丈夫です(例えば顔のマテリアルのみとか)。
UnityのビルトインシェーダーをVertExmotionに対応させたものはアセットに付属しているので、特に自分で用意せずそのまま使えます。
それ以外のシェーダーでVertExmotionの効果を使いたい場合は、シェーダーに手を入れる必要があります。改造自体は簡単なので、少し解説します。
例えば自分がおきゅたんモデルに利用しているUTS2の場合。
下準備
・VertExmotion.cgincをToon_DoubleShadeWithFeather.shaderがあるフォルダと同じフォルダにいれる
・Toon_DoubleShadeWithFeather.shader
UCTS_Outline.cginc
UCTS_DoubleShadeWithFeather.cginc
UCTS_ShadowCaster.cginc
をそれぞれ複製し、
Toon_DoubleShadeWithFeatherVert.shader
UCTS_OutlineVert.cginc
UCTS_DoubleShadeWithFeatherVert.cginc
UCTS_ShadowCasterVert.cginc
などの名前にする。
Toon_DoubleShadeWithFeatherVert.shaderの修正
・アウトライン用ほか、いくつかPassがあるので、各Pass内でVertExmotion.cgincをincludeする。
またUCTS_Outline.cgincやUCTS_DoubleShadeWithFeather.cginc、UCTS_ShadowCaster.cgincのinclude部分は、それぞれVertexEmotion対応したものに書き換える。
UCTS_OutlineVert.cginc、UCTS_DoubleShadeWithFeatherVert.cginc、UCTS_ShadowCasterVert.cgincの修正
・VertexInputにfloat4 color : COLOR;を追加
・vert処理の冒頭で、v.vertex = VertExmotion(v.vertex, v.color);を呼び出す
分かりづらいのでGist追加
これでUTS2もVertExmotionに対応できます。有料アセットなのでなかのコードの詳解は避けますが、スクリプト側で頂点カラーに情報を詰め込み、VertExmotion(v.vertex, v.color)の処理の中で、その値にしたがって頂点を動かしていってる感じです。
元の頂点に対しスクリプト側から情報をセットする感じなので、頂点数を増やすテッセレーション処理には使えないようです。テッセレーションへの対応が出来たら素敵なのですが。
全体通して、少しハマったところ
はじめ、下図のように、センサーを両頬が入る大きさにしていました。
(オレンジの円がセンサー範囲。)
こうした場合、センサーに含まれるすべての頂点が動いてしまいます。
なのでセンサーは、本当に動かしたい部分に範囲を狭め、狙ったところだけが影響を受けるようにしましょう。
右頬、左頬、それぞれ別のセンサーで管理している
センサー、エフェクト、コライダーは実行時も調整が可能であるため、実際に動かしながら調整していくといいと思います。
詳しい操作を動画任せにしてしまいましたが、以上となります~!