【UE4 .26】スケルタルメッシュのモーションに合わせてパーティクルを発生させる【Niagara】
YMCAダンスを踊るパーティクル達です!! (どうやって活かすかは思いつかないんですけど、けっこうかっこいいので後でブログにまとめます~~~!!) #UE4 #gamedev #niagara pic.twitter.com/c2Ec2XtGz8
— 東京高速戦術@VRゲーム制作 (@kousoku_tactics) June 8, 2021
これを作ります。
スケルタルメッシュの形に合わせてパーティクルをスポーンさせる
www.youtube.com
ほぼコレの通りにしたんですけど、パーティクルの各種設定とか UnrealEngineのバージョン違いで詰まった所もあるのでそういう所も含めて全部書いていきます。
作成の流れとしては
- 指定したスケルタルメッシュの形にパーティクルをスポーンさせるNiagaraModuleScriptを作る
- 「パーティクルのスポーン」に作ったNiagaraModuleScriptを追加する
- メッシュをセットする
です。ところどころ詰まった箇所はあるんですけど、youtubeの解説が丁寧だったので楽にできました。
NiagaraModuleScriptを作っていきます。
持たせる役割としては「スケルタルメッシュの形にパーティクルをランダムにスポーンさせる」ってものです。
最初に「スクリプトの詳細」タブからModuleUsageBitmaskを写真の様にします。
これってどこでこのScriptを使うかを指定するモノって認識なんですけど合ってますか?
とりあえず今回はスポーンの時に使用するので(「メッシュの形に沿ってスポーンさせる」って機能を作りたいので)、"ParticleSpawnScript"を指定しています。
ノードの方を説明していきます。
基本的にスクショの通り組んでいって貰えればいいんですけど、自分の使っている4.26バージョンでは左下の"GetRandomInfo"のノードが検索しても出てきませんでした。過去のバージョンでは存在するノードだったのですが 、いつのまにか表示されないようになっちゃってるみたいです
エディタ内には存在しているようなので、表示されるように設定します。
コンテンツブラウザ内の「Niagaraコンテンツ」内で「Get Random Info」を検索するとでてきます。
「スクリプトの詳細」内の「LibraryVisiblity」を"Exposed"にセットして、コンパイルしてから適用させます。
これで自分の作るModuleScript内でも"Get Random Info"が使えるようになりました。
ModuleScriptを作成する上で詰まるところはこれでもう無いと思います。
やってることの内容としては
スケルタルメッシュをマップ取得で受けとって、"RandomTriangle"でポリゴンメッシュでメッシュ上のポリゴンをランダムで取得します。("RandomInfo"は乱数の生成に関する設定を扱かってるんだと思う)
Calculates info needed by other RNG functions about seeds and determinism,
"Get Random Info"ノードのDescriptionより
シードと決定論について他の RNG 関数が必要とする情報を計算します。
Google翻訳の結果
RNG関数ってのはRandomNumberGeneratorについての事であることから、RandomTriangleノードで扱う乱数の設定をしているんだと思いました。
ModuleScriptの後半です。
"RandomTriangle"で取得したポリゴンメッシュの情報を"Get Skinned Triangle WS"でワールド基準のものに変換します(ノード名の"WS"とは"WorldSpace"の略です)
その中の"Position"のピンをひっぱって"Map Set"のパーティクルの位置を指定する"Position"に繋ぎます。
これでパーティクルの位置がメッシュの形にセットされるようになります。
"NMS_SetPositionSkeletalMesh"って名前で保存します。
NiagaraSystemを作成して設定をいじっていきます。
Emitterも含めての概要です。「パーティクルのスポーン」にさっき作ったModuleScriptを追加しています。
"Empty"を元にエミッタを追加します。
基本的に これで追加したエミッタそのままで、いくつかモジュールを追加していったのでそれらを説明します。
「エミッタの更新」に"Spawn Rate"を追加しました。ベースとなるスケルタルメッシュがモーションさせている間も連続してパーティクルに出てきてもらいたいので設定しました。"SpawnRate"は100000にしました。正直ここまで要らないと思うんですけど、ゲームに組みこむわけでもないし、多い方がSNS映えするかな~って魂胆です。
「パーティクルのスポーン」の"Initialize Particle"です。ライフタイムを短かくして、スプライトのサイズを小さくしています("Sprite Size Mode"を"Random Uniform"にしている部分です)
さっき作ったモジュールです。今回はグレイマンにモーションを付けてパーティクルをつけようと思っているので、"SK_Mannequin"を指定しました。
男の子なので青くしました
「パーティクル更新」の欄です。重力を適用させました。
スプライトのサイズをスポーン後、徐々に小さくするようにしました。今回はスプライトのライフタイムが比較的短いので、地面に達する前に徐々に消滅するようにしました。
これでNiagaraSystemは完成です。"NS_BurstMesh"って名前で保存しました。
次に踊らせるグレイマンの方でNiagaraパーティクルをセットしていきます。
UnrealEngineのに用意されているThirdPersonテンプレート内の"ThirdPersonCharactor"のイベントグラフに↓を追加します。
これでパーティクルをセットします。
これで大体は完成なのですが、このままではグレイマン自身のメッシュが見えてしまっています。パーティクルのスポーンでグレイマンの形を表現したいので、グレイマンのマテリアルに透明なのを適用させます
メッシュのvisibleとかHidden in Gameをオンオフにしたらいいのかなって最初は思ってたんですけど、それをするとパーティクルがメッシュのモーションに追従してスポーンしてくれないのでこの方法をとりました。もっと良い方法が探せばあると思います。
これでグレイマンのメッシュに沿ってパーティクルが発生するようになっています。
ブログ用です #UE4Study #UE4 pic.twitter.com/c6MlzfAN6G
— 東京高速戦術@VRゲーム制作 (@kousoku_tactics) June 8, 2021
こんな感じです。
ダンスを踊らせると
YMCAダンスを踊るパーティクル達です!! (どうやって活かすかは思いつかないんですけど、けっこうかっこいいので後でブログにまとめます~~~!!) #UE4 #gamedev #niagara pic.twitter.com/c2Ec2XtGz8
— 東京高速戦術@VRゲーム制作 (@kousoku_tactics) June 8, 2021
こんな感じになったでしょうか。
なにかわかりにくい事があったり、間違いがあればTwitterのDMとかにおねがいします。
[ この記事はブログ投稿者の憶測や考えによりつくられています。
よって書いてある内容に誤りや言い間違いがあるかもしれません。もし修正したほうがいい場所や「こういった言い方のほうが”ソレっぽい”よ」などがありましたら後に記載してあります、リンク先のツイッターアカウントに教えてくださると嬉しいです:) ]