はじめに
UnityにはVisualEffectGraphというParticleSystemの後継となるシステムがあります。(要URP or HDRP)
Shaderグラフのようにノードを接続してパーティクルを構築していくシステムになります。
本稿ではメッシュの表面からパーティクルを放出する方法について記載します。
こういうのができます。※この形状のメッシュをあらかじめ用意する必要あり
必要なもの
・形状を示すメッシュ
Blenderなどで作成したメッシュ(3dモデル)が必要です。
・パーティクル用のテクスチャ画像
本件で必須なものではないですが、何か適当なパーティクル用の画像
ノード構成
ノードの全体構造は下記のようになります。
今回のポイントはInitialize Particle内のSet Position(Mesh)です。
Placement ModeをSurfaceにすることで表面からパーティクルが放出されるようになります。
Meshには放出のもととなるMeshを指定します。
Mesh側の設定
前述の設定をすると表面からパーティクルが・・・おそらく出ません。
Meshの座標原点1箇所から出てしまうと思います。
その場合にはメッシュ側の調整が必要になります。
これはVFXGraph側の制限によるものです。
(参照:https://docs.unity3d.com/Packages/com.unity.visualeffectgraph@15.0/manual/Block-SetPosition(Mesh).html)
リンク先にあるようにMeshのRead/WriteをOnにする必要があります。
■FBXの場合
ProjectViewから該当のFBXを選択、インスペクタ上からインポート設定を変更します。
下図のようにRead/Writeにチェックを入れApplyを押して反映します。
すると表面上からパーティクルが出るようになると思います。
■メッシュアセットの場合
FBXをインポートしたものではなく.meshという拡張子でProjectに保存されている場合があります。
スクリプトからメッシュを作成し、アセットとして保存した場合などにこの形式で保存されている場合があるようです。
この形式で保存されているとインスペクタから設定を変更することができません。
この場合にはテキストエディタで編集します。
XXX.meshをテキストファイルで開くとm_IsReadable という項目があると思います。
これを1に変更します。
このときもし.meshがバイナリファイル(文字表示できない)となっている場合にはPreferenceからAsset SerializationをForce Textに変更してください。
変更後にテキストを開くと文字列が表示されるようになっていると思います。
注意点
MeshのRead/WriteをOnにするとGPU用とCPU用にメモリが2重で確保されます。
このため、複雑なメッシュで多用するとメモリの圧迫につながるので、使い所には注意する必要があります。
さいごに
今回はあらかじめ用意されているメッシュからパーティクルを放出する方法について記載しました。
クリスマスツリーの電飾など今回の方法を使うと簡単に実現できると思います。
採用できそうでしたら活用してみてください。
コメント