VFXグラフを使って、エフェクトを一発ずつ出してみました。また、Visual Effectオブジェクトを毎回作るのでなく、発射する前に位置を変更して、同じオブジェクトを使います。
VFXグラフを作る
まず、Single Burstブロックでパーティクルを一つずつ出すようにしました。また、Startから上の何もないところへドラッグアンドドロップして、Eventコンテキストを作りました。
飛ばす方向や位置はプロパティにして外から変えられるようにしています。
スクリプトで発射する
スクリプトでカメラからレイを飛ばし、当たったところの位置と法線を取得します。それをVisual Effectに設定して、エフェクトを再生します。
using UnityEngine;
using UnityEngine.VFX;
public class EffectTest : MonoBehaviour
{
[SerializeField] VisualEffect vfx;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
// 左クリックした時
if(Input.GetMouseButtonDown(0))
{
// レイ
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// レイを飛ばす
if (Physics.Raycast(ray, out RaycastHit hitInfo, Mathf.Infinity))
{
// 位置を設定
vfx.SetVector3("Pos", hitInfo.point);
// 速度を設定
vfx.SetVector3("Dir", hitInfo.normal);
// 再生する
vfx.Play();
//vfx.SendEvent("Fire");
}
}
}
}
位置や法線はワールド座標にすると、Visual Effectオブジェクトの向きの影響をうけません。
再生するためのPlayメソッドは、Eventコンテキストが無いときや、イベント名が「OnPlay」の時に使えるようです。イベント名を変えた場合は、SendEventメソッドを使うと再生できます。
これで同じオブジェクトから、好きな時に一発ずつエフェクトを出せました。