【UE4】Particle Instance Parameter について（解説）

# はじめに
レベルに配置したないしはSpawn Emitterで出現させたパーティクルのVelocity等をBlueprintで変化させることは出来ないかな？と思って調べると「Particle Instance Parameter」がヒットしたので紹介と解説をしてみます。

# Particle Instance Parameter とは？
UE4のマテリアルでは「スカラー値」や「ベクター値」を「パラメーターに変換」することでBlueprint上で動的に値を変化させることが可能でした。Dissolveエフェクト等で調べていただけると、動的なマテリアルパラメータの変更がわかりやすいと思います。
それと同じ機能がパーティクルにもあります。
それが「Particle Instance Parameter」です。
これはパーティクルを構成しているEmitterのパラメーターを外部に公開することで外部から（Blueprint等）パラメータを変更出来ます。マテリアルのやつと一緒ですね。

# Instance Parameter の使い方
ここから Particle Instance Parameter の使い方を解説していきます。
使用するパーティクルは「スターターコンテンツ」にある「P_Fire」を使います。

|||
|:-----------:|:------------:|
|![使用パーティクルディレクトリ.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/c7528381-7ce5-30f3-0fbc-c7bcd4008a61.png)|![使用パーティクル.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/9342935e-2cec-6aaa-98d0-645e43a8350f.png)|

P_fireの中身を見てみるとエミッターの数が多すぎるので、左端以外のエミッターは全て削除します。

||
|:---:|
|![Emitter削除後.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/955f50a2-9b90-9cfe-5826-f28cddf64d4d.png)|

Flamesエミッタに新しくAccelerationモジュール（右クリック＞Acceleration＞Acceleration）を追加します。

||
|:---:|
|![Accelerationモジュールを追加.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/58b5a114-a740-256a-7b10-fd16e04eb5ad.png)|

次に詳細パネルの Distribution を「Distribution Vector Particle Parameter」に変更します。

||
|:---:|
|![Distributionを変更.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/f29a5c01-b23d-c4b6-1c9c-13d7aaea273f.png)|

次に公開するパラメータ名とその他必要な設定をします。
「Parameter Name」が現在「None」になっているので適切な名前を設定します。ここではモジュール名と同じ「Acceleration」とします。
Param Modesを展開すると１，２，３それぞれに「DPM Normal」が設定されているので、これを「DPM Direct」に変更します。

|||
|:---:|:---:|
|![詳細パネル変更前.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/2ad620cb-a1a3-c4e9-561b-1bf3d78ef688.png)|![詳細パネル変更後.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/5d222fb3-a100-6c48-916f-5c82a42d75a3.png)|

これで外部へのパラメータを公開するための準備が整いましたので実際に変更してみます。
開いているマップの適当な場所に配置して、詳細パネルにある「エミッタアクション」の「パラメータを公開」ボタンを押します。
そうすると、ParticlesのInstance Parametersに新しくエレメントが追加されます。

|||
|:---:|:---:|
|![パラメータ公開前.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/1c0c9822-1f61-129d-6db1-dc1dee9a0920.png)|![パラメータ公開後.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/71705de5-e415-04cb-3686-ce3ba3045b0b.png)|

試しにVectorのZを1000くらいにすると配置されたパーティクルが上方向へ飛んでいきます。

||
|:---:|
|![上に飛ぶパーティクル.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/8f28e65e-dd75-4382-2ecd-0e7c4ffdd08a.png)|

ブループリントでパーティクルのパラメータを変更してみる
これまでの設定によりカスケードを介せずパーティクルの加速度を変更出来たと思いますので、今度はブループリントでキー入力に応じて上方向に加速度を追加したり、下方向に加速度を追加したりするようにします。
「アクター」クラスを親としたブループリントを作成します。
コンポーネントに「Particle System」を追加して、設定を済ませたP_Fireを設定します。
アクタクラスを継承したデフォルトのブループリントではキーボード入力を受け取ることが出来ないため、キーボード入力を受け付けるように設定します。

||
|:---:|
|![キー入力受け取り準備.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/e546a953-5469-d7f8-3492-fbeb2c27b796.png)|

次に必要なVector型の変数を追加します。

||
|:---:|
|![変数追加.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/86bf520b-d062-b938-4948-ee93ba4c71e9.png)|

グラフにキーボードイベントを追加して、Accelerationへ値を増減させるようにします。

||
|:---:|
|![キー入力による値の増加.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/5d037136-83e0-51e2-4680-af017336d1c2.png)|
Eキーを押すことで100ずつ増やし、Qキーを押すことで100ずつ減らすようにしました。

Tickイベントには公開されているパーティクルのパラメータに対し変数Accelerationの値をセットします。

||
|:---:|
|![パーティクルパラメータへの値設定.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/b5603a1c-3dac-234f-2a44-84395db36d11.png)|

設定する方法としては Dynamic Material Insntace に対しパラメータを設定する方法とほぼ変わりません。かなり簡単に値を変更することが出来ます。
後は作成したブループリントをレベル上に配置して、Eキーを押すたびに上方向へと火が飛んでいきます。

# まとめ
Particle Instance Parameterを使うにあたって必要な設定は以下の通りです。
1. Distribution を Distribution Vector Particle Parameter に変更
2. Vector型の場合は Param Modes を DPM Direct に変更
3. Parameter Name をちゃんと設定する

Distribution Vector Particle Parameter の各パラメータについては以下の公式ドキュメントが参考になると思います。
https://docs.unrealengine.com/latest/INT/Engine/Basics/Distributions/index.html#distributionvectorparticleparam


# おまけ
Particle Instance Parameter は当然Vectorだけでは無く色も扱えます。
「Scale Color / Life」モジュールを追加して Distribution を変更することでブループリント上でも扱えます。
その際、パラメータを渡すノードは「Set Color Parameter」となります。
これを利用して以下の様なプレイヤーとの距離に応じて色が変化する炎なんてのも作れます。

||||
|:---:|:---:|:---:|
|![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/2bae8210-6084-fbef-1100-faa202895ac4.png)|![キャプチャ２.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/0b4a3db4-6e16-83f8-5965-8fe248150dad.png)|![３キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/e02ae337-276c-c627-b6fb-900d1fe514d3.png)|