PaperSloth’s diary

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

UE4 C++でのExposeOnSpawnについて

環境

UE4.19.0
Visual Studio Community 2015

Expose On Spawnとは

Spawn Actor from ClassでActorをSpawnする際に初期化できる変数のことです。
f:id:PaperSloth:20180413230104p:plain

Blueprintで設定する際は下図のように設定を行います。
f:id:PaperSloth:20180413230236p:plain

Expose on Spawnにチェックを入れるのはもちろんですが
Instance Editableにもチェックを入れる必要があります。

チェックを忘れた場合はコンパイル時に警告となります。


さて、これをC++側で定義する方法についてです。

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Game", meta = (ExposeOnSpawn = true))
    float ExampleExposeValue;

このようにmetaにExposeOnSpawnと書くだけでSpawn時に値を割り当てることができます。
f:id:PaperSloth:20180413232056p:plain

    meta = (AllowPrivateAccess = "true")

このようにmeta指定子の種類によってはtrueを文字列として囲うものもあるので、ちょっとした注意が必要です。

また、C++側で生成時に値を割り当てる時はSpawnActorDeferredを使用しますが、それはまた別の機会に紹介させていただきます。
SpawnActorDeferredについて書きました。
こちらも合わせて読んでおくと便利です。
papersloth.hatenablog.com

UE4 Unreal C++でデストラクタ

環境

UE4.19.0
Visual Studio 2015 Community


参考文献

下記ドキュメントはUE4を触っている人は必ず目を通しておくべきだと思います。
今回はこのドキュメントを参考にActorの解放処理についてみていきます。
Unreal Engine | アクタのライフサイクル


UE4でのデストラクタ

結論から書くとデストラクタはUObjectを継承したクラスでは基本的に使用しません。

class PROJECTNAME_API AExampleActor : public AActor
{
	GENERATED_BODY()
public:	
	AExampleActor();
	// 下記はNG
	virtual ~AEampleActor();	

UObjectを継承したクラスではBeginDestroyをOverrideすると良さそうです。
これはオブジェクトがGC用にマークされた状態でも、まだ削除されていないときに呼び出されるものです。
ゲームプレイ機能は後述のEndPlayで解放し、BeginDestroyでオブジェクトが使用していた全リソースを解放します。

// header側
class PROJECTNAME_API AExampleActor : public AActor
{
	GENERATED_BODY()
public:	
	AExampleActor();
	virtual void BeginDestroy() override;
}

// cpp側
void AExampleActor::BeginDestroy()
{
	Super::BeginDestroy();
}


AActorを継承したクラスで明示的なDestroy呼び出し等による終了処理を記述したい場合にはEndPlayを使用します。

// header側
class PROJECTNAME_API AExampleActor : public AActor
{
	GENERATED_BODY()
public:	
	AExampleActor();
	virtual void EndPlay(const EEndPlayReason::Type EndPlayReason);
}

// cpp側
void AExampleActor::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
	Super::EndPlay(EndPlayReason);
}


他にも終了処理の過程にはDestroy関数やOnDestroyのようなデリゲートもありますが
ドキュメントを見た限りでは特別な理由がなければ終了処理はEndPlayで良さそうです。

また、ReceiveEndPlayなどのReceive~系はC++側の処理が呼ばれる際に合わせて呼び出されるBlueprint側の処理になります。
Blueprint側のEndPlay等は実際にはReceiveEndPlayを使用しています。


まとめ

終了処理を明示的に記述したい場合はEndPlay
デストラクタの代替機能が欲しい場合はBeginDestroy

UObjectを継承したクラスでは基本的にデストラクタを記述する必要はありません。


また、今回は解説しませんがUnreal C++でもどうしてもC++のnewを使いたいことがあるかもしれません。
そういった特殊なケースの場合はRuntime/Core/Public/HALUnrealMemory.hに目を通しておくと幸せになれるかもしれません。
mallocやfree等々メモリーに関する処理が幾つか用意されています。

UE4 Niagara Rendererについて

環境

UE4.19.0


Rendererの種類について

先ず新規Emitterを作成すると下図のようなエフェクトが生成されます。
f:id:PaperSloth:20180402205657p:plain

これはSprite Rendererでパーティクル作成でよく使用される基本形です。
SubUV Indexを利用することで煙や炎も表現することができます。

NiagaraのRendererの種類は全部で4種類あります。
・Light
使用について未検証のため、詳細が分かり次第追記予定です。
・Mesh
Static Meshをパーティクルに利用できるものです。
SFチックな盾や爆発の破片などに利用され、Spriteの次に利用されると思います。
Ribbon
リボン形状のもので発生源から終点への軌跡を描きます。
綺麗なリボン上のものから複雑な形状まで表現できます。
・Sprite
パーティクルの基本形で最も利用されるものです。


Rendererの追加方法はEmitter, Systemの最下部にRenderカテゴリがあるため
そこの + ボタンから追加することができます。
f:id:PaperSloth:20180402210653p:plain

"+"ボタンを押下すると下図のようにRenderer Properties一覧が出るので
使用したいRendererを選択しましょう。
f:id:PaperSloth:20180402210728p:plain


Mesh Renderer

試しにMesh Rendererを追加してCubeを設定してみました。
f:id:PaperSloth:20180402210911p:plain

f:id:PaperSloth:20180402211004p:plain

また、設定したMeshのOverride Materialsを有効にすることで
Materialを変更することができます。
f:id:PaperSloth:20180402211156p:plain

f:id:PaperSloth:20180402211309p:plain


簡単にですが、Mesh Particleでシールドを作ってみました。
動きの制御はSpriteの時と同じなので、使いやすいですね。


Ribbon Renderer

Default EmitterにRibbon Rendererを割り当ててみました。
f:id:PaperSloth:20180402212541p:plain

f:id:PaperSloth:20180402212646p:plain

NiagaraPlugin内にDefaultRibbonMaterialがあるので、これを利用するとRibbonの基本的な動きは表現できそうです。

また、RibbonではEmitter自体はSpawn位置を少しばらつかせるだけで下図のようになります。
f:id:PaperSloth:20180402213616p:plain

これにBlueprintで簡単な移動処理を加えるだけで面白い移動の軌跡を表現できます。


NiagaraSystem, Actorについてのプログラマー向け小ネタ

Blueprintとの連携については以前に記事を書きました。
papersloth.hatenablog.com

Niagara Systemについて

Niagara SystemはLevel上に配置が可能ですね。
これは配置した時にNiagara Actorが作成されて、その下にNiagara Componentがアタッチされます。
また、Niagara System自体はUObjectを継承したクラスなので厳密にはNiagara Systemは配置していません。
f:id:PaperSloth:20180402214503p:plain

Niagara Actorについて

f:id:PaperSloth:20180402215311p:plain
Niagara Actorの継承関係を見るとActorを継承して作られていますね。

Niagara Actorを継承してBlueprintを作成すると
Niagara Component
・Bliiboard Component
・Arrow Component
の3つがアタッチされていますね。
f:id:PaperSloth:20180402215657p:plain

Niagara Actor側のソースコードを見ると分かるのですが
ほとんどEditor側でのみ有効になっています。
Runtimeで有効なのはNiagara Componentぐらい。

そのため、動作的にはActorを継承したBlueprintに
Niagara Componentをアタッチするのに近いですね。
f:id:PaperSloth:20180402220110p:plain

UE4 Niagara 設定について

環境

UE4.19.0


Niagara Editorのショートカットキー登録について

Editor Preferencesを開いて
Keyboard Shortcuts > Niagara Editor
ここではBounds, Gridの表示などのショートカットキーが設定できます。

私はBlueprintと同一の操作であるCompileにF7キーを割り当てました。
このショートカットはNiagara Emitter, System, Script共通です。
f:id:PaperSloth:20180328211429p:plain


Niagaraの設定

続いての設定はProject Settings > Plugins > Niagara, NiagaraEditorです
Niagaraの方の設定がイマイチ分かっていないのですが、構造体と列挙型を設定する箇所があったので下図のように設定しました。
f:id:PaperSloth:20180328212330p:plain

続いてNiagara Editorの設定です。
f:id:PaperSloth:20180328212707p:plain
ここの部分が人によっては既にセットアップ済みだったりするようです。

私の環境では設定されておらず、Release BuildやGit上のUE4.19も試してみましたがそちらでも設定されていませんでした。
設定されていない状態で新規にNiagaraEmitterを作成すると下図のような状態になります。
f:id:PaperSloth:20180328212449p:plain

DefaultEmitter等を下図のように設定しました。
DefaultScriptの欄は何を入れるのが正しいのかわからなかったため空白のままにしています。
f:id:PaperSloth:20180328212908p:plain

DefaultEmitterを設定した状態でNiagara Emitterを新規作成すると
下図のように噴水のようなエフェクトが出てきます。
f:id:PaperSloth:20180328213038p:plain


NiagaraのNodeのショートカットキー登録

ProjectSettingsのNiagaraEditorからノードのショートカットキーの登録が出来ます。
これで作業が捗りますね!

ここではAキーでAddノードを呼び出すように設定しました。
Blueprint, Materialと同様にショートカットキー + 左クリックでノードが出るようになります。
f:id:PaperSloth:20180328214320p:plain

この調子でMaterial Editorと同じような設定にしていきましょう!
A:Add
C:Add Comment
D:Divide
E:Pow(Power)
I:if
L:Lerp
M:Multiply
N:Normalize
O:One Minus
R:Reflect Vector(MaterialではReflectionVector)
S:float (MaterialではScalerParameter)
V:Vector(MaeterialではVectorParameter)
1:float
2:Vector 2D
3:Vector
4:Vector 4

以上です!

ですが、これをProject毎に都度設定するのは面倒ですね。
そこで、下記を
(ProjectDirectory)\Config\DefaultNiagara.ini
にコピペして使ってください!

[/Script/NiagaraEditor.NiagaraEditorSettings]
DefaultSystem=None
DefaultEmitter=/Niagara/DefaultAssets/DefaultEmitter.DefaultEmitter
DefaultScript=None
DefaultDynamicInputScript=/Niagara/DefaultAssets/DefaultDynamicInputs.DefaultDynamicInputs
DefaultFunctionScript=/Niagara/DefaultAssets/DefaultFunction.DefaultFunction
DefaultModuleScript=/Niagara/DefaultAssets/DefaultModule.DefaultModule
GraphCreationShortcuts=(Name="Add",Input=(Key=A,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="Add Comment",Input=(Key=C,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="Divide",Input=(Key=D,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="Pow",Input=(Key=E,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="if",Input=(Key=I,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="Lerp",Input=(Key=L,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="Multiply",Input=(Key=M,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="Normalize",Input=(Key=N,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="One Minus",Input=(Key=O,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="float",Input=(Key=S,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="Vector",Input=(Key=V,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="Reflect Vector",Input=(Key=R,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="float",Input=(Key=One,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="Vector 2D",Input=(Key=Two,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="Vector",Input=(Key=Three,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
GraphCreationShortcuts=(Name="Vector 4",Input=(Key=Four,bShift=False,bCtrl=False,bAlt=False,bCmd=False))
bAutoCompile=True

UE4 Niagara SubUVについて

環境

UE4.19.0


SubUVの設定

今回はSubUV関連の作例として下図のような仮素材を使用します。
f:id:PaperSloth:20180328195831p:plain

Niagara Emitter, Systemから
Sprite Rendering内のSub Image Sizeを変更することで分割数を任意に指定できます。
f:id:PaperSloth:20180328200020p:plain

今回使用する仮素材では4分割なので
横2, 縦2でこのように分割して1の部分が表示されるようにします。
f:id:PaperSloth:20180328200234p:plain
f:id:PaperSloth:20180328200258p:plain

SubImageIndexのRandom呼び出し

SubImageIndexを使って作成するものに煙等がありますね。
1枚のテクスチャに幾つからの絵を用意して
それをランダムに描画することで1枚のテクスチャで色んな形の変化を表現することができます。

Cascadeでの例

Niagaraでの作例


これはNiagaraでは比較的簡単に実現できます。
既存の機能から見つけられなかったため
RandomSubUVというNiagara Module Scriptを自作しました。
f:id:PaperSloth:20180328200930p:plain

処理としてはSubUVの最大数を入力したらその範囲内でSubImageIndexを指定するものです。
最大数をわざわざ入力しないでも自動的に計算してとってこれないか考え中です・・・
f:id:PaperSloth:20180328201024p:plain

SubImageIndexはCommon Attributesの中にあります。
これでIndexを指定できます。
f:id:PaperSloth:20180328201142p:plain

あとはこれをEmitterのParticle Spawnに割り合てて分割最大数を入力すれば完成です。
f:id:PaperSloth:20180328201345p:plain

少し遠くて分かりにくいかもしれませんが、1~4の数字がランダムに生成されています。


SubUVアニメーション

Cascadeでの例

Niagaraでの作例

SubUVアニメーション用の自作Script作成


今回の作成方法があまり良くなくてモヤモヤが残っているのですが紹介させていただきます。
これも既存のModule Scriptが見当たらなかったため、Module Scriptを自作します。

既存のScriptで問題ないため、下記のModule Scirpt作成の手順は不要となりました。
詳細はページ下部を参照してください。


SubUVアニメーション用のSuvUVCurveというNiagara Module Scriptを作成しました。

f:id:PaperSloth:20180328202713p:plain


処理としてはfloatの入力値を渡しているだけです。
CurveにするのはEmitter側で行っています。
この作り方がとてもモヤモヤしているので、代替案を考え中です・・・

f:id:PaperSloth:20180328203049p:plain


EmitterのParticle Updateに先程のModule Scriptを追加します。
この段階ではただのfloatの入力値です。

f:id:PaperSloth:20180328203414p:plain

SubUVCurveの右側にある▽を押下します。
f:id:PaperSloth:20180328203552p:plain

すると入力の種類を範囲指定やCurveへ変更ができるため
Float from Curveを選択します。
f:id:PaperSloth:20180328203657p:plain

変更するとfloatの入力がCurveエディタになります。
f:id:PaperSloth:20180328203911p:plain

カーブエディタを編集して0から4まで値が変化するように指定します。
f:id:PaperSloth:20180328204115p:plain

しかし、CurveIndexが0のためこのままでは常に0番目しか取得できません。
そこで、次はCurveIndexの入力値を変更します。
CurveIndexの右側にある▽を押下します。
f:id:PaperSloth:20180328204251p:plain

CurveIndexをNormalized Ageに変更します。
f:id:PaperSloth:20180328204433p:plain

これで結果は下記のようになります。
1~4までアニメーションしているのが確認できますね。

Sub Image Indexの利用

Twitter上でmokoさんに情報を提供いただきました。感謝。

SubUVCurveという自作Module Scriptを作成していましたが、不要でした。
Paricles.Sub Image IndexというScriptを利用すれば問題ありません。
f:id:PaperSloth:20180329234140p:plain

使用方法は自作Scriptと同様です。
先ずはFloat from Curveに変更します。
f:id:PaperSloth:20180329234328p:plain

続いてCurveを適切に動きになるように編集します。
f:id:PaperSloth:20180329234524p:plain

最後にCurveIndexをNormalizeAgeに変更すれば完成です。
f:id:PaperSloth:20180329234737p:plain


まとめ

NiagaraでもSubUVを編集して炎や煙が作れることがわかりましたね。

ただ、自作したModuleの汎用性が悪く正しいやり方ではなさそうなのが気がかりです。
もっとスマートなやり方が分かる方はコメントやTwitterで教えていただけると助かります。

無駄な自作Moduleの件もスッキリ解決できました。

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ノードがすごく便利なので色々と活用してみてください!

UE4 Niagara Function Scriptについて

環境

UE4.19.0


Niagara Function Scriptについて

Functionという名前がついていることからある程度予測できそうですね。
そして、その名前から予測できた内容と恐らく合っていることでしょう。

Niagara Function Scriptは
Material FunctionのNiagara
Blueprint Function Libraryの1つのFunctionのようなものです。

複数のNiagara Module Scriptで再利用可能な関数のことです。


Niagara Function Scriptを使ってみる

ちょっと良い例が浮かばなくて申し訳ないですが、使い方の雰囲気だけ伝わると幸いです。

試しにNiagara Function Scriptを作ってみましょう。
f:id:PaperSloth:20180327003333p:plain

AddUpVectorという名前のFunction Scriptを作成しました。
f:id:PaperSloth:20180327003945p:plain

開いてみると下図のようにInputとOutputがあります。
f:id:PaperSloth:20180327004011p:plain

今回は練習用なので特に中身に意味はないのですが
入力されたベクトルのZに任意の値を足す関数です。
f:id:PaperSloth:20180327004450p:plain

呼び出し方法は下図のようにNiagara Module Script内で関数名を入力することで呼び出しができます。
f:id:PaperSloth:20180327004822p:plain
f:id:PaperSloth:20180327004812p:plain


Particleの速度を取得してそこにSpeedで指定された値をZ軸にのみ足す処理を作ってみました。
f:id:PaperSloth:20180327005044p:plain

これをNiagara ExtrasにあるEmitterのUpdateに追加した結果が下記になります。
ここではSpeedに10を与えています。


まとめ

Niagara Function Scriptの例としては良くなかったのですが、使い方のイメージは伝わったでしょうか?

実用的な関数の例はNiagara, Niagara ExtrasのContentフォルダを覗いてみてください。
SlerpQuaternionやEularToQuaternionなど実用的な関数が沢山登録されています。