BLOGブログ

2020.05.13UE4UE/ C++

[UE4] MathExpressionで自作の関数を使う

執筆バージョン: 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 でもダメなようです。

Lerp と Lerp (Vector)

※関数名の大文字小文字は区別されないようです。 そこで、オリジナルのラッパー関数を作成して、VLerp を MathExpression で扱えるようにしてみましょう。 UBlueprintFunctionLibrary を継承した MyFunctionLibrary クラスを作成し、VLerp という static 関数を作成します。

これをビルドすると、MathExpression で VLerp という関数が使えるようになります。

MathExpression を追加して、vlerp を指定する。

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