執筆バージョン: Unreal Engine 4.24 |
みなさん、MathExpression 使ってますか? 公式ドキュメントにもあるように、MathExpressionには以下のような特徴があります:
- 計算式を直接書ける。
- ブループリントにない変数名は入力ピンになる。
- ブループリントにある変数名を書くと、変数値を使える。
- 一部の関数を使える。
今回は、この中でも、「一部の関数を使える。」にフォーカスしてみようと思います。 改めて公式ドキュメントを読んでみると 「コード化された関数ライブラリにあるブループリント純粋関数は、すべて利用できます。」 と書かれています。これはどういうことでしょうか? エンジンコードを探してみると、MathExpression で使用できる関数かどうかは、以下のような条件があるようです:
- static 関数である
- BlueprintPure である
- ネイティブ関数である
- 出力が1つ(ReturnValue)だけある
- (他にもいくつかあります、気になる方は FKCHandler_MathExpression::CanBeCalledByMathExpression() (MathExpressionHandler.cpp) を見てみてください!)
と、いうことは、UBlueprintFunctionLibrary を継承した C++ クラスで、static で BlueprintPure な関数を作成して ブループリントで使えるようにすれば、MathExpression でも自作関数を扱えそうです。 一方で、UE4標準の関数でも、DisplayName に “()” を含む関数は、MathExpression では使えないようです… (どなたかエスケープ方法などご存じでしたら教えてください!) 例えば、”Lerp” 関数は使えますが、 “Lerp (Vector)” 関数はエラーになります。 KismetMathLibrary.h 上での定義名である、VLerp でもダメなようです。

※関数名の大文字小文字は区別されないようです。 そこで、オリジナルのラッパー関数を作成して、VLerp を MathExpression で扱えるようにしてみましょう。 UBlueprintFunctionLibrary を継承した MyFunctionLibrary クラスを作成し、VLerp という static 関数を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
#pragma once #include "CoreMinimal.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "Kismet/KismetMathLibrary.h" #include "MyFunctionLibrary.generated.h" UCLASS() class MATHEXPRESSION_API UMyFunctionLibrary : public UBlueprintFunctionLibrary { GENERATED_BODY() public: UFUNCTION(BlueprintPure, BlueprintCallable, Category = "MyMath") static FVector VLerp(FVector A, FVector B, float Alpha) { return UKismetMathLibrary::VLerp(A, B, Alpha); } }; |
これをビルドすると、MathExpression で VLerp という関数が使えるようになります。

このように、C++ 限定ではありますが、自作の static な BlueprintPure 関数を作ることで、MathExpression で使うことができるようになります。 プロジェクトでよく使う計算などは、このようにして MathExpression でも扱えるようにしておくと便利そうですね。 ぜひご活用ください!