C#スクリプトから指定のタイミング・座標にVFXエフェクトを出す
Questコントローラーのトリガーが押されたとき、コントローラーから出ているレイが当たっている場所にエフェクトを出すのを実装する
トリガーが押された際にレイが当たっている箇所の座標はC#ですでに取得できるようにしてあるので、その部分でついでに座標を指定してエフェクトを呼び出せば良い
エフェクトをノードベースで定義し、GPUで処理されて高速に実行できるVFX Graphの機能を使う
今回は指定した場所とタイミングで花火のように細かいパーティクルが360度とぶようなエフェクトを作る
(VFX歴3時間で実装した内容なので、もっといい方法あるかもです)
お勉強編
以下2つの動画を見て概要を知る
Unity6と一部仕様が異なっている箇所があるため、AIとかに聞きながら頑張る
https://www.youtube.com/watch?v=Xwmdl4sbsjY
https://www.youtube.com/watch?v=iCEHarLRCzI&t=211s
実装編
VFXのprefabのSendEventメソッドを呼び出すことで、Eventを発火させることができるらしい
つまり、イベント発火で自分がいる座標を中心に細かいパーティクルを発生させるエフェクトのprefabと、エフェクトのprefabをinstantiateして特定座標に動かし、発火イベントを呼ぶC#スクリプトがあればよい
VFX Graph
https://scrapbox.io/files/68551302456067c116154134.png
全体としては上のような感じになった
EventName"OnPlayExplosion"で反応するノードを作成し、Initialize Particleノードにつなげた
Initialize ParticleノードにTrigger Event (Always)ブロックをアタッチ、Countに60を指定
これでOnPlayExplosionが呼ばれるたびに60個イベントを発火させられる
Trigger EventからGPU Eventノードに接続し、Explosionコンテキストに接続
Explosionコンテキストは上の花火の動画から丸パクリしました
以下のようにすることでエフェクトのprefabのpositionと実際にエフェクトが発生する座標を同じにできる
https://scrapbox.io/files/68551406ed4cfa011ce88dbe.png
C#
C#側からはエフェクトのprefabをインスタンス化して、イベントを呼び出せばOK
code:cs
...(省略)
// トリガー押下で呼ばれる関数
public void OnSelect()
{
// エフェクトのインスタンス化
VisualEffect explosion = Instantiate(explosionPrefab, worldPosition, Quaternion.identity);
// イベント送信
explosion.SendEvent("OnPlayExplosion");
// 一定時間後に自動で破棄
Destroy(explosion.gameObject, 3f);
}