UnrealEngine4でc++からblueprintの関数を呼び出す方法

apiを作る時に、c++でapiを呼び出して、blueprint上でレスポンスを受け取りレイアウトに反映するという処理を以前やったので、
忘れないようやり方をまとめたいと思います。

親クラスがactorのc++ファイルを作成する

今回の例では、親クラスがactorのc++ファイルを作成します。
名前をHttpServiceとしました。

続いて、blueprintの関数を呼び出すためのc++関数を定義します。
今回は、c++側の関数でapiを呼び出す、webからリクエストの結果が返ってくる。
そのリクエストの返り値をblueprintの関数に渡して、レイアウトに反映させるという流れを例にします。

c++でhttpRequestを送る

まず、apiを呼び出す関数を書きます。


void AHttpService::addRankingRequest(FString name,float distance) {
    // create post string
    FString postString = "{\"name\":\"" + name + "\",\"distance\":" + FString::SanitizeFloat(distance) + "}";
    // request
    TSharedRef Request = PostRequest("addRanking.php", postString);
    Request->OnProcessRequestComplete().BindUObject(this, &AHttpService::addRankingResponse);
    Send(Request);
}      
      

Request->OnProcessRequestComplete().BindUObject(this, &AHttpService::addRankingResponse);
にて、callback関数にaddRankingResponse関数を指定しています。
ですので、apiが呼ばれて、結果が返ってきた時にaddRankingResopnse関数が呼ばれます。

c++からbluerpintの関数を呼び出す

続いて、apiのcallbackとして指定した関数からblueprintの関数を呼びだします。


void AHttpService::addRankingResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful) {
    if (!ResponseIsValid(Response, bWasSuccessful))return;
    // return response
    FString contentString = Response->GetContentAsString();
    // 1.レスポンスとして順位が数値で返ってくる
    int rank = FCString::Atoi(*contentString);
    UE_LOG(LogTemp, Warning, TEXT("response is: %d"), rank);
    FOutputDeviceNull ar;
    // 2.bluerprint側で呼ばれる関数を指定
    const FString funcCommand = "returnAddRankingResponse " + FString::FromInt(rank);
    // 3.blueprintの関数を呼ぶ
    this->CallFunctionByNameWithArguments(*funcCommand, ar, NULL, false);
}
	  

CallFunctionByNameWithArguments関数で、bluerprintで定義した関数を呼ぶことができます。
consoleを呼ぶ関数らしく、第1引数に代入した、命令文が実行されます。

(2.)で、実行する関数を指定しています。
"関数名" + "空行" + "引数"という形のフォーマットになっています。
ここでは、関数名をreturnAddRankingResponseに、引数にint型のrankを文字列にして渡しています。

あとは、bluerprint側でこれらの関数が呼び出せるようにheaderの定義をします。

headerの定義

省略していますが、ヘッダーファイルの定義は以下のようになります。


UCLASS(Blueprintable, hideCategories = (Rendering, Replication, Input, Actor, "Actor Tick"))
class SAMPLE_API AHttpService : public AActor
{
    GENERATED_BODY()
private:
        
protected:
    // Called when the game starts or when spawned
    virtual void BeginPlay() override;
public:
    // Sets default values for this actor's properties
    AHttpService();
    // 1.関数をblueprint側で呼び出せるようにする
    UFUNCTION(BlueprintCallable, Category="HttpService")
    void addRankingRequest(FString name,float distance);
    void addRankingResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
};
      

blueprintで呼び出せるように、
UFUNCTION(BlueprintCallable, Category="HttpService")をつけています。

levelにて対象のbluerpintを作成する

HttpServiceを親にもつblueprintクラスを作成します。

Bluerprintを作成しようとすると、作成したHttpSerive actorがあるのでそれを親クラスにblueprintを生成します。

続いて、作成したblueprintクラスをレベル上に置くなどして、HttpService Actorをインスタンス化します。
そして、以下のようにc++の関数addRankingRequestを読んで、リクエストを送信します。

bluerprintからc++の関数を呼ぶ

c++から呼び出されるblueprintの関数の定義をする

addRankingRequestのcallbackに指定した関数returnAddRankingResponseをHttpServiceを親にしたblueprintクラスにて作成します。

関数名をreturnAddRankingResponseに、引数にint型の引数名rankを設定します。
以下のようになります。

c++からbluerprintで呼ばれる関数の定義をする

関数を定義することで、c++側でcallbackが呼ばれると、自動でreturnAddRankingResponseが呼ばれます。
今回は、関数が呼び出された時に、httpserive内でdispatcherを定義して、呼び出すようにしています。

c++からbluerprintで呼ばれる関数設定

呼び出されたdispatcher内で、返ってきた引数に応じたuiの処理などをしています。

以上になります。

UnrealEngine4.21で確認しています。

初版:2019/9/22
最終更新:2019/9/22

このエントリーをはてなブックマークに追加