`
aigo
  • 浏览: 2719247 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

[UE4]Interface用法:GENERATED_IINTERFACE_BODY

UE4 
阅读更多

在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

最新版本写法是:如果要构造函数,那么构造函数不用带参数且需要在头文件中定义无参构造函数
AMyActor::AMyActor()
{
}
 

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();
}
分享到:
评论

相关推荐

    ‘vgg_generated_120.i’and ‘boostdesc_bgm.i’No such file or directory.rar

    解决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

    openc3.2进行cmake时需要下载的文件。 下载vgg_generated_120.i放在opencv_contrib/modules/xfeatures2d/cmake/.download/e8d0dcd54d1bcfdc29203d011a797179。最后面的文件夹可能不一样。

    fatal error: boostdesc_bgm.i: No such file or directory补充文件

    1. `vgg_generated_120.i`, `vgg_generated_80.i`, `vgg_generated_64.i`, `vgg_generated_48.i`: 这些可能是不同尺寸的VGG特征描述符的预编译版本,数字可能代表描述符的大小(如字节或维数)。 2. `boostdesc_...

    boostdesc_bgm.i,vgg_generated_48.i等缺少文件.zip

    fatal error: boostdesc_bgm.i: 没有那个文件或目录 #include "boostdesc_bgm.i" 将这些文件放到/home/pi/.........../opencv_contrib/modules/xfeatures2d/src目录下 包括 ...vgg_generated_120.i

    Opencv安装过程中使用的vgg_generated_120.i等额外文件

    4. **安装**:编译完成后,使用`make install`将编译好的库文件安装到系统指定的位置。 5. **验证**:最后,你可以编写简单的测试程序,调用OpenCV的相关功能,如物体检测,来验证安装是否成功。如果一切正常,`vgg...

    vgg_generated_48.i

    openc3.2进行cmake时需要下载的文件。 下载vgg_generated_48.i放在opencv_contrib/modules/xfeatures2d/cmake/.download/e8d0dcd54d1bcfdc29203d011a797179。最后面的文件夹可能不一样。

    vgg_generated_48i、64i、80i、120i

    标题“vgg_generated_48i、64i、80i、120i”所涉及的是OpenCV库中的一个特定部分,这与计算机视觉领域息息相关。OpenCV(开源计算机视觉库)是一个广泛使用的跨平台库,包含了各种用于图像处理和计算机视觉的算法。...

    vgg_generated_48.i和boostdesc_bgm.i等系列文件.zip

    Ubuntu18.04+OpenCV3.2.0进行源码编译安装时,可能会出现Failed to download vgg_generated_48.i等系列错误。现把相关文件通过zip打包下载,下载后解压,按需替换相应目录里面的同名文件即可,比如:把vgg_generated...

    opencv_contrib3.2编译中需要下载的boostdesc_lbgm.i、vgg_generated_80.i等文件

    包含以下文件: 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

    vgg_generated_48,vgg_generated_64,vgg_generated_80,vgg_generated_120

    这个标题中的"vgg_generated_48,vgg_generated_64,vgg_generated_80,vgg_generated_120"可能指的是在OpenCV库中,针对不同分辨率或深度的VGG模型参数文件。这些文件可能包含了预训练的权重,用于图像分类、特征...

    vgg_generated_64.i

    openc3.2进行cmake时需要下载的文件。 下载vgg_generated_64.i放在opencv_contrib/modules/xfeatures2d/cmake/.download/e8d0dcd54d1bcfdc29203d011a797179。最后面的文件夹可能不一样。

    vgg_generated_80.i

    openc3.2进行cmake时需要下载的文件。 下载vgg_generated_80.i放在opencv_contrib/modules/xfeatures2d/cmake/.download/e8d0dcd54d1bcfdc29203d011a797179。最后面的文件夹可能不一样。

    提示boostdesc_bgm.i: No such file or directory时缺失的文件

    解压后把所有文件放到对应的目录`opencv_contrib-3.4.x/modules/xfeatures2d/src/`中! 该压缩包包含了以下文件: boostdesc_bgm.i boostdesc_bgm_bi.i boostdesc_bgm_hd.i boostdesc_lbgm.i ...vgg_generated_48.i

    opencv_contrib xfeatures2d vgg_generated

    4. 文件列表:`vgg_generated_64.i`, `vgg_generated_48.i`, `vgg_generated_80.i`, `vgg_generated_120.i`代表了不同大小的VGG特征模型。数字可能代表了特征向量的维度,例如,`vgg_generated_64.i`可能是生成64维...

    opencv4.2编译扩展模块opencv_contrib缺少的boostdesc_bgm.i,boostdesc_binboost_064.i等文件

    VS编译opencv4.2扩展模块opencv_contrib-master缺失文件,下载失败,手动地址下载也失败的,可以下载本资源,解压后直接放到opencv_contrib-master\modules\xfeatures2d\src文件夹内,文件列表:...vgg_generated_120.i

    opencv安装:ippicv_linux_20151201.tgz和vgg_generated_48.i(64、80、120)

    总结起来,`ippicv_linux_20151201.tgz`和`vgg_generated_48.i`(64、80、120)是OpenCV安装和使用过程中的关键组件,它们对于提升OpenCV性能和实现特定功能至关重要。正确安装和配置这些包可以有效解决编译错误,确保...

    CMake+opencv编译时Download: opencv_ffmpeg.dll、ippicv等文件

    版本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

    vgg_generated_120.i vgg_generated_80.i boostdesc_lbgm.i 等openCV容易下载失败的文件

    1. **vgg_generated_120.i, vgg_generated_80.i, vgg_generated_64.i, vgg_generated_48.i**: 这些文件是VGG(Visual Geometry Group)网络模型的预训练权重。VGG是深度学习领域的一种经典网络架构,由牛津大学的...

    vgg_generated_48.i\vgg_generated_64.i\vgg_generated_80.i\vgg_generated_120.i

    在给定的压缩包文件中,包含了四个以“vgg_generated”命名的文件,分别是`vgg_generated_48.i`、`vgg_generated_64.i`、`vgg_generated_80.i`和`vgg_generated_120.i`,这些文件可能代表了不同深度的VGG模型,数字...

    create_generated_clock应用例

    这里`-edges`选项指定了generated clock相对于source clock的有效边沿,例如`{2 4 6}`表示在source clock的每个周期的第2、第4和第6个时钟周期时有效。 #### 四、注意事项 1. **相位关系一致性**:在定义generated...

Global site tag (gtag.js) - Google Analytics