ぼっちプログラマのメモ

Unreal Engineについて書いたりしてます

【UE5】小ネタ:指定した関数がBPで実装・Overrideされているかを判定する方法

Moverの勉強中に見かけたコードが面白かったので自分用メモ

// 指定した UFunction が Blueprint 側で実装されているかを判定する
auto IsImplementedInBlueprint = [](const UFunction* Func) -> bool
{
    return Func && ensure(Func->GetOuter())
        && Func->GetOuter()->IsA(UBlueprintGeneratedClass::StaticClass());
};

// Blueprint 実装を確認したい関数名
static FName ProduceInputBPFuncName = FName(TEXT("OnProduceInputInBlueprint"));

// 現在のクラスから対象の関数を検索
UFunction* ProduceInputFunction = GetClass()->FindFunctionByName(ProduceInputBPFuncName);

// 対象関数が Blueprint 側に実装されているかをキャッシュ
bHasProduceInputinBpFunc = IsImplementedInBlueprint(ProduceInputFunction);

指定されているOnProduceInputInBlueprint関数は以下のように宣言されており、

UFUNCTION(BlueprintImplementableEvent, DisplayName="On Produce Input", meta = (ScriptName = "OnProduceInput"))
FMoverInputCmdContext OnProduceInputInBlueprint(float DeltaMs, FMoverInputCmdContext InputCmd);

BP側で実装が書かれてれば実行、されてなければスキップという処理が行われてます。

void AMoverExamplesCharacter::ProduceInput_Implementation(int32 SimTimeMs, FMoverInputCmdContext& InputCmdResult)
{
    OnProduceInput((float)SimTimeMs, InputCmdResult);

    if (bHasProduceInputinBpFunc)
    {
        InputCmdResult = OnProduceInputInBlueprint((float)SimTimeMs, InputCmdResult);
    }
}

上記のコードはAMoverExamplesCharacter からの引用ですが、その他だと UGameplayAbility のコンストラクタで同様のコードが使われてたりして面白かったです。 おしまい