Onoty3D

Unityに関するメモとか

VertExmotionでおきゅたんのほっぺをつつく。

f:id:onoty3d:20180811044612p:plain


この記事はUnity アセット真夏のアドベントカレンダー 2018 Summer!
の11日目の記事です。

自分の中のロードマップでは拙作Character Particleの機能追加版がすでに公開されている予定であったため、本来そちらを紹介するつもりでしたが、全然出来ていないので、保険で予告タイトルに含めていたVertExmotionの方を取り扱います。

VertExmotion


VertExmotionは、シェーダーで頂点を移動させることにより、オブジェクトをプルンプルンに見せたり出来るアセットです。

揺れ表現、例えば揺れものスクリプトを使う場合は対象モデルにボーンが必須になりますが、このアセットはメッシュの頂点移動での揺れ表現の為、ボーンが無いものにも利用できます。

アセットはノーマルとPro版がありますが、Pro版ではすべてのソースコードの公開と新機能のベータ版、優先サポートなどが保証されています。

f:id:onoty3d:20180811012552p:plain

これをつかって、今回はおきゅたんのほっぺをツンツン(タプタプ?)してみました。

こんな感じ。

ちょっとまだツメが甘いですが、調整を重ねた暁には、「おきゅたんツンツンシステム」として設立したいと思っております。

さて設定方法。
解説動画があるんで、大まかな部分はそちらを参照してください。


初期操作としては、揺らしたいモデルの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)の処理の中で、その値にしたがって頂点を動かしていってる感じです。
元の頂点に対しスクリプト側から情報をセットする感じなので、頂点数を増やすテッセレーション処理には使えないようです。テッセレーションへの対応が出来たら素敵なのですが。

全体通して、少しハマったところ
はじめ、下図のように、センサーを両頬が入る大きさにしていました。
(オレンジの円がセンサー範囲。)

f:id:onoty3d:20180811041842p:plain
こうした場合、センサーに含まれるすべての頂点が動いてしまいます。

なのでセンサーは、本当に動かしたい部分に範囲を狭め、狙ったところだけが影響を受けるようにしましょう。

f:id:onoty3d:20180811042642p:plain

f:id:onoty3d:20180811042750p:plain

右頬、左頬、それぞれ別のセンサーで管理している

センサー、エフェクト、コライダーは実行時も調整が可能であるため、実際に動かしながら調整していくといいと思います。

詳しい操作を動画任せにしてしまいましたが、以上となります~!