「Set Position (Shape: Mesh)」ブロックを使って、VFXグラフでメッシュの頂点からランダムにパーティクルを出してみました。
VFXグラフを作る
まず、Projectウィンドウで右クリックして新しいVFXグラフを作ります。
このVFXグラフアセットを選択しているときに、ヒエラルキーウィンドウでVisual Effectオブジェクトを作ると、このアセットがAsset Templateにアタッチされます。
その横の「Edit」ボタンでVFXグラフウィンドウを開きます。
スポーンコンテキストでは、「Single Burst」ブロックを使って126個のパーティクルを一度に発生させるようにしました。
そして、メッシュの頂点の位置にパーティクルを出すために、Initializeコンテキストに「Set Position (Shape: Mesh)」ブロックを作りました。
Spawn ModeをRandomにすると、パーティクルごとにランダムに計算されます。MeshにProjectウィンドウから猿のメッシュをドラッグアンドドロップしました。
これで、パーティクルが猿のメッシュの形に並ぶはずですが、すべてのパーティクルが一点に置かれています。
これは、FBXファイルを選択してインスペクタの「Model」タブで「Read/Write Enabled」のチェックを入れて適用ボタンを押すと解決しました。
しかし、このままではVissual Effectオブジェクトと猿のオブジェクトの位置と回転が同じでないと、猿のオブジェクトとパーティクルの位置がズレてしまうようです。
そこで、パーティクルを発生させるときに、猿のオブジェクトの位置・回転にVisual Effectをインスタンス化することにしました。
スクリプト
空のゲームオブジェクトにスクリプトを付けて、ヒエラルキーウィンドウにある猿のオブジェクトと、プレハブ化したVisual Effectをアタッチしました。
Visual Effectのプレハブでは、Initial Event Nameを「On Play」にして、インスタンス化されるとエフェクトが再生されるようにしています。
また、猿のオブジェクトにアニメーションを付けました。
スクリプトでは、キー入力で猿を非表示にして、Visual Effectのプレハブをインスタンス化し、アニメーションの速度を0にします。もう一度入力すると、猿を表示してアニメーションの速度を1にします。
using UnityEngine;
using UnityEngine.VFX;
public class VFXTest3 : MonoBehaviour
{
// Visual Effectのプレハブ
[SerializeField] VisualEffect vfx;
// 猿のメッシュレンダラー
[SerializeField] MeshRenderer source;
// 猿のアニメーター
Animator animator;
// Start is called before the first frame update
void Start()
{
// アニメーターコンポーネントを取得
animator = source.GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
// キー入力
if(Input.GetKeyDown(KeyCode.R))
{
// メッシュレンダラーが有効のとき
if(source.enabled)
{
// メッシュレンダラーを無効にする
source.enabled = false;
// Visual Effectを猿の位置・回転にインスタンス化
Instantiate(vfx,source.transform.position,source.transform.rotation);
// アニメーションを停止
if (animator != null) animator.speed = 0f;
}
// メッシュレンダラーが無効のとき
else
{
// メッシュレンダラーを有効にする
source.enabled = true;
// アニメーションを再開
if (animator != null) animator.speed = 1f;
}
}
}
}
これで、動く猿が蒸発して消えるようなエフェクトが作れました。実際はVisual Effectを事前にインスタンス化しておいたり、残しておくインスタンスの数を制限するなどの工夫が必要かもしれません。