Unrealで雨が降った後に波紋を出す
ゲームエンジンを使って雨を降らせるというのを行いたいと思い、google先生で調べたところ おもちゃラボさんの【Unity】広重のような雨のエフェクトを作るが見つかり、雨の感じが自分好みだった。
このような雨の降らせ方をUnrealでもできないかと、素人ながらに試行錯誤し、それらしく作れたのでその時の手順をメモした。
環境
- Unreal Engin: v4.23.1
手順
プロジェクトの作成
とりあえず、プロジェクトを作成。
プロジェクト名は、Rain_Project
とする。
床の設定
デフォルトの床のマテリアルを変更する。
Floor
を選択し、マテリアルはM_Floor_01
にする。
雨マテリアルを作成
テクスチャはこのような感じを作成。
名前は、とりあえずT_Rain
という名前を付けて、Unrealにインポート。
次に雨のマテリアルを作成する。
マテリアルの名前は、M_Rain
とした。
M_Rain
を開くと、メインマテリアルが1つある状態となっている。
メインマテリアルの設定を変更する。
詳細タブにある
- Material -> Blend Mode
のOpacue
をTranslucent
に変更。
メインマテリアルの詳細に関する設定はこれで終了。
次に、T_Rain
をマテリアルに適用するためTexture Sample
ノードを追加。
Texture Sample
ノードにT_Rain
を適用する。
Texutre Sample
ノードの詳細タブにあるMaterial Expression Texture Base
のTexture
の項目でT_Rain
を設定する。
これでTexture Sample
ノードの詳細に関する設定は終了。
次にノードを繋げていく。
Texture Sample
ノードのRGB
-> メインマテリアルのエミッシブルカラー
Texture Sample
ノードのA
-> メインマテリアルのオパシティ
それぞれに接続する。
波紋マテリアルを作成
波紋のテクスチャを用意。
テクスチャ名は、とりあえずT_Repple
という名前にした。
波紋のマテリアルを作成する。
マテリアルの名前は、M_Repple
にした。
エミッシブルカラーはTexture Sample
とメインマテリアルをそのまま繋ぐが、オパシティは Texture Sample
と Particle Color
を合わせて使用する。
Texture Sample
ノードのTexture
の項目は、T_Repple
を設定オパシティ
をパーティクル側で調整出来るようにする。Particle Color
を追加Multiply
を追加Texture Sample
のA
とParticle Color
の白をMultiple
のA
とB
に繋げる。
2つはA
,B
どちらにつないでも問題ない。Multiply
の出力をメインのオパシティ
に繋げる。
以下がその完成系。
雨を降らせる
雨と波紋それぞれのマテリアルを用意できたので、実際に雨を降らせる。
まず、パーティクルを作成する。
パーティクルの名前は、Rain_System
という名前を付けた。
作成したRain_System
を開くと次のような画面がでてくる。
Required
やSpawn
というモジュールがあるが、初期のモジュールでは必要なものが無かったり、使わないモジュールがあったりしており、またそれぞれのモジュールの設定などもあるので、なるべく簡潔に説明する。
まず、使ったモジュールは以下である。
番号順に説明する。
- ここでは、エミッタの名前を変更する。
Rain Emitter
という名前にする。
Required
モジュール。
マテリアルを設定する。M_Rain
を設定。
Spawn
モジュール。
発生させるパーティクルの数を設定する。数は、5000
にする。
Event Generator
モジュール。
パーティクル衝突時に、イベントを生成するようにする。
このモジュールは、この後説明する波紋を表示
のために必要になってくる。- 最初に
+
ボタンでイベントを1つ追加する。 Type
をコリジョン
に設定する。 イベントの発生条件を床と雨が衝突したときにイベントを発生させるため。CustomName
をonKilledRain
と入力。
通知するイベント名は、まぁ雨がkillした後のイベントということで。
- 最初に
Lifetime
モジュール。
雨のライフタイムを設定。min
は0.0
を設定max
は0.3
を設定
Initial Size
モジュール。
特に何もしない。Initial Location
モジュール。
雨を降らせる範囲を設定。Distribution
はDistribution Vector Uniform
にする。max
は、x=500
, y=500
, z=500
を設定min
は、x=-500
, y=-500
, z=-0.1
を設定
Const Acceleration
モジュール。
雨が降る速度を変更。
パーティクルを下に移動させるため、マイナスの数字を入力する。z
に-5000
を入力。
Actor Collision
モジュール。
これは特になにもしない。Lock Axis
モジュール。これを設定しないと、カメラの向きを変えたときなど雨の降り方がおかしなことになる。
Lock Axis Flags
の設定をRotate Z
を指定する。
ここで、一旦設定したパーティクルRain_System
をビューポートに設置する。
Rain_System
の位置は、xyzともに 0
にした。次の図のように雨が降ってくるようになった。
波紋を表示
波紋の表示のタイミングは、雨が降る -> 床に当たる -> 波紋を表示、というふうにしたい。
エミッタは左から右に実行されるので、Rain Emitter
の右側に波紋用のエミッタを作成する。
波紋を表示させるために、使ったモジュールは以下である。
番号順に説明する。
Required
モジュール。
ここでは、マテリアルをM_Repple
に変更する。
Spawn
モジュール。
このモジュールで、波紋をスポーンしない。なので、数は0
にする。
EventReceiver Spawn
モジュール。
雨のEvent Generator
モジュールが発行したイベントを受け取り、パーティクルをスポーンする。Constant
に1を設定。
なぜ1かというと、雨1粒につき波紋を1つだけスポーンさせたいためSource
ここでは、上記の雨で設定したEvent Generator
モジュールの値と同じものを入力する。Event Generator Type
は、コリジョン
を設定Event Name
は、onKilledRain
を入力
Lifetime
モジュール
波紋のライフタイムを設定。min
は0.0
を設定max
は2.0
を設定
Initial Location
モジュール
波紋を表示させる位置について、XY
について設定はしない。
ただし、Z
が0
のままでは、床の上部分と座標が被り波紋の線がはっきりとしない。
波紋を表示させる高さを変える。一応床より少し上にする。
Max
とMin
のZ
に0.01
を入力。
Initial Size
モジュール
特に何もしない。Color Over Life
モジュール
徐々に波紋が消えるように色を設定する。
基本、追加時の初期設定で徐々に消えるようになっているので、特に何もしない。Size By Life
モジュール。
波紋が徐々に広がるようにするために使用。
Points
->0
->Out Val
のX
,Y
,Z
に0
を入力。
Lock Axis
モジュール
これを設定しないと、波紋が縦に表示される。
なので、Lock Axis Flags
をZ
にする。
すべての設定は完了したので、ビューポートで確認。