「Output Event」コンテキストを使って、スポーンイベントのトリガーと同時にスクリプトを実行してみました。
Output Eventコンテキスト
VFXグラフがバージョン10以上なら、「Output Event」コンテキストが使えるはずです。
これは入力がスポーンイベントで、出力はありません。今回はスポーンコンテキストを、Initializeコンテキストだけでなく、このOutput Eventコンテキストにも接続しました。
スポーンコンテキストでは、インスペクタでSettingsを変更して、2秒のループと1秒の遅延を5回繰り返すようにしました。
Constant Spawn RateブロックのRateの値が16なので、Loop Durationの間は、毎秒16回のスポーンイベントをトリガーします。
スクリプトを追加する
このVFXグラフをアタッチしたVisual Effectオブジェクトに、スクリプトを付けます。
このスクリプトではVFXOutputEventAbstractHandlerクラスを継承します。参考:https://docs.unity3d.com/Packages/com.unity.visualeffectgraph@11.0/manual/OutputEventHandlers.html
namespace UnityEngine.VFX.Utility
{
public class SpawnCube : VFXOutputEventAbstractHandler
{
public override bool canExecuteInEditor => true;
[SerializeField] GameObject cube;
static readonly int kPosition = Shader.PropertyToID("position");
public override void OnVFXOutputEvent(VFXEventAttribute eventAttribute)
{
Vector3 position = eventAttribute.GetVector3(kPosition);
position.y += 8f;
Instantiate(cube, position, cube.transform.rotation);
}
}
}
このクラスでは、canExecuteInEditorプロパティと、OnVFXOutputEventメソッドにabstractキーワードが付いているので、継承したクラスに実装を書く必要があります。
上のようにUnityEngine.VFX.Utility名前空間を定義して、この2つのメンバをオーバーライドするとエラーがなくなりました。
このスクリプトがアタッチされたVisual Effectオブジェクトで、アウトプットイベントがトリガーされたときに、OnVFXOutputEventメソッドが呼ばれます。
上のスクリプトではその時にCubeをインスタンス化しています。引数にイベントアトリビュートが渡されます。
canExecuteInEditorプロパティ
canExecuteInEditorプロパティがtrueだと、エディタでエフェクトが再生されたときにも、OnVFXOutputEventメソッドが呼ばれてCubeが作られるので大変なことになりました。
インスペクタで、canExecuteInEditorのチェックを外すと出なくなりますが、大量のCubeは残るので消しました。
サンプルスクリプト
パッケージマネージャーでVFXOutputEventAbstractHandlerのサンプルスクリプトをインポートできます。
Assetsフォルダに様々な種類のサンプルがインポートされます。