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 のコンストラクタで同様のコードが使われてたりして面白かったです。
おしまい