UE4 NiagaraをClassBlueprintで使用する

ご挨拶

こんにちは、修行の旅に出たいShiotaniです。

www.unrealengine.com

EpicGamesStoreの発表、とてもワクワクしましたね!ね!!


今回は、Class BlueprintにおけるNiagaraについて書きたいと思います。

概要

今回は、以下の3つを主としています。

  • Niagaraでの値の公開方法
  • Niagaraで公開された値をClass Blueprint上で操作する方法
  • 明示的ではない値の受け取り方

最後の明示的ではない値の受け取り方に関しては、今後追記する可能性があります。

前提

  • Unreal Engine 4.20.3を使用しています。
    (エンジンバージョンですが、4.21では検証に必要な機能が使用不可であったため4.20を使用しています。)
  • Niagaraは、アーリーアクセスです。
    今後実装方法などに変更がある可能性があります。

Niagaraでの値の公開方法

まず、Niagaraでの値の公開方法は2つあります。

  • NiagaraSystemにてUser変数を用意する
  • NiagaraParameterCollectionを用意する

大まかに以上の2点が挙げられます。
今回の記事では、NiagaraParameterCollectionは深掘りせず、
まずは簡単なUser変数について触れたいと思います。

NiagaraSystemにてUser変数を用意する

まず、User変数がどこにあるのかですが
NiagaraSystem上の以下の位置にあります。

f:id:yuyasaltcanyon:20181206062054p:plain:w500

そもそもUser変数って?

Niagara上にあるNamespaceの内の1つです。
Particle毎に保持している"Particles."やModuleからStackへと公開するための"Module."などあり、
その中の1つとして、"User."というものがあります。

特徴は以下のとおりです。

User変数の特徴

  • Niagara外からなら読み書きできる変数
  • BlueprintやSequencerから扱える
  • Niagaraからするとあくまでも読み取り専用のマジックナンバーのような立ち位置なので、
    NiagaraDynamicInputやExpressionは使用できない

実際の使用方法

  1. NiagaraSystem上の"SystemExposedParameters横のプラスボタン"もしくは、
    "ParametersWindow > User横のプラスボタン"を押す。

    オススメとしては、SystemExposedParameters横のプラスボタンからの追加をオススメします。
    User横のプラスボタンから、変数を追加すると、追加した後にコンパイルしなければ変数の編集ができず、少し手間です。

    f:id:yuyasaltcanyon:20181206063653p:plain

    今回は、Particleの色を動的に変えようと思うので、LinerColor型の変数を作成します。

    f:id:yuyasaltcanyon:20181206064313p:plain


2. 変数名を設定する。
今回は、"User.UpdateColor"とします。

f:id:yuyasaltcanyon:20181208214437p:plain

3. User.変数により値の変更を行いたい使用したいModule変数にSetする

ParametersWindow内のUser.UpdateColor変数を使用したい変数部分にドラッグアンドドロップする事で変数をSetできます。
今回は、Updateセクション内にあるColor ModuleのColorにセットしました。
f:id:yuyasaltcanyon:20181208214635p:plain

f:id:yuyasaltcanyon:20181208214818p:plain

4. 初期値を設定する
NiagaraSystem内のSelected EmitterWindowの一番上に置かれているSystemExposedParametersセクションから、
全てのUser.変数の値を操作できます。

f:id:yuyasaltcanyon:20181208214856p:plain

といった以上の操作だけで、値を公開できちゃいます。
次に公開した変数の扱い方を見ていきましょう。

公開された値をClass Blueprint上で操作する方法

  1. Class Blueprintを用意します。
    Actorを継承して、"BP_Niagara"という名前にしました。

f:id:yuyasaltcanyon:20181206231402p:plain


2. 作成したら、BP_Niagara内のComponentWindowから"Niagara Component"を追加します。

f:id:yuyasaltcanyon:20181206231838p:plain
f:id:yuyasaltcanyon:20181206231916p:plain


3. ComponentとしてNiagaraを追加すれば、DetailsWindowとノードによって値をコントロールできます。

f:id:yuyasaltcanyon:20181206232657p:plain:w300
f:id:yuyasaltcanyon:20181206232430p:plain:w500

ノードによって、操作値は
Actor, Bool, Int, Float, LinerColor, Quaternion, Vector2, Vector3, Vector4などがあります。

次は、実際に値を変更して変化を見てみましょう。

実験

  1. Detailsから値を変更してみます。
    (こちらの機能ですが、4.21.1では値変更時にクラッシュします。)

youtu.be


動画でも分かる通り、4.20.3時点でのNiagaraでは、Detailsから値を変更してもコンパイルしなければ、値は反映されません。

追記(2018/12/13)

もし、動的にパラメーターを変更したい場合

ConstructionScript内に以下の様に記述すれば、Color変数による変更等がコンパイルなしでも可能です!

f:id:yuyasaltcanyon:20181213164652p:plain

川島先生、ありがとうございました!


2. ノードから値を変更してみます。
変更方法にはTimelineを使用しました。
f:id:yuyasaltcanyon:20181212200400p:plain
f:id:yuyasaltcanyon:20181212200230p:plain

実際に動かしてみます。

youtu.be
当然ではありますが、Simulationでの変更は動的に変更されます。



明示的ではない値の受け取り方

Niagaraの一部の値は、上で記述したDetailsやノードによる変更する以外の方法でも変更できます。
この方法に関しては、今後のアップデート等で使用できなくなる可能性はあります。

バージョン4.21.1でも確認できた内容になっています。

概要

NiagaraSystemにて、User.で公開されている。
SkeletalMesh変数に関しては、Class Blueprint内のComponents Window上において、
NiagaraComponentの直上の親となっているSkeletalMeshComponentのSkeletalMeshを参照します。


検証用のNiagaraSystemを用意

1, SkeletalMeshのMeshSurfaceをサンプリングするシンプルなEmitterを作成
f:id:yuyasaltcanyon:20181212202807p:plain

2, 使用するSkeletalMeshは、User.SourceSkeletalMeshという変数にしています。
f:id:yuyasaltcanyon:20181212202917p:plain

3, デフォルトの値として、エンジンコンテンツである"TutorialTPP"を使用します。
f:id:yuyasaltcanyon:20181212202842p:plain

これにより、TutorialTPPをサンプリングし、Tポーズを型どったものが現れます。
f:id:yuyasaltcanyon:20181212202410p:plain

検証

1, Class Blueprint内のComponentsWindowにて、SkeletalMeshを一緒にしてみる

f:id:yuyasaltcanyon:20181212210256p:plain

f:id:yuyasaltcanyon:20181212210306p:plain
User.SourceSkeletalMeshでは、TutorialTPPというSkeletalMeshをセットしています。
ですが、画像では、TutorialTPPではなく、NiagaraComponent直上のMannequinというSkeletalMeshがサンプリングされています。
これだけでも、NiagaraComponentが持つUser.SorceSkeletalMeshは、ComponentsWindow上で直上にあたるMannequin(SkeletalMeshComponent)を参照している事がわかります。

2, 複数のSkeletalMeshComponentと一緒にしてみる
f:id:yuyasaltcanyon:20181212210352p:plain
今回は、MannequinとTutorialTPPを一緒に追加してみました。
画像ではまず、TutorialTPPの直下にNiagaraを置いています。

f:id:yuyasaltcanyon:20181212210416p:plain
画像のようにTutorialTPPを型どったエフェクトがでました。

次にMannequinの直下に置いてみます。
f:id:yuyasaltcanyon:20181212210432p:plain

f:id:yuyasaltcanyon:20181212210500p:plain
画像のようにTutorialTPPを型どったエフェクトがでました。


以上から、NiagaraSystemでUser.により公開したSkeletalMesh型の変数は、ComponentsWindowにて直上のSkeletalMeshComponentを参照する事がわかりました。

3, NiagaraSystem内のUser.変数を複数用意してみる
f:id:yuyasaltcanyon:20181212211351p:plain
画像のように、SkeletalMesh型のUser.変数を2つ用意。
同一Emitter2つ追加し、それぞれサンプリングするSkeletalMeshに用意した変数(User.SourceSkeletalMeshとUser.2_SourceSkeletalMesh)をセットしました。


f:id:yuyasaltcanyon:20181212211214p:plain
結果として、複数のSkeletalMeshComponentを使用したとしても、
それぞれ、別々のSkeletalMeshを参照するのではなく、
どちらも同じSkeletalMeshを参照することがわかりました。

同じMeshであるStaticMesh型のUser変数でも試してみましたが、同じような結果は得られませんでした。

おまけ

NiagaraのセクションごとにUser変数を置くとどうなるのか?

(2018/12/13:実験結果等に誤りがあったため、修正しました。ご報告ありがとうございました。)
Niagaraでは、
Spawnセクションに置かれたModuleはCascadeでのInitial系Moduleに
Updateセクションに置かれたModuleはCascadeでのColorOverLifeのような更新がかかるModuleになります。

Particleセクションにおいて
Intial系ModuleになるSpawnセクション内のModuleはParticleがスポーンした最初の1度のみ参照されます。
つまり、Spawnセクションに使用されたUser変数はParticleがスポーンした最初の1度は参照され、Updateセクションに置かれた変数はスポーン後も参照され続けるはずです。

先程の実験では、UpdateセクションにUser.UpdateColorが使用されていました。
今回は、Spawnセクションにも使用してみます。

準備

1, User変数として、User.UpdateColorとUser.InitialColorの2つを用意する。
f:id:yuyasaltcanyon:20181212230427p:plain

2, それぞれのセクションに値を入れ込む
f:id:yuyasaltcanyon:20181212225639p:plain
ParticleSpawnセクションにColorModuleを追加し、User.InitialColorを入れ込みました。
ParticleUpdateセクションにも同様にColorModuleを追加、User.UpdateColorを入れ込みました。

3, NiagaraSystemを複製、片方はUpdateセクションのColorModuleを無効化、もう片方は、SpawnセクションのColorModuleを無効化する。
ここで、両方のColorModuleを有効化したままですと、正しい結果が得られないので注意してください!!
f:id:yuyasaltcanyon:20181213162519p:plain
f:id:yuyasaltcanyon:20181213162726p:plain
f:id:yuyasaltcanyon:20181213162748p:plain

実験

内容:BPのTimelineを使って色を変える
以下の画像の仕組みを使用しました。
f:id:yuyasaltcanyon:20181213153907p:plain

GetノードのForInitialSectionには、先程、UpdateセクションのColorModuleを無効化したNiagaraSystemを
もう一方のForUpdateSectionには、SpawnセクションのColorModuleを無効化したNiagaraSystemを入れ込んでいます。

結果

youtu.be


左は"ParticleUpdateセクション"にUser.InitialColorを入れ込んだもの
右は"ParticleSpawnセクション"にUser.InitialColorを入れ込んだものになります。

予想通り、Updateセクションに入れ込んだものは常に参照され常に色が変化しました。
そして、Spawnセクションに入れ込んだものは、Particleがスポーンした最初の1度のみ参照され、スポーン時の色の変化は反映されましたが、その後に色が変化することはありませんでした。

おわりに

Class Blueprintから値を変更する際は、コンパイルしなければ、値が反映されず、手間に感じます。
将来的にコンパイルなしでも値が反映されるようになれば、便利でしょうね。

Sequencer上でのNiagaraについて書くための準備記事だったはずが、予想以上に長くなってしまいました。
近い内にSequencer上で使用した場合について書こうと思います。