UnityのVFX Graph 11.0(Unity 2021.1.9f1+)からVFX Graph内でSkinned Meshからサンプリングできるようになったので使い方を解説します。
この記事は以下のバージョンで検証しています。
- Unity: 2021.3.18f1
- Visual Effect Graph: 12.1.1.0
以前のバージョンでも以下のパッケージを使用すればSkinned Meshからサンプリングできましたが、VFX Graph公式が対応してくれたことで利用しやすくなりました。(このパッケージも公式が対応したことで、公式実装の利用サンプルに内容が変わっているようです。)
GitHub - keijiro/Smrvfx: Skinned mesh sampling with VFX Graph
準備
VFX GraphでSkinned Meshをサンプリングするために、使用するSkinned MeshのImport SettingsでRead/Write
にチェックを入れておく必要があります。
Set Position (Skinned Mesh) Blockを使用する方法
Set Position (Skinnend Mesh)
Blockを使用することでSkinned Meshから位置をサンプリングしてパーティクルの位置に設定することができます。
Set Position (Mesh) | Visual Effect Graph | 12.0.0
Skinned Mesh Renderer
をプロパティとして設定する必要がありますが、ここはシーン内にあるものを指定したいのでグラフ自体にSkinned Mesh Renderer
プロパティを追加して、それを利用するようにします。このBlockでサンプリングできる位置はオブジェクトスペースなので、ボーンルートのTransformを適用して位置を再設定します。Transformを適用するにはTransform Binder
コンポーネントを使用するのが簡単です。
Sample Skinned Mesh Operatorを使用する方法
Set Position (Skinnend Mesh)
Blockは位置を設定するだけでしたが、Sample Skinned Mesh
Operatorを使用すると、より複雑なネットワークを作ることができます(ただし、以下のサンプルではSet Position(Skinned Mesh)
Blockを使用したサンプルと同じ挙動になるようにしています)。
Sample Mesh | Visual Effect Graph | 12.0.0
Sample Skinned Mesh
OperatorでPlacement Mode
をSurface
、Surface Coordinates
をUniform
にした場合、どの三角形プリミティブ(Triangle
プロパティ)のどの位置(Square
プロパティ)からサンプリングするかを指定する必要があります。メッシュを構成する三角形プリミティブの数はSkinned Mesh Index Count
Operatorで取得できるインデックス数を3で割ることで求まるので、上のグラフではその値をもとに設定しています。
Mesh Index Count | Visual Effect Graph | 11.0.0
Sample Skinned Mesh
Operatorから取得できる値はPosition
だけでなく、Color
やTexCoord0
、Normal
なども取得することができ、Sample Skinned Mesh
Operatorのインスペクターから設定することができます。