[UE4ぷちコン 映像編3rd]振り返り:NiagaraでDecal貼る

ここは[UE4ぷちコン 映像編3rd]振り返りの子頁です。

概要

  • NiagaraのCollision Eventで水滴の当たり判定をとる

  • そこからComponent Rendererで水濡れDecalを貼る

  • 応用してビームでも焦げDecalを貼る

参考資料

上記神資料群と重複する説明は本記事では省くので、なんか説明飛んだなと思われた際は改めて参照されたい。
でも本当に飛ばしちゃってるかもしれないのでその場合は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

    • (顎を突き出しつつ両手の田舎チョキで前方斜め下を差して一時停止)