本日はマクロについてです。
マクロにはいくつか種類がありますが、特性が割と似ているので正しく使い分ける必要があります。
【概要】
公式ページより
https://www.unrealengine.com/ja/blog/blueprint-macros-and-macro-libraries
【分類】
●BlueprintFunctionLibrary
どこからでも呼び出しできる
●BlueprintMacroLibrary
継承クラスから呼び出しできる
●独自macro(LocalMacro)
自Blueprint内であれば、どの場所からでも呼び出しできる
LevelBlueprint、ClassBlueprint内で独自に作成できる
で、それぞれの使用例。
【マクロの特性】
・関連するBluePrintを変更してもCompileする必要がない
(ただし、変更の影響は受けるので再保存する必要はある)
いずれも似たような振る舞いとなります。
MacroLibraryと独自Macroの振る舞いはほぼ同じようですが、FunctionLibraryとMacroLibraryは厳密には結構違うようです。では、それぞれの違いはどこにあるのか。AnswerHubに公式回答があったのでざっくり和訳してみました。
●FunctionLibraryとacroLibraryについて
https://answers.unrealengine.com/questions/30834/whats-the-difference-between-blueprint-macros-and.html
【違いまとめ】
・BlueprintFunctionLibrary
→親クラスを指定しない(必ずUBlueprintFunctionLibraryの継承クラス)
→出力が1つ
・BlueprintMacroLibrary
→親クラスを指定する
→出力が複数
【例えばこういうこと】
●10台の車を作る場合…
「FunctionLibrary」は1工場を10回使って10台の車を作る
「MacroLibrary」は10工場を1回使って10台の車を作る
すごく分かりやすい例えです。MacroLibraryは「置き換え」が主であるのに対し、FunctionLibraryは「関数」である点が違います。
また、ソースコードにも「BlueprintFunctionLibraryは静的処理を推奨、動的なことはさせないこと」とコメントがありました。つまり、どこでも呼べるので、Global変数のような扱いは推奨しないよ(いつでも変更、どこでも変更はヨクナイ)ということ。
以上、違いについて。
ここからは昨日話題にあげたDelay関連。
・BlueprintFunctionLibrary
→Delay使用不可
・BlueprintMacroLibrary
→Actorクラス継承であれば関数内であってもDelayを使用可
→Objectクラス継承だと使用不可
FunctionLibraryはあくまで関数なので使用できません。
一方、MacroLibraryはObjectクラス継承だと使用できず、Actorクラス継承だと使用できます。
なぜかというと、
→DelayはUKismetSystemLibraryクラスのメンバ関数
→UKismetSystemLibraryは、UBlueprintFunctionLibraryの継承クラス
→UBlueprintFunctionLibraryは、UObjectの継承クラス
つまり、UObject継承クラスのMacroではDelayを使用できないということです。
以上、MacroとDelayの関連についてでした。