Unityのパーティクルシステムを使って雨や雪を降らす

今回はUnityのParticle Systemを使って雨や雪をゲーム内に降らせてみようと思います。

Asset Storeで探せば色々なエフェクトが見つかり、それを使えば高度なエフェクトが可能です。
しかし、雨や雪となると無料ではなかなか見つかりません。

と思ったら雨を降らせるエフェクトが無料でありました!

Asset Store→パーティクルシステム→気象→Rain Maker

インポートしたRain MakerフォルダのPrefab→RainPrefabをシーン上に配置し、
インスペクタ上でRain ScriptのCameraにゲーム内を描画しているカメラをドラッグ&ドロップすればOKです。

Unityの実行ボタンを押した後、Rain Script内のパラメータを変更してお気に入りの設定を探す事が出来ます。
大まかに設定を書いておくと

Rain intensityは雨の強さ
Rain Mist Thresholdは霧雨具合?
Enable Windにチェックを入れると設定したWind Zoneの影響が雨に表れます。

Enable Windにチェックを入れると、ゲーム内に他のWind Zoneを設定していた場合は双方の影響がゲーム内に表れてしまいます。

これでゲーム内に雨を降らせる事が出来るようになりました!
と偉そうに言ってますが、これでは雨を降らせるエフェクトを紹介しただけなので・・・(^_^;)

スポンサーリンク

パーティクルシステムで雪を降らす

雪をParticleSystemで作成し、振らせてみようと思います。

snow1

まずはヒエラルキー上で右クリックからParticle Systemを選択します。
名前をSnow Systemと変更します。

主人公キャラクターの子要素にSnow Systemを移動させます。
これは主人公の子要素にすれば雪が降る位置も一緒に移動出来るからです。

snow2

Snow Systemを配置する場所は主人公の頭の上でカメラの全体像に入る範囲を指定します。
範囲内にしか雪が降らないので、カメラに入る範囲(横)は全体をカバーする範囲の大きさに設定しておく必要があります。

パーティクルの範囲の指定はParticleSystem内で行うのでここではY座標の位置だけ指定します。

また雪は上から下に落ちてくるようにしなければならない為X軸の角度を90度回転させて上から下に落ちるようにします。
これでとりあえず配置が出来たので、雪のエフェクトを作っていきます。

まずはメインの設定です。

snow3

Durationはパーティクルシステムの動作時間です。その下のLoopingにチェックが入っていなければ5秒間だけ動作します。
永遠にパーティクルを発生させたい場合はLoopingにチェックを入れておきます。

Start LifeTimeは発生させたパーティクルの生存時間です。1だと1秒後に消えます。
Start Speedはパーティクルの初期速度です。この速度で移動を開始します。
Start Sizeはパーティクルのサイズ
Start Colorはパーティクルの色
Gravity Modifierはパーティクルにかかる重力値を設定します。

Simulation SpaceはLocalからWorldに変更してください。

これはLocalだとキャラクターと一緒にSnow Systemも動きますので、降らせた雪が主人公と一緒に動いてしまいます。

Worldに設定しておくとワールド空間に雪が降るので主人公が前に進むと主人公の方向に雪がぶつかってるように見えます。
雪は下に落ちているだけですが、主人公がそちらに進んだ分ぶつかってくるように感じます。

Scaling ModeはShapeにしておきます。これはパーティクルの発生位置にスケールだけを反映させるみたい。
細かい所はよくわかりません・・・。

Max Particleは同時に発生出来るパーティクルの数です。

次にEmissionにチェックを入れRateに50を入力します。
これは時間経過や移動時間に応じて発生するパーティクルの数です。
この値を大きくすると雪の数が増えます。

次にShapeをチェックし、ShapeをBoxにします。空のように特定の範囲で雪を降らせたい為この形状にしました。

Box Xを10
Box Yを4
Box Zを2.5

としました。

snow4

Boxの大きさの設定した後は上のような範囲になりました。
頭の上でキャラクターの前後と左右の幅をカバーする範囲を設定してください。

snow5

WindZone(風を吹かせる機能)の影響をパーティクルにもたらす

次にExternal Forcesにチェックを入れ、Multiplierに1を設定します。

これはWind Zoneの影響をパーティクルに与える為の設定で、Multiplierに1を設定すると、
風の影響がそのまま反映されます。風の影響より強い影響を与えたい場合は、1より値を大きくします。
0にすると風の影響を受けません。

Wind Zoneに関しては

Unityで木が風になびく機能を追加する
Unityに設置した木が風で揺れるようにします

を参照してください。

次にCollisionにチェックを入れます。
Collisionはその名の通りパーティクルが他のコライダを持つオブジェクトと衝突した時の設定です。

まずは設定をWorldの3Dにします。

Dampenを1にします。Dampenは衝突時のスピードの減速値を少数値で与えます。1なので完全に止める?
Collision Withで衝突判定を行うレイヤーを設定出来ます。

Enable Dynamic Collidersにチェックを入れると動いているゲームオブジェクトとも衝突判定を行います。
主人公と衝突した時も衝突判定がされるので、主人公とぶつかった雪は消えます。

これで雪のエフェクトが完成したので、Unityの実行ボタンを押して確認してみます。

snow6

上のように雪を降らせる事が出来るようになりました。
特に狙ったわけではないんですが、雪が地面に到達すると同時に消えるのではなく零コンマ数秒間だけ残るのがいいですね。

パラパラまばらに降っていますが、EmissionのRateの数値を上げるとかなりの量降らせる事が出来ます。
またWind Zoneの風の強さを変更すると雪が横殴りに降るという事も演出出来ます。

ParticleSystemは複雑な設定があってなかなかうまく使う事が出来ませんが、
Asset Storeからダウンロードするだけでなく、自分でもどんどん作成出来たらいいですね。

以前作った血しぶきのエフェクトもちゃんとしたものに作り替えないといけないんですが・・・・。

キャラクターが屋内に入る時は注意が必要

--以降追記--

大草原のような場所(建物内等を考慮しない場所)であれば問題はないんですが、
パーティクルシステムを配置する位置によっては建物内に入っても建物の中で雪が降ってしまいます。

今回の設定では主人公の少しだけ頭上にパーティクルシステムであるSnow Systemを配置していましたが、これが原因で建物内にも雪が降ってしまいます。

そこで建物内では雪が降らないようにする為にSnow Systemの位置を変更します。

snow7

Snow Systemの位置を少し上に設定し直します。

snow8

次に建物内から外を見た時に雪が降っていないとおかしいので、Snow Systemの範囲を広げます。
建物内から外が見える範囲が広い場合はSnow Systemの範囲を広げる必要があります。

snow9

上の画像がSnow Systemの範囲です。かなり大きくなりました・・・・(^_^;)
建物の高さが高い場合はSnow System自体の高さもキャラクターよりかなり高い位置から発生させる必要が出てきます。
Start Lifetimeも伸ばさないといけませんね。

今回の修正でパーティクルの設定であるCollisonの機能が明確に反映されてるのがわかったのでよかったです。(-.-)