首页 > 代码库 > ue4 c++ 接口

ue4 c++ 接口

使用UE4接口比起普通的高级语言,要多做很多工作,是因为要兼容蓝图的使用,有一些小坑需要注意,开始吧。

 

1.新建接口类

打开UE4编辑器,与往常一样,新建C++类,然后选择Object继承,然后取名字,这里我使用工作中我的接口名,作为例子说明,“ITrackTeam”

技术分享

 

然后修改继承的类,而且你没有看错,就是写2个class,一个叫UTrackTeam,一个叫ITrackTeam,类名和头文件名可以不一样的,我这边命名没有遵守虚幻的规则,本来应该命名为“UITrackTeam”和“IITrackTeam”。

.h file

#pragma once

#include "Object.h"
#include "ITrackTeam.generated.h"

UINTERFACE(Blueprintable)
class UTrackTeam : public UInterface
{
    GENERATED_UINTERFACE_BODY()
};

class ITrackTeam
{
    GENERATED_IINTERFACE_BODY()

public:

    /* 获得前方的跟随对象 */
    UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Item")
    AActor* GetPreMember();

    /* 获得跟随目标点位置 */
    UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Item")
    FVector GetTailLocation(int32 &param1, bool param2);

};

 

.cpp file

#include "Programming.h"
#include "ITrackTeam.h"

UTrackTeam::UTrackTeam(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{

}

 

2.C++类实现这个接口

我有个实现接口的Actor,“AImplementInterfaceActor”,接着先引用头文件

#include "Interface/ITrackTeam.h"

然后继承接口类

class PROGRAMMING_API AImplementInterfaceActor : public AActor, public ITrackTeam

实现接口,注意要在原有的方法名后面,加上“_Implementation”

virtual AActor* GetPreMember_Implementation() override;

virtual FVector GetTailLocation_Implementation(int32 &param1, bool param2) override;

 

.cpp file,可以这么洋洋洒洒的写一写测试语句,可以被蓝图调用的。

AActor* AImplementInterfaceActor::GetPreMember_Implementation()
{
    AActor *temp = nullptr;
    return temp;
}

FVector AImplementInterfaceActor::GetTailLocation_Implementation(int32 &param1, bool param2)
{
    GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString::FromInt(param1));
    if (param2)
    {
        GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red,TEXT("True") );
    }
    param1 = 7;
    return FVector(0.0f, 1.0f, 2.0f);
}

 

3.C++中,给某个类发送接口消息

先转化成接口类,然后调用方法,调用的时候注意,一定要用“Execute_”+方法名,括号内,如果是无参数的方法,直接写目标类原有的指针,如果有参数,比如一个int32和bool,连着写在后面就可以了。

AActor* temp = nullptr;
ITrackTeam* iTemp = Cast<ITrackTeam>(this);
if (iTemp)
{
    int32 refInt = 5;
    FVector TmpVector = iTemp->Execute_GetTailLocation(this, refInt, true);
    GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TmpVector.ToString());
    GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString::FromInt(refInt));
}

 

4.确定特定类是否实现了接口

为保证 C++ 和实现接口的蓝图类之间的兼容性,使用以下代码:

obj->GetClass()->ImplementsInterface(UItemInterface::StaticClass());

 

其他链接。

官方文档:https://docs.unrealengine.com/latest/CHN/Programming/UnrealArchitecture/Reference/Interfaces/index.html

wiki:https://wiki.unrealengine.com/Interfaces_in_C%2B%2B

问答:https://answers.unrealengine.com/questions/250263/calling-interface-functions-in-c.html

ue4 c++ 接口