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

1.新建接口类

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

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

.h file

  1. #pragma once
  2.  
  3. #include "Object.h"
  4. #include "ITrackTeam.generated.h"
  5.  
  6. UINTERFACE(Blueprintable)
  7. class UTrackTeam : public UInterface
  8. {
  9. GENERATED_UINTERFACE_BODY()
  10. };
  11.  
  12. class ITrackTeam
  13. {
  14. GENERATED_IINTERFACE_BODY()
  15.  
  16. public:
  17.  
  18. /* 获得前方的跟随对象 */
  19. UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Item")
  20. AActor* GetPreMember();
  21.  
  22. /* 获得跟随目标点位置 */
  23. UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Item")
  24. FVector GetTailLocation(int32 &param1, bool param2);
  25.  
  26. };

.cpp file

  1. #include "Programming.h"
  2. #include "ITrackTeam.h"
  3.  
  4. UTrackTeam::UTrackTeam(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
  5. {
  6.  
  7. }

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

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

  1. #include "Interface/ITrackTeam.h"

然后继承接口类

  1. class PROGRAMMING_API AImplementInterfaceActor : public AActor, public ITrackTeam

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

  1. virtual AActor* GetPreMember_Implementation() override;
  2.  
  3. virtual FVector GetTailLocation_Implementation(int32 &param1, bool param2) override;

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

  1. AActor* AImplementInterfaceActor::GetPreMember_Implementation()
  2. {
  3. AActor *temp = nullptr;
  4. return temp;
  5. }
  6.  
  7. FVector AImplementInterfaceActor::GetTailLocation_Implementation(int32 &param1, bool param2)
  8. {
  9. GEngine->AddOnScreenDebugMessage(-, 5.0f, FColor::Red, FString::FromInt(param1));
  10. if (param2)
  11. {
  12. GEngine->AddOnScreenDebugMessage(-, 5.0f, FColor::Red,TEXT("True") );
  13. }
  14. param1 = ;
  15. return FVector(0.0f, 1.0f, 2.0f);
  16. }

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

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

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

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

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

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

5.编译不通过的常见问题

5.1.必须在继承接口类的类中,实现接口的所有方法!

5.2.元数据标识符不要乱用,很容易冲突。

其他链接。

官方文档: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++ 接口的更多相关文章

  1. [UE4]Grabbable接口

    首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分.或者说,它是面向对象编程体系中的思想精髓之一. 接口是一组规则 ...

  2. [UE4]小地图接口设计

    一.地图缩略图片 二.要显示的图标及其对应的Actor 三.比例尺 四.对位点,只需要一个对位点就可以了. 函数名称 SetupMap 函数功能 设置地图 参数类型 MapImage:地图缩略图 Ma ...

  3. UE4学习心得:蓝图间信息通信的几种方法

    蓝图间通信是一个复杂关卡能否正常运行的关键,笔者在这里提供几种蓝图类之间的信息交互方法,希望能对读者有所帮助. 1.类引用 这是最直接的一种蓝图类之间的信息交互方式.首先在Editor中创建2个Act ...

  4. ue4访问php接口

    继上一篇介绍ue4打开web url窗口,这篇就来介绍下怎么访问php接口. 要做的两步: 1.c++自己写个接受请求的方法 f Post lhc-URL Request就是自定义的c++方法, /* ...

  5. UE4使用UMG接口操作界面

    原文链接:http://gad.qq.com/article/detail/7181131 本文首发腾讯GAD开发者平台,未经允许,不得转载 UE4的蓝图之强大让人欲罢不能,但是实际在项目的开发中,C ...

  6. [UE4]引用Grabbable接口

    一.当前:可抓取对象的类型是GrabTargetActor 二.修改目标:可抓取对象的类型改成Grabbable. 1.Fand Grab Target的返回值改成Grabbale(变量的数据类型可以 ...

  7. [UE4]接口

    一个椅子可以被抓起和放下,一扇门可以打开和关上.一个抽屉可以拉开和关上. 椅子.门.抽屉都可以用手拉,然后放下,但是它们的打开和关上的行为是不一样的,它们之间没有继承关系,没法共用“打开”和“关闭”的 ...

  8. 【UE4 C++ 基础知识】<9> Interface 接口

    概述 简单的说,接口提供一组公共的方法,不同的对象中继承这些方法后可以有不同的具体实现. 任何使用接口的类都必须实现这些接口. 实现解耦 解决多继承的问题 蓝图使用 使用方法 三种调用方法的区别 调用 ...

  9. [UE4]Get All Widgets Of Class、Get All Widgets with Interface,根据类名或者接口UI实例对象

    Get All Widgets Of Class.Get All Widgets with Interface,是系统蓝图函数库提供的方法,可以在任何蓝图中使用. 可以方便地获得UI实例对象,进而使用 ...

随机推荐

  1. EXT.net DateField format设置

    DateField df = new DateField();                        df.Format = "yyyy-MM-dd HH:mm:ss";格 ...

  2. python logging模块

    1.logging模块提供了四个组件logger:日志类,有两个功能1)配置日志的等级,处理器handler,过滤器filterlogger.setLevel(logging.INFO)logger. ...

  3. VBS 获取当前进程 ID

    Function CurrProcessId Dim oShell, sCmd, oWMI, oChldPrcs, oCols, lOut lOut = Set oShell = CreateObje ...

  4. 基于 Annotation 拦截的 Spring AOP 权限验证方法

    基于 Annotation 拦截的 Spring AOP 权限验证方法 转自:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilte ...

  5. Java高级开发工程师面试考纲 转

    转 http://www.sanesee.com/article/java-engineer-interview-of-content-tree 1 Java基础 1.1 Collection和Map ...

  6. CSharp 相关知识点小结

    1.JS获取iframe下面的内容document.getElementById('IFRAME1').contentDocument; 2.dialog 弹出层,定位:postion:'bottom ...

  7. JS 进制转换

    十进制转换成其他进制 objectname.toString([radix])   objectname 必选项.要得到字符串表示的对象. radix 可选项.指定将数字值转换为字符串时的进制. 例如 ...

  8. Access 数据库连接 字符串

    <!--Microsoft.Practices.EnterpriseLibrary.Data.dll 操作引用程序集--> <connectionStrings> <ad ...

  9. mybatis实战教程(mybatis in action)之六:与Spring MVC 的集成

    前面几篇文章已经讲到了mybatis与spring 的集成.但这个时候,所有的工程还不是web工程,虽然我一直是创建的web 工程.今天将直接用mybatis与Spring mvc 的方式集成起来,源 ...

  10. MyBatis学习(二)、SQL语句映射文件(1)resultMap

    二.SQL语句映射文件(1)resultMap SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyB ...