PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE4 C++で複数実行ピンの作成

環境

UE4.19.1
Visual Studio 2015 Community


概要

いくつかやり方があって、今回は一番簡単でお手軽なenumを使ったやり方を紹介します。


enumを使った関数のおさらい

先ずは下記のようなenumを定義します。

UENUM(BlueprintType)
enum class EErrorCode : uint8
{
    Success,
    Failed
};

続いてUFUNCTIONマクロを使用してBlueprintに関数を公開します。

UFUNCTION(BlueprintCallable, Category = "Example")
void ExampleEnumInput(const EErrorCode ErrorCode);

// 関数内でErrorCodeの値が変わる関数を想定
UFUNCTION(BlueprintCallable, Category = "Example")
void ExampleEnumOutput(EErrorCode& ErrorCode);

constなしの参照にすることで引数が出力ピンに変わります。
constをつけた参照の場合は引数が入力ピンになります。

Blueprintから先程の関数を呼び出すと下図のようになります。
f:id:PaperSloth:20180422143212p:plain


enumを使った複数実行ピンの作成方法

さて、ようやく本題です。
enumを使って複数の実行ピンを使用するにはUFUNCTIONのmetaに下記を追加することで実現可能です。

UFUNCTION(/*省略*/,  meta = (ExpandEnumAsExecs = "ArgumentName"))

ArgumentNameの部分は任意の引数名を入力します。
実際に使用する引数名と一致するようにします。

先程の関数に手を加えて下記のように変更しました。

UFUNCTION(BlueprintCallable, Category = "Example", meta = (ExpandEnumAsExecs = "ErrorCode"))
void ExampleEnumMultiInput(const EErrorCode ErrorCode);
UFUNCTION(BlueprintCallable, Category = "Example", meta = (ExpandEnumAsExecs = "ErrorCode"))
void ExampleEnumMultiOutput(EErrorCode& ErrorCode);

Blueprint側から呼び出すと下記のようになります。
f:id:PaperSloth:20180422144216p:plain

enumで登録した値が全て実行ピンになっていますね。
後はC++側でswitchとかで処理を分けると良さそうです。

また、enumで定義を追加するとノードも変更されます。

UENUM(BlueprintType)
enum class EErrorCode : uint8
{
    None,
    Success,
    InternalError,
    ExternalError,
    NetworkError,
    UnknownError,
};

Noneを定義した場合は実行ピンには名前が出ません。
f:id:PaperSloth:20180422152849p:plain


簡単な応用

もう少し気の利いた処理になるように関数の中身も書いてみます。

Successの時、Failedの時でそれぞれ呼び出す関数を登録します。
C++だけで処理を実装するのは直ぐにできますが
今回はC++で関数の定義をしてBlueprintでロジックを実装する形にしてみましょう。

先ずは呼び出す関数の登録を行います。

UFUNCTION(BlueprintImplementableEvent, Category = "Example")
void OnSuccess();
UFUNCTION(BlueprintImplementableEvent, Category = "Example")
void OnFailed();

成功時、失敗時のそれぞれの関数を用意しました。
BlueprintImplementableEventはC++側で定義してBlueprintで関数のロジックを実装するときに使用します。
この定義だとBlueprintで処理の記述はできますが、関数呼び出しはC++からしか呼び出せません。
Blueprintからも呼び出したい場合は、BlueprintCallableと組み合わせることで使用できます。

複数実行ピンを入力できる関数で呼び出しを行うように処理を記述します。

void AExampleActor::ExampleEnumMultiInput(const EErrorCode ErrorCode)
{
    switch (ErrorCode)
    {
        case EErrorCode::Success:
            OnSuccess();
            break;
        case EErrorCode::Failed:
            OnFailed();
            break;
    }
}

これでBlueprint側で処理の登録と呼び出しを行ってみましょう。
下図のように組むとSuccessに実行ピンを繋ぐとOnSuccessが呼ばれ
Failedに実行ピンを繋ぐとOnFailedが呼びだされます。
f:id:PaperSloth:20180422150809p:plain

こういった処理を書く場合はDelegateで登録することが多いですが
今回は複数実行ピンを使用したイメージとして用意してみました。


また、余談ですがMultiOutput関数は
下図のようにOutputをSwitch分岐させるのと同様の処理になります。
ですが、C++側で何か処理を加えたい場合に役立ちますし、ノードもスッキリするため
ExpandEnumAsExecs を積極的に使用した方が良いでしょう。
f:id:PaperSloth:20180422151304p:plain