🐡
【Unreal】C++側で作成したインターフェースをBP側で実装されているのか確認して実行する方法
概要
この記事はUE5でインターフェースを実装したActorから関数を呼ぼうとした際にうまく行かないことがあったため、備忘録としてまとめたものです。
確認したUEのバージョンは 5.3.2
になります。
自作のインターフェースや実装しているインターフェースは以下を想定しています
-
UMyInterface
、IMyInterface
は仮の名前なので、適宜自作の置き換えていただければ幸いです。 -
TargetActor
はインターフェースを実装してるActorを想定しています。
やりたいこと
- BPで実装する対象のインターフェースをC++で用意
- インターフェースを実装したBPを用意
- C++でインターフェースを実装したBP(Actor)だったら処理を実行させる
1
と3
についてはコードを用いて説明します。
BPで実装するインターフェースをC++で用意
下記のようなインターフェースを用意します。
#pragma once
#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "MyInterface.generated.h"
UINTERFACE()
class UMyInteraction : public UInterface
{
GENERATED_BODY()
};
class IMyInterface
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
void Function();
};
C++側でインターフェースを実装したBP(Actor)だったら処理を実行させる
以下のコードで対象のインターフェースが実装されてるか確認し、インターフェースの機能を呼び出す事ができます。
if(TargetActor->Implements<UMyInterface>()) //対象のアクターにインターフェースが実装されているか確認
{
IMyInterface::Execute_Function(TargetActor); //UFUNCTIONで実装された場合はExecute_じゃないと呼ばれない
}
C++側で用意したIMyInterface::Function
ではなく、IMyInterface::Execute_Function
で呼び出している理由は、UFUNCTIONで実装された関数はそのままだと実行されないみたいです。
C++側で実装したInterfaceに対して呼び出す場合は、従来通りIMyInterface::Function
で問題ないみたいです。
参考
余談(知りたい人向け)
上のやり方をする前は以下のやり方でやっていましたが、CastでNULLが返ってきたので出来ず、調べた結果上のような形になりました。
IMyInterface* MyInterface = Cast<IMyInterface>(TargetActor);
if(MyInterface)
{
MyInterface->Function(); //NULLが返って来てしまっていた
}
参考
Safely Casting An AActor* to IMyInterface* ?
C++ Interface Cast returns NULL when implemented with Editor
Discussion