
VFXグラフで簡単に雨を降らせてみました。
VFXグラフを新規作成しました。Spawnコンテキストでは、Periodic Burstブロックで定期的にパーティクルを出します。数と間隔を両方ともx-yの範囲内のランダムにしています。

Initializeでは、BoundsとPosition(AABox)の位置にスクリプトからセットするFPSキャラクターのカメラの位置を入れます。Boundsの範囲内にカメラがあるときにエフェクトが表示されるので、これを常にカメラと同じ位置にします。

Position (AABox)では、設定したサイズの直方体の表面からパーティクルを発生されます。これを常にカメラの少し上の位置にして、カメラの周りだけに雨を降らせています。サイズのYが0なので平面になっています。

プレイヤーのポジションとボックスの高さはインスペクタやスクリプトから設定できるようにしています。Boundsへは直接入れて、Position(AABox)へは、xとzが0でyを調節できるVector3の値と足してから接続しています。

Updateでは重力を加えます。高さが足りないとカメラの前を通過するときにはまだスピードが遅いので、InitializeコンテキストにSet Velocityブロックを置いて初速を設定しています。

Outputでは、Orient : Fixed Axisで軸を固定したまま画像が常にカメラを向くようにしています。Orient : Face Camera Plane等を使うと、上を見た時に画像が傾いてしまって不自然です。


Orient : Fixed Axisも自動でカメラの方を向くようです。Orientationのブロックを何も使わない場合は回転しません。


サイズはランダムにして、Blend Scaleで画像を縦長に引き伸ばしました。Blend Alphaで不透明度を調節しています。
そして、これをアタッチしたVisual Effectオブジェクトにスクリプトを付けて、カメラ位置を常に更新するようにしました。
using UnityEngine;
using UnityEngine.VFX;
public class RainEffect : MonoBehaviour
{
VisualEffect visualEffect;
// Start is called before the first frame update
void Start()
{
visualEffect = GetComponent<VisualEffect>();
}
// Update is called once per frame
void Update()
{
visualEffect.SetVector3("PlayerPosition", Camera.main.transform.position);
}
}
これで簡単に雨を降らせられました。
