[UE4ぷちコン 映像編3rd]振り返り:NiagaraでDecal貼る
ここは[UE4ぷちコン 映像編3rd]振り返りの子頁です。
概要
NiagaraのCollision Eventで水滴の当たり判定をとる
そこからComponent Rendererで水濡れDecalを貼る
応用してビームでも焦げDecalを貼る
参考資料
Niagara の Renderer のリファレンス | Unreal Engine ドキュメント
Component Rendererのパラメータについても解説あり
How to create Rain in Unreal Engine 4 Niagara – Kids With Sticks
超イカス雨VFXの詳細な制作手順
雨粒Particleの衝突点にComponent RendererでDecalを置いて水たまりを作っているのを今回パクる
UE4で弾幕ゲームを作る際に、押さえておきたい Niagara Collision の扱い方。 - Qiita
CGとか先生によるNiagaraの基本とCollisionの解説
Niagara Advancedを覗いてみる - Qiita
yeczrtu先生によるContent Examples内のNiagara Advancedレベル解説
上記神資料群と重複する説明は本記事では省くので、なんか説明飛んだなと思われた際は改めて参照されたい。
でも本当に飛ばしちゃってるかもしれないのでその場合はTwitter等でお問い合わせ下さい…
Component RendererでDecalを貼る
注意事項
4.27Chaos版のNiagaraとComponent Renderer(Experimental)を使っています
自分の使い方が悪いのか、かなりCrashする
Niagara Editorを開いたままPlayするだけでCrashする事も…
スプリンクラーの着地点に水濡れDecalを貼る
目的
混沌感の増強
オフィス内に水を撒き散らす時点でだいぶアレだが、水濡れを置いて絵的情報量マシマシでよりカオスにしたかった
とか理由をつけつつ、以前見かけた雨VFX記事のテクを自分もやりたかっただけ
Decal Material
Texture未使用、方向問わず球状に暗くするDecal
図中にもある通り、Decal Lifetime Opacityが謎の挙動になったのでパラメータ制御している
Custom Decal Component
DecalのMaterial instanceを作りフェードさせる
なぜか標準Decal Componentは直接Blueprintで派生を作れない
強引にC++でBlueprintableな派生Classを作って対応した
Set Normalized Age関数はComponent RendererからComponentへの変数Setter機能で使う
Niagara
水滴側はFountainテンプレートにGenerate Collision Eventを足している
WaterDecalのCollision Eventでそれを受け取る
Component Count Limitは「水滴のSpawn Rate * Water DecalのLifetime」で求められる
今回は200*3
Only Create Components on Particle Spawnはオフ
これがオンだとなぜか描画されない
プロパティの意味はDocumentの通りで、言い換えると「Particleの発生タイミングでComponent Limit等で新規に描画できない時、Trueならずっと非表示のまま。falseだと寿命の途中からでも再利用可能なComponentが出たら表示再開」となる
実際、Collision EventでなくSpawn RateでParticleを出すと説明どおりに動作する
同時にSprite RendererをセットするとSpriteは表示されるので、Particleそのものは出ておりComponent Rendererの問題っぽい
詳細未調査
Visualize Componentsはオフ
GizmoでDecal本体が見えなくなるのを回避
ComponentのNormalized Age変数にParticles.NormalzedAgeをセット
これによりComponent側のSetNormalizedAge関数が呼ばれる
ビーム着弾点に焦げDecalを貼る
目的
「ビームがスプリンクラーに当たって水が出た」という説明が必要
でも「コケて軌道がそれたビームがスプリンクラーに当たる様」が一瞬すぎ
ビームが当たった場所を焦げる様にして、スプリンクラーを焦がして説明とする
Decal Material
水濡れDecalの流用
Sphere MaskのHardnessを減らしてじわっと焦げたふうにする
Niagara
ビーム本体はScaleした円柱のMesh Rendererなので省略
DecalSeed Emitter
透明な(Rendererのない)ParticleをEmitter正面方向に飛ばす
命中した地点でGenerate Collision Eventが起きて下記のDecal Emitterを生ずる
Coneで多少バラけさせている
厳密にはビーム本体とずれた位置に出るが、ビーム側も暴れているのであまり気にならない
Decal Emitter
素のDecal Component RendererでDecalを貼るだけ
LifeTimeは30にして、動画内で消えないようにしている
警告への対処
[ProjectPath]/Config/DefaultEngine.ini に以下の記述を足して警告を回避しておく
右辺の値はComponent Rendererの出る理論最大値にしておく(本作だとビーム痕やら水濡れ×3で多めに設定)
[ConsoleVariables]
fx.Niagara.WarnComponentRenderCount=5000
Component Rendererの流用
生成したComponentは流用される模様
Component Count Limitが100でも、同時に表示される数が常に10個なら、最初の10個だけ生成されて以降は流用される
ComponentのBeginplayは新規に生成されたときしか呼ばれない
Beginplayでフェードアウトのタイマーをセットするような実装はできないという事(1敗)
ParticleのNormalizedAgeが0->1で遷移するので今回はそちらを利用した
所感
水の表現もうちょっとなんかできたやろ感
素のSprite Renderer丸出しはどうなんだろう
絵作りToon調だからギリギリセーフか…?
stylized water splashとかで検索すればリファレンス山ほど出てくる
スプリンクラー発射口ににsplash的なmeshつけるとか…
あと水滴の変形とか…
水濡れは凝ろうとすると、Componentの向きとか気にし始める必要が出てくる
個別にRender Target生成して、Simulation Stageで液垂れとか面白そうな感はあるが沼もヤバそう
「ビームがスプリンクラーに当たって水が出た」はビーム痕があってももわかりにくい気がする
スプリンクラーの横に回転灯とか明滅LEDをつけて、このセンサーが反応しましたみたいな説明が必要そう
実は本記事で紹介した手法は当時やってないものを含む
検証する時間がなかった為、より効率が悪かったり泥臭い方法でやっていた
例えばLight VectorノードでDecalのUVWが取れる話はTwitterで教えて頂いた。ありがたや…🙏
振り返り記事を書く際に改めて色々と調べ直した
次に同じ知識が必要になった時にまた曖昧なまま使うのを避けたい
でもNiagaraは実際難解
振り返り書くのも遅れる醜態
もっと理解深めたいMy Mind
(顎を突き出しつつ両手の田舎チョキで前方斜め下を差して一時停止)