在Epic官方的塔防游戏源码中看到的关于Interface用法,写法非常绕。。这里做下笔记。
1,先建一个空的C++工程,名字叫做TestProj。
2,现在Editor中新建一个空的C++ class(父类选择None即可,论坛上说父类继承Object也可以)。创建完后生成的内容是这样的:
MyInterface.h原始代码
#pragma once
/**
*
*/
class TESTPROJ_API MyInterface
{
public:
MyInterface();
~MyInterface();
};
将其改成以下内容(目前版本貌似只能手动改,官方文档上也是要求手动改。。),这里注意下:上面是UMyInterface,下面是IMyInterface。
后面的代码都要特别注意下,因为这个U和I开头的类型名会交替出现,比较蛋疼。。
这里为了演示,在IMyInterface中添加了两个函数,一个是虚函数ToString(),一个是UE4模版函数。
注意里面的宏定义,上面是GENERATED_UINTERFACE_BODY,下面是GENERATED_IINTERFACE_BODY。
MyInterface.h修改后代码
#pragma once
#include "MyInterface.generated.h"
/**
*
*/
UINTERFACE()
class UMyInterface : public UInterface
{
GENERATED_UINTERFACE_BODY()
};
class IMyInterface
{
GENERATED_IINTERFACE_BODY()
virtual FString ToString();
//Interface中函数的说明符也可以不是BlueprintNativeEvent,这里仅演示
UFUNCTION(BlueprintNativeEvent)
void OnInputHoldReleased(float DownTime);
};
然后MyInterface.cpp文件的内容也要全部改掉,这里的构造函数必须定义成:UMyInterface(const class FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer),且实现其他函数时,必须用IMyInterface,
改后的内容如下,MyInterface.cpp:
#include "TestProj.h"
#include "MyInterface.h"
UMyInterface::UMyInterface(const class FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
FString IMyInterface::ToString()
{
return "IMyInterface::ToString()";
}
3,新建一个常规的自定义Actor,并继承IMyInterface,在文件中不能自己定义构造函数,取而代之的是一个宏定义:GENERATED_UCLASS_BODY。除非确认无需调用父类MyInterface的构造函数,那么可以使用GENERATED_BODY,并定义常规的构造函数。
其中重写父类OnInputHoldReleased() 方法时,添加了_Implementation后缀,这是因为使用BlueprintNativeEvent说明符,若要实现BlueprintNativeEvent的函数,函数名必须添加_Implementation后缀。
MyActor.h
#pragma once
#include "GameFramework/Actor.h"
#include "MyInterface.h"
#include "MyActor.generated.h"
UCLASS()
class TESTPROJ_API AMyActor : public AActor, public IMyInterface
{
GENERATED_UCLASS_BODY()
virtual FString ToString() override;
virtual void OnInputHoldReleased_Implementation(float DownTime) override;
};
子类实现时构造函数也需要用同样的模版格式:AMyActor(const class FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer),
MyActor.cpp
#include "TestProj.h"
#include "MyActor.h"
AMyActor::AMyActor(const class FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
FString AMyActor::ToString()
{
return "AMyActor::ToString()";
}
void AMyActor::OnInputHoldReleased_Implementation(float TimeDown)
{
}
【2016-09-23更新】
最新版的UE4已经不支持这种写法,会提示编译错误:
error C2084: function 'AMyActor::AMyActor(const FObjectInitializer &)' already has a body
最新版本写法是:如果要构造函数,那么构造函数不用带参数且需要在头文件中定义无参构造函数
4,调用UFUNCTION和普通函数调用方法不同,调用UFUNCTION类型的接口函数时,要通过“接口名::Execute_函数名(子类对象实例, 参数......)”,例如下面:IMyInterface::Execute_OnInputHoldReleased(Actor, 0.5f);void AMyPlayerController::BeginPlay()
{
Super::BeginPlay();
//ClientSetViewTarget();
//1,调用蓝图函数
AActor* const Actor = NULL; //这里假设actor不为NULL,为演示方便没有实现获取MyActor的逻辑
if (Actor && Actor->GetClass()->ImplementsInterface(UMyInterface::StaticClass()))
{
IMyInterface::Execute_OnInputHoldReleased(Actor, 0.5f);
}
//2,调用普通函数
IMyInterface* myInterface = Cast<IMyInterface>(Actor);
FString str = myInterface->ToString();
}
分享到:
相关推荐
openc3.2进行cmake时需要下载的文件。 下载vgg_generated_48.i放在opencv_contrib/modules/xfeatures2d/cmake/.download/e8d0dcd54d1bcfdc29203d011a797179。最后面的文件夹可能不一样。
Ubuntu18.04+OpenCV3.2.0进行源码编译安装时,可能会出现Failed to download vgg_generated_48.i等系列错误。现把相关文件通过zip打包下载,下载后解压,按需替换相应目录里面的同名文件即可,比如:把vgg_generated...
编译opencv时出现错误,常见的替换包:ippicv_linux_20151201.tgz和和vgg_generated_48.i(64、80、120)
包含以下文件: boostdesc_bgm.i boostdesc_bgm_bi.i boostdesc_bgm_hd.i boostdesc_lbgm.i boostdesc_binboost_064.i boostdesc_binboost_128.i boostdesc_binboost_256.i vgg_generated_120.i ...vgg_generated_48.i
opencv3.2+opencv_contrib等编译需要的文件,一般放在opencv_contrib/module/xfeatures2d/camke/.download/下中的文件夹中
openc3.2进行cmake时需要下载的文件。 下载vgg_generated_120.i放在opencv_contrib/modules/xfeatures2d/cmake/.download/e8d0dcd54d1bcfdc29203d011a797179。最后面的文件夹可能不一样。
VS编译opencv4.2扩展模块opencv_contrib-master缺失文件,下载失败,手动地址下载也失败的,可以下载本资源,解压后直接放到opencv_contrib-master\modules\xfeatures2d\src文件夹内,文件列表:...vgg_generated_120.i
解决Opencv3.3.0编译contrib时报错:“vgg_generated_120.i”: No such file or directory和“boostdesc_bgm.i”: No such file or directory等问题。 将目录中boostdesc_bgm.i、boostdesc_bgm_bi.i、boostdesc_bgm_...
vgg_generated_120.i vgg_generated_80.i boostdesc_lbgm.i 等openCV容易下载失败的文件,根据提示放在对应目录中
Opencv安装过程中使用的vgg_generated_120.i等额外文件,本人亲测可用
fatal error: boostdesc_bgm.i: 没有那个文件或目录 #include "boostdesc_bgm.i" 将这些文件放到/home/pi/.........../opencv_contrib/modules/xfeatures2d/src目录下 包括 ...vgg_generated_120.i
版本opencv4.1.0 cmake3.15 ,以下是所包含的下载内容: ippicv_2019_win_intel64_20180723_general.zip ...vgg_generated_48.i vgg_generated_64.i vgg_generated_80.i vgg_generated_120.i face_landmark_model.dat
该文件是opencv计算机视觉库移植opencv,并在Linux系统下编译时所需要的几个文件
opencv编译时出错:vgg_generated_120.i找不到,opencv4.5.1可用 直接拷贝到:opencv_contrib/modules/xfeatures2d/src/
vgg_generated,total 4 files,just for 3 marks,please download now!
opencv3.2编译需要的vgg_generated_48(64、80、120).i boostdesc_bgm.i、boostdesc_bgm_bi.i、boostdesc_bgm_hd.i、boostdesc_binboost_064.i(128、256)、boostdesc_binboost_064.i
opencv-contrib 编译过程中缺失的vgg_generated_120.i等文件,复制在/home/****/opencv-3.4.2/modules/xfeatures2d/src目录下。
opencv_contrib-4.2.0.zip 编译过程中需要下载的文件 将文件解压后放置到..\opencv\sources\.cache 替换这个文件路径即可 注意版本和路径 ade data ffmpeg ippicv text.txt xfeatures2d
GENERATED_IINTERFACE_BODY 演示 前 后 安装 从这里下载并安装 Visual Studio 的 Visual Commander 扩展: : 转到 VCmd -> 导入并导入与您的 Visual Studio 版本相对应的 ue4_smarter_macro_indenting*.vcmd。 ...
opencv3.4编译时无法下载的文件,这里提供本资源。 其他版本如3.2应该也可以,请放心下载。还是不到50个字,现在够了吗