🐡

【Unreal】C++側で作成したインターフェースをBP側で実装されているのか確認して実行する方法

2024/09/04に公開

概要

この記事はUE5でインターフェースを実装したActorから関数を呼ぼうとした際にうまく行かないことがあったため、備忘録としてまとめたものです。

確認したUEのバージョンは 5.3.2 になります。

自作のインターフェースや実装しているインターフェースは以下を想定しています

  • UMyInterfaceIMyInterfaceは仮の名前なので、適宜自作の置き換えていただければ幸いです。
  • TargetActorはインターフェースを実装してるActorを想定しています。

やりたいこと

  1. BPで実装する対象のインターフェースをC++で用意
  2. インターフェースを実装したBPを用意
  3. C++でインターフェースを実装したBP(Actor)だったら処理を実行させる

13についてはコードを用いて説明します。

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