PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE4 Niagara Tips

環境

UE4.19.0


これまでに書いた記事一覧

Niagara入門 UE4.18で作られたチュートリアルになぞった内容です。
Niagaraのハンズオンになっています。Niagara全般に触れるきっかけになります。
papersloth.hatenablog.com

Niagaraの設定についてです。
新規にNiagara Emitterを作成した時にMaterialが貼られていなかった人は必読です。
上手く動作していない場合だとノードのショートカットが動作しないので
ここで登録を終えてしまいましょう。
papersloth.hatenablog.com

CascadeからNiagaraへの移行ガイドのような記事です。
Cascadeで用意されていたものがNiagaraでは何に該当するのかを書きました。
Cascadeを触ったことがある人は一度目を通すといいかもしれません。
papersloth.hatenablog.com

NiagaraExtrasの紹介です。
手っ取り早くカッコいいエフェクトが作りたいという人向け。
学習用の資料としてもオススメです。
papersloth.hatenablog.com

NiagaraとBlueprintの連携についてです。
BlueprintからNiagaraを生成する方法について書きました。
papersloth.hatenablog.com

NiagaraFunctionScriptについてです。
Material Function等を触ったことがある人には直ぐに伝わると思います。
papersloth.hatenablog.com

SubUVを使ったアニメーションについてです。
炎や煙等を表現したいという方はこちらを読んでみてください。
papersloth.hatenablog.com

Mesh, Ribbonパーティクルについてです。
爆発の破片にメッシュを使うなど表現の幅が広がるので試してみてください。
papersloth.hatenablog.com


NiagaraTips

Niagaraを触る上での小ネタ集です。

PinのRename方法

Niagaraでノードを作成したものの最初はRename方法が分からず困りました。
Renameの方法はPin上で右クリックしたら出てくるWindowから行います。
Pinの並び替えや削除もここから行います。
f:id:PaperSloth:20180327213107p:plain

Niagara Emitter, Systemの背景を非表示にする方法

真っ白なエフェクトなんかは黒背景の方が見やすいですよね。
というわけで背景の変更方法です。
操作はEmitter, System共に同じ操作です。

先ずはWindow > Preview Scene Settingsを開きます。
f:id:PaperSloth:20180327213415p:plain

その中のShow Environmentをオフにすると背景を非表示にする事ができます。
f:id:PaperSloth:20180327213741p:plain

f:id:PaperSloth:20180327213811p:plain


NodeのTips

続いてはノードに関するTipsを紹介します。

条件分岐

NiagaraにはIfノードがありますが、少し使い方が特殊です。
f:id:PaperSloth:20180327214205p:plain

Materialでもifノードがありますね。
f:id:PaperSloth:20180327214239p:plain
BlueprintだとBranchがそれに該当します。
f:id:PaperSloth:20180327214430p:plain

さて、Niagaraのifノードが何が特殊かというと返す値が任意に選択できるというところです。
また、Niagara内には大なり小なりでの値の比較のノードはありません。
f:id:PaperSloth:20180327214600p:plain

どんな型を設定したにせよ
ConditionがtrueならAの値が
ConditionがfalseならBの値が出力されます。

さらに特殊なのが出力Pinを複数追加可能なところです。
ぱっと見は複雑ですが、結果は同じでtrueならA falseならBの値が出力されます。
f:id:PaperSloth:20180327214925p:plain

また、ifノードとは違いますが
boolのAND, OR, NOTとビット演算が用意されています。
f:id:PaperSloth:20180327222430p:plain

Custom Hlslノード

続いて紹介するのはCustom Hlslノードです。
プログラマーやMaterialを触る方には馴染み深いノードですね。
ノード内に直接シェーダーコードが書けるノードになっています。
f:id:PaperSloth:20180327215257p:plain

MaterialではCustomという名前のノードです。
f:id:PaperSloth:20180327215426p:plain

MaterialのCustomノードと違ってノード内に直接記述する形になっています。
また、もう一つ特殊なのがこのノードは戻り値がvoidのみのようです。

そのため、値を返す場合はOutputPinで指定した値に代入する形になります。
f:id:PaperSloth:20180327215610p:plain

コメントノード

Blueprint, Materialを触る方にはすごく馴染み深いノードですね。
しかし、残念ながらCキーで出てきません。

面倒ですがcommentと入力してノードを出しましょう。
f:id:PaperSloth:20180327215823p:plain

使い方は説明するほどでもないので、省略します。

Convertノード

最後に紹介するのがConvertノードです。
Niagaraで最も便利なノードです。
正直BlueprintやMaterialにも欲しいです。
f:id:PaperSloth:20180327220019p:plain


Convertという名の通り値の変換などに使います。
よくあるのはVectorをXYZに分解するなどの用途が有りますね。
f:id:PaperSloth:20180327220216p:plain

これはBlueprintにもあります。
f:id:PaperSloth:20180327220332p:plain

このConvertノードの何が強力かというとInput, OutputのPinを自由にカスタマイズできることです。

例① 座標の組み換え
XYZをYZXに組み替えたりするのがノード1つでできます。
f:id:PaperSloth:20180327220544p:plain
Blueprintだとノードが2つになりますね。
f:id:PaperSloth:20180327220756p:plain

例② バラバラな型への変換
こんなことをしたらプログラマーは大激怒ですが・・・
分解したVectorのZだけをintにするということもできます。
f:id:PaperSloth:20180327220906p:plain

例③ 一軸のみの更新
入力Pinは2つで1つはXYに代入し、Zだけを更新ということが1つのノードでできちゃいます。
ちょっぴり便利ですね。
f:id:PaperSloth:20180327221123p:plain

例④ Min, Maxの短縮
例えば範囲制限ありの乱数生成なんかは通常Blueprintでもこのように作りますね。
f:id:PaperSloth:20180327221428p:plain

Blueprintの例
f:id:PaperSloth:20180327221507p:plain

Blueprintでは直接値が入力できちゃうので、ノード1つで実現できるんですが
NiagaraのConvertノードを使うとこんな入力がスマートでしょう。
f:id:PaperSloth:20180327221709p:plain

例⑤ 複数のPinの利用
Niagaraでは行列を扱うこともできるため、このように行列を作ることも出来ます。
f:id:PaperSloth:20180327221903p:plain

ここではOutputPinは1つですが、複数にすることも出来ます。
試しに動かしてみた結果として入力、出力を20にしてもクラッシュしませんでした。
(管理しきれないので絶対に使いませんが)


Niagaraの現状のクラッシュについて

UE4.19.0時点での情報です。
正式リリースの際には修正されて直ることを祈ります。
どなたか修正してプルリク出していただけるとありがたいです。

Promote to Parameterでクラッシュする

Niagara Module Script上で変数をParameterに変換しようとするとクラッシュします。
f:id:PaperSloth:20180329235945p:plain
EdGraphNode.cpp内のclass GetGraph関数で動作が停止します。

呼出履歴を見るとNiagaraNodeInput.cpp内でUNiagaraNodeInputのSetDataInterfaceが呼ばれるのですが
この時にDataInterface, InDataInterfaceがnullなのが気になりますね。

void UNiagaraNodeInput::SetDataInterface(UNiagaraDataInterface* InDataInterface)
{
	if (DataInterface != nullptr)
	{
		DataInterface->OnChanged().RemoveAll(this);
	}
	DataInterface = InDataInterface;
	if (DataInterface != nullptr)
	{
		DataInterface->OnChanged().AddUObject(this, &UNiagaraNodeInput::DataInterfaceChanged);
	}
	DataInterfaceChanged();
}

Niagara Systemを開いている状態でEditorを閉じるとクラッシュする

エディタはクラッシュするんですが、Editorを閉じた後にクラッシュダイアログが出て
作業データへの影響も特になさそうなので問題はあまりないかもしれません。
クラッシュダイアログが出てドキッとしますが・・・

NiagaraComponent.cpp内のGetAllocatedSize内でRendererに不正な値が入っててクラッシュするようです。

uint32 FNiagaraSceneProxy::GetAllocatedSize() const
{ 
	uint32 DynamicDataSize = 0;
	for (NiagaraRenderer* Renderer : EmitterRenderers)
	{
		if (Renderer)
		{
			DynamicDataSize += Renderer->GetDynamicDataSize();
		}
	}
	return FPrimitiveSceneProxy::GetAllocatedSize() + DynamicDataSize;
}

Niagara Systemを開いて、閉じた後にEditorを閉じるとクラッシュする

先程と似た問題ですがこの操作を行った場合はRendererがnullになってクラッシュします。
こちらも同様にデータへの影響はなさそうです。
なんにせよNiagara Systemを編集するとエディタを閉じた時にクラッシュダイアログが出るようですね。


まとめ

Niagaraでの簡単なTipsを幾つか紹介させていただきました。
まだまだ伝えたいことはあるのですが、一先ずここまでとします。

Convertノードがすごく便利なので色々と活用してみてください!