執筆: T.T
はじめに
今回紹介するのはUnreal EngineでBPとCppの連携について記載しようと思います。
よくWBPにcppで計算したパラメータを送る場合や
WBPをユーザーが操作した場合にcppに結果を送りたい場合など多々あるとおもいますが、
あまり記事がないのでここに記載します。
用意するもの
Unreal Engine
Visual studio
cppファイルを継承したBPファイル
準備
levelBPに該当実験用のBPをインスタンス化して表示状態にしておきます。
headerの内容
UCLASS()
class CALL_API UMainUserWidget : public UUserWidget
{
GENERATED_BODY()
protected:
UFUNCTION(BlueprintCallable)
void ButtonFunc(int point);
UFUNCTION(BlueprintNativeEvent, Category = "MyCategory")
void UpdateBP(int point);
virtual void UpdateBP_Implementation(int point);
};
二つの関数ButtonFuncとUpdateBPを追加
cppファイルの内容
void UMainUserWidget::ButtonFunc(int point)
{
AsyncTask(ENamedThreads::GameThread, [point, this]()
{
this->UpdateBP(point * 100);
});
}
void UMainUserWidget::UpdateBP_Implementation(int point)
{
}
BPからCPPの関数を呼び出す方法
BPからCPPの関数を呼び出す方法については簡単で、
下記のようにheaderに宣言すればBPで呼び出し可能です。
(.h)
UFUNCTION(BlueprintCallable)
void ButtonFunc(int point);
(.cpp)
void UMainUserWidget::ButtonFunc(int point)
{
AsyncTask(ENamedThreads::GameThread, [point, this]()
{
this->UpdateBP(point * 100);
});
}
コンパイルが通れば下記のようにBP内でcppの関数を使うことができます。
CPPからBPの関数を呼び出す方法
cppからBPを呼び出す方法は、下記のように記載を行う必要があります。
(.h)
UFUNCTION(BlueprintNativeEvent, Category = "MyCategory")
void UpdateBP(int point);
virtual void UpdateBP_Implementation(int point);
cpp側ではImplementation関数も記載します。
(.cpp)
void UMainUserWidget::ButtonFunc(int point)
{
AsyncTask(ENamedThreads::GameThread, [point, this]()
{
this->UpdateBP(point * 100);
});
}
void UMainUserWidget::UpdateBP_Implementation(int point)
{
}
また使用する場合は非同期処理を行う必要があります。
AsyncTask(ENamedThreads::GameThread, [point, this]()
{
this->UpdateBP(point * 100);
});
コンパイルを行うことで、BP側で利用することができます。
注意点として、BP側だけみてもブレイクポイントを貼らない限り
いつのタイミングで呼ばれるかわからないので明示的に情報を記載するほうが安全です。
処理の流れ
こちらが今回疎通処理で使用した箇所のイベントグラフです。
単純に画面のボタンが押された際、「BP→CPP」を経由し、「CPP→BP」という形でコールしています。
処理の内容に関しては単純で入力された点数をcpp側で受け取り100倍にして返す処理を記載しています。
まとめ
今回の記事作成にあたって、よくcppだけわかるけどBPについてはわからない。
BPはネットに情報があるけどCPPの情報がない。
そしてcppとBPの連携がうまくいかないので処理を変えるということが
でてくるのはもったいないと思い作成しました。
自分的にはBPに全体の処理を記載して細かな処理をCPP側で記載するということが
プランナーやプログラマーと仕事を分けることができるのでいいのかなと思います。