今回は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で作成し、振らせてみようと思います。
まずはヒエラルキー上で右クリックからParticle Systemを選択します。
名前をSnow Systemと変更します。
主人公キャラクターの子要素にSnow Systemを移動させます。
これは主人公の子要素にすれば雪が降る位置も一緒に移動出来るからです。
Snow Systemを配置する場所は主人公の頭の上でカメラの全体像に入る範囲を指定します。
範囲内にしか雪が降らないので、カメラに入る範囲(横)は全体をカバーする範囲の大きさに設定しておく必要があります。
パーティクルの範囲の指定はParticleSystem内で行うのでここではY座標の位置だけ指定します。
また雪は上から下に落ちてくるようにしなければならない為X軸の角度を90度回転させて上から下に落ちるようにします。
これでとりあえず配置が出来たので、雪のエフェクトを作っていきます。
まずはメインの設定です。
Durationはパーティクルシステムの動作時間です。その下のLoopingにチェックが入っていなければ5秒間だけ動作します。
永遠にパーティクルを発生させたい場合はLoopingにチェックを入れておきます。
Prewarmにチェックを入れるとあらかじめパーティクルが生成された状態で始まります。
Start LifeTimeは発生させたパーティクルの生存時間です。1だと1秒後に消えます。
Start Speedはパーティクルの初期速度です。この速度で移動を開始します。
Start Sizeはパーティクルのサイズ
Start Colorはパーティクルの色
Gravity Modifierはパーティクルにかかる重力値を設定します。
Simulation SpaceはLocalからWorldに変更してください。
これはLocalだとキャラクターと一緒にSnow Systemも動きますので、降らせた雪が主人公と一緒に動いてしまいます。
Worldに設定しておくとワールド空間に雪が降るので主人公が前に進むと主人公の方向に雪がぶつかってるように見えます。
雪は下に落ちているだけですが、主人公がそちらに進んだ分ぶつかってくるように感じます。
Scaling ModeはLocalにしておきます。これはパーティクルの発生位置にスケールだけを反映させるみたい。
細かい所はよくわかりません・・・。
Max Particleは同時に発生出来るパーティクルの数です。今回は10000とかなりの量を設定していますが、あまり大きいとUnityが落ちる可能性もあるので適度に減らしてください。
次にEmissionにチェックを入れRateに2000を入力します。
これは時間経過や移動時間に応じて発生するパーティクルの数です。
この値を大きくすると雪の数が増えます。
次にShapeをチェックし、ShapeをBoxにします。空のように特定の範囲で雪を降らせたい為この形状にしました。
ScaleのXとYを30、Zを1とします。
Boxの大きさの設定した後は上のような範囲になりました。
頭の上でキャラクターの前後と左右の幅をカバーする範囲を設定してください。
WindZone(風を吹かせる機能)の影響をパーティクルにもたらす
WindZoneをつかってパーティクルに影響を与える設定をします。
External Forcesにチェックを入れ、Multiplierに1を設定します。
これはWind Zoneの影響をパーティクルに与える為の設定で、Multiplierに1を設定すると、
風の影響がそのまま反映されます。風の影響より強い影響を与えたい場合は、1より値を大きくします。
0にすると風の影響を受けません。
Wind Zoneに関しては
を参照してください。
次にCollisionにチェックを入れます。
Collisionはその名の通りパーティクルが他のコライダを持つオブジェクトと衝突した時の設定です。
TypeをWorldのModeを3Dにします。
Dampenを0にし、Bounceを1にします。
Collides Withで衝突判定を行うレイヤーを設定出来ます。
Enable Dynamic Collidersにチェックを入れると動いているゲームオブジェクトとも衝突判定を行います。
主人公と衝突した時も衝突判定がされるので、主人公とぶつかった雪は消えます。
Unityを実行して確認する前に必ずシーンを保存してください(パーティクル数が多いとUnityが落ちる可能性があります)。
これで雪のエフェクトが完成したので、Unityの実行ボタンを押して確認してみます。
上のように雪を降らせる事が出来るようになりました。
パラパラまばらに降っていますが、EmissionのRateの数値を上げるとかなりの量降らせる事が出来ます。
またWind Zoneの風の強さを変更すると雪が横殴りに降るという事も演出出来ます。
ParticleSystemは複雑な設定があってなかなかうまく使う事が出来ませんが、Asset Storeからエフェクトをダウンロードするだけでなく、自分でどんどん作成出来たらいいですね。
以前作った血しぶきのエフェクトもちゃんとしたものに作り替えないといけないんですが・・・・。
キャラクターが屋内に入る時は注意が必要
大草原のような場所(建物内等を考慮しない場所)であれば問題はないんですが、パーティクルシステムを配置する位置によっては建物内に入っても建物の中で雪が降ってしまいます。
今回の設定では主人公の頭上にパーティクルシステムであるSnow Systemを配置していましたが、これが原因で高い建物の場合は室内に雪が降ってしまうので気を付けてください。
終わりに
今回はパーティクルシステムのデフォルトで設定されているマテリアルをそのまま使って雪にしていますが、ParticleSystemのRenderのMaterialを変更する事で、降らせる雪の形状も変更する事が出来ます。
空から魚を降らせることも出来ますね(謎)