词义广泛,用来陈述功能,选项,与其他程序结构进行沟通的方式。接口抽象出了交互结构,提供了两个未知逻辑交互的便捷性。对于编程中,如何更好的设计低耦合程序起到了至关重要的作用。设计者可以在互不关心的情况下,进行友好的程序设计,并且通过接口来完成设计的整合交互。

虚幻引擎中,加入了接口设计,从一定程度上“去掉了”多继承。接口可以帮助我们解决在不同类型的类之间却有相同行为的特性。接口的设计增加了代码编写的便捷性。

例如在设计射击类游戏时,我们需要子弹与场景中的物体进行交互,场景中的桌椅板凳,角色,怪物(都是独立的对象)都希望受到子弹的攻击伤害。那么子弹在打到目标后要逐一排查,审查目标是否属于上述的对象!这很麻烦!但是我们可以通过接口,增加上述目标具有受伤的能力。当子弹打到目标时,我只需要检查目标是否继承受伤的接口,如果有,则调用接口函数即可!

构建接口类:

我们可以直接在虚幻编辑器中继承接口类,然后完成构建

编写接口:

  • 如果在C++中希望获得接口能力,则需要继承接口。需要注意的是,必须继承I开头的接口名称,并且继承修饰为public。不要尝试重写接口中的函数!
  • 如果接口中的函数使用BlueprintNativeEvent说明,则在继承类中可以编写同名函数,并用后缀“_Implementation”进行标记。
  • 如果接口中的函数使用BlueprintImplementableEvent说明,则无法在C++的继承类中实现接口函数

实现接口:

继承I类接口完毕后,可以选择的将接口中的函数进行定义。如果需要定义,则需要将接口中函数说明是BlueprintNativeEvent的函数进行定义。

注意,不要省略override,函数的返回值,参数列表需要和接口的一致

调用操作:

调用函数,持有继承接口对象指针,第一步先转换到I类指针,调用Execute_接口函数名,参数第一位需要传递原对象指针,后面直接按照原函数参数填入即可

整体代码演示:

//  TestInterface.h
UINTERFACE(MinimalAPI)
class UTestInterface : public UInterface
{
    GENERATED_BODY()
};

/**
 * 1、U类中不能去写接口函数,只能用来检查是否继承了接口类
 * 2、接口函数,必须写在I类中,并且必须写共有域中
 * 3、接口函数在接口类中不能进行定义
 * 
 */
class MX_API ITestInterface
{
    GENERATED_BODY()

    // Add interface functions to this class. This is the class that will be inherited to implement this interface.
public:
    // 定义接口函数
    UFUNCTION(BlueprintNativeEvent)
    void Notify_None();
    UFUNCTION(BlueprintNativeEvent)
    int32 Notify_RetVal();
    UFUNCTION(BlueprintNativeEvent)
    int32 Notify_RetVal_Params(int32 Num);
};

/////////////////////////////////////////////////////////////
// Actor2.h
public:    
    // Called every frame
    virtual void Tick(float DeltaTime) override;

    // 实现接口
    virtual void Notify_None_Implementation() override;
    virtual int32 Notify_RetVal_Implementation() override;
    virtual int32 Notify_RetVal_Params_Implementation(int32 Num) override;

// Actor2.cpp
void AActor2::Notify_None_Implementation()
{
    UKismetSystemLibrary::PrintString(this, TEXT("----无参无返回值----"));
}

int32 AActor2::Notify_RetVal_Implementation()
{
    UKismetSystemLibrary::PrintString(this, TEXT("----无参有返回值----"));
    return 0;
}

int32 AActor2::Notify_RetVal_Params_Implementation(int32 Num)
{
    UKismetSystemLibrary::PrintString(this, TEXT("----有参有返回值----"));
    return Num;
}void AActor2::Notify_None_Implementation()
{
    UKismetSystemLibrary::PrintString(this, TEXT("----无参无返回值----"));
}

int32 AActor2::Notify_RetVal_Implementation()
{
    UKismetSystemLibrary::PrintString(this, TEXT("----无参有返回值----"));
    return 0;
}

int32 AActor2::Notify_RetVal_Params_Implementation(int32 Num)
{
    UKismetSystemLibrary::PrintString(this, TEXT("----有参有返回值----"));
    return Num;
}
/////////////////////////////////////////////////////////
//Actor1.cpp
    ac2 = GetWorld()->SpawnActor<AActor2>(AActor2::StaticClass());
    // 检查是否继承了接口
    ITestInterface* testInterface = Cast<ITestInterface>(ac2);
    // 如果继承了接口,就执行接口函数
    if (testInterface) {
        testInterface->Execute_Notify_None(ac2);
        testInterface->Execute_Notify_RetVal(ac2);
        testInterface->Execute_Notify_RetVal_Params(ac2,10);
    }

测试结果:

 包裹接口:

借助模板类TScriptInterface可以将接口包裹,用于使用UPROPERTY描述,并且可以暴露到蓝图中。使用时同普通接口一样使用。接口不支持智能指针的管理,所以需要使用TS类进行管理

    UPROPERTY(EditAnywhere)
        TScriptInterface<ITestInterface> TestInterface;

蓝图继承接口:

如果接口在蓝图中被继承,则需要注意下面的问题

  • 如果函数没有返回类型,则在蓝图中当作事件Event使用
  • 如果函数存在返回类型或是存在传递引用参数,则在蓝图中当作函数使用
  • 接口函数说明符使用BlueprintNativeEvent或是BlueprintImplementableEvent标记都可以在蓝图中找到

总结:

  • 接口函数需要定在I开头的类中,不要修改访问域public关键字,声明需要使用宏标记BlueprintNativeEvent或BlueprintImplementableEvent
  • 如需继承接口,继承I类,继承关系public
  • 接口中的函数禁止重写
  • 在继承类中实现接口函数,并添加后缀_Implementation,需要注意,函数前加入虚函数关键字virtual,函数结尾加override关键字(可以不添加,但是建议加上,加强函数编写正确性检查),在CPP文件中实现逻辑
  • 调用函数,持有继承接口对象指针,第一步先转换到I类指针,调用Execute_接口函数名,参数第一位需要传递原对象指针,后面直接按照原函数参数填入即可
  • 检查某一个类是否实现了对应接口可以使用如下语法进行检查
    • obj->GetClass()->ImplementsInterface(U类型::StaticClass());
    • act->GetClass()->ImplementsInterface(UMyInterface::StaticClass());
    • act是对象指指针

接口的优缺点:

优点:

  • 具备多态特性,接口衍生类支持里氏转换原则
  • 接口可以使得整个继承系统更加的干净单一
  • 接口可以规范类的具体行为
  • 接口可以隔离开发中的开发耦合,我们只需要针对接口去编码,无需关心具体行为
  • 接口继承可以使得继承关系中出现真正的操作父类

缺点:

  • 丢失了C++中的广泛继承特性
  • 接口拘束了类型的属性拓展,无法进行更详细的内容定义
  • 继承关系中容易让人混淆,接口本身不具备真正的继承特性

标签智能推荐:

【总览】博客导航

博客导航您好,这里是博客的导航页面,可以帮助您快速找到您所需要的内容。UnrealEngine蓝图C++用户界面UMGSlate阅读笔记视频笔记博客笔记书籍笔记C++Primer大象无形_虚幻引擎程序设计浅析设计模式:可复用面向对象软件的基础虚幻引擎(UE4)技术基础UnrealEngine4游戏开发入门经典本文标签博客导航

Unity3D VS UE4经典大作比拼

E4略逊、手机3D应用、3D游戏轻量级首选,支持跨平台、设备兼容性更好2.产品力:Unity3D更加多元化,各平台都有代表作,比如《王者荣耀》《炉石传说》《纪念碑谷》3.厂商:Unity3D产品遍布全球,在国内被广泛使用虚幻引擎(UE4、UE5)&nbsp;1.视觉效果:虚幻引擎开源、UE4、UE5渲染逼真相对Unity更好,但UE4设备兼容性略差于U3D2.产品力:虚幻引擎以追求写实效果的主机游

理解包装器

虚幻引擎运用了大量的包装器包装器就是为了满足当前程序框架下需要的一些特殊属性,给标准库嵌套了一层包装,加上特定的属性,在套上一层宏外壳有的是实现原功能,有的是合并了多个功能的实现重新包装附加宏属性&nbsp;套模板

UE4笔记

&nbsp;点击右上角MaxImizesorrestoresthisviewport可以看见屏幕上显示当前场景在四个不同的方式显示&nbsp;如图:虚幻4工程文件夹的结构config:包含了项目设置,键盘输入之类的配置文件content-存放引擎或游戏的内容,包括地图,贴图、模型、材质、蓝图等intermediate-包含了在编译引擎或游戏时生成的临时文件Saved-包含了自动保存的内容,配置(*

Unreal 读书笔记 (一) 五个常见基类

ropertyinitialization自动变量初始化7)Automaticeditorintegration和虚幻引擎编译器的自动交互虚幻引擎的Editor面板,希望能够编辑,则需要继承自UObject类。8)Typeinformationavailableatruntime运行时类型识别虚幻引擎打开了/GR-编编译器参数。意味着你无法使用C++标准的RTTI机制:dynamic_cast。如

浅谈B端业务下的三维可视化

合类工具现在主流的商用3D创作引擎主要是unity3D和UnrealEngine3D。Unity3D的简称就是U3D,是一款用于研发2D3D的游戏引擎,对主流系统平台支撑良好包括移动端的两大系统,另外之所以在可视化这块提到它,是因为Unity也广泛用于3D可视化相关行业的开发,是一款十分通用的3D综合型创作工具。U3D对基于WebGL技术的HTML5网页平台也支持良好,因此也有很多“大屏可视化”开

检验实时3D像素流送平台好坏的七个标准!(下)

文件的安全,在此处进行渲染,然后通过云传输渲染的图像。您是否与虚幻引擎和Unity等游戏引擎集成?游戏引擎是用于渲染交互式3D模型和体验的流行工具。建筑公司,工程公司,数字代理商,汽车制造商等使用游戏引擎将CAD模型转换为用于市场营销,产品开发,销售等的逼真的模型。但是,由于部署3D创作或与协作者共享它们会消耗大量数据,因此这些用户中有许多会遇到工作流阻塞。3D模型不像视频或Google文档那样容

乘风破浪,遇见未来元宇宙(Metaverse)之中金元宇宙研究系列,元宇宙系列之建模引擎:数字孪生之基,虚实交融之纽

资料来源:公司年报,中金公司研究部虚幻引擎:3A游戏的高质量开发工具Epic公司的虚幻引擎是目前游戏行业常用的引擎之一。与Unity专注于第三方通用引擎开发不同,Epic公司拥有自研游戏和游戏平台。虚幻引擎的诞生来自于Epic自研的单人FPS游戏《虚幻》。Epic公司自身开发游戏的工具积累是虚幻引擎版本的不断迭代的技术来源之一,这使得其引擎的操作方式更适于工程师的操作习惯。在销售许可模式上,虚幻引

蒲公英 · JELLY技术周刊 Vol.12 尤雨溪新作 Vite, 你会支持么?

景生成工具制作过炫酷的h5页面,除了感叹其神奇之处有没有想过其实现方式呢?本文从零开始实现一个H5编辑器项目完整设计思路和主要实现步骤,并开源前后端代码。有需要的小伙伴可以按照该教程从零实现自己的H5编辑器。图形编程初探虚幻引擎55月底,游戏公司Epic揭开了虚幻5引擎神秘的面纱,此次更新包含Nanite虚拟微多边形和全新的动态全局光照Lumen两大核心技术,然后展示了该引擎运行在PS5上实时渲染

WPF 显示3D密集场景,堆场管理系统

3D引擎,unity3d,虚幻啊,webgl啊等,都很不错的,用来显示3D效果很好的,确实,我也做了尝试,可以展示下。这个东西是用threejs做的。我也放在服务器上可以体验下,个人服务器网速比较慢,要有耐心&nbsp;3D堆场&nbsp;&nbsp;拖动视角Ctrl+鼠标左键,移动窗口鼠标右键&nbsp;总结来说,1&nbsp;&nbsp;3D引擎做的视觉效果确实是很漂亮的,但是这么密集的场景下