BLOGブログ

2020.05.13UE4/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 でも扱えるようにしておくと便利そうですね。
ぜひご活用ください!