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

时间: 2024-12-28 20:25:18

ue4 c++ 接口的相关文章

[UE4]Grabbable接口

接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则.体现了自然界“如果你是……则必须能……”的理念. 例如,在自然界中,人都能吃饭,即“如果你是人,则必须能吃饭”.那么模拟到计算机程序中,就应该有一个IPerson(习惯上,接口名由“I”开头)接口,并有一个方法叫Eat(),然后我们规定,每一个表示“人”的类,必须实现IPerson接口,这就模拟了自然界“如果你是人,则必须能吃饭”这条规则. 一.Grabbable接口:可被抓取的接口.接口一般用形容词来命名.隐含的意思是Gra

【UE4实用技能】写一个异步回调的蓝图接口

在做系统功能的时候经常需要到服务器去下载图片然后再显示,蓝图已经提供了这个接口供大家使用: 如果没有别的其他需求,那这个接口就够用了. 不过我们的项目需要在这个接口的基础上加一些功能:1.本地缓存(不需要每次都请求)2.把图片存放到硬盘(不需要每次重启游戏都重新下载)3.设定一个文件数量阈值,超过这个值就删掉最早的文件4.判断一下路径,如果是本地的图片直接加载,网络图片加载(整合所有图片加载接口为唯一一个) 因为改动比较多所以不在DownloadImage这个接口上改,重新写一个类来处理.(具体

[UE4]引用Grabbable接口

一.当前:可抓取对象的类型是GrabTargetActor 二.修改目标:可抓取对象的类型改成Grabbable. 1.Fand Grab Target的返回值改成Grabbale(变量的数据类型可以是接口). 2.可以将一个对象直接转换成接口类型,以方便调用该对象实现的接口. 3.将对象转换成接口类型时,需要把蓝图上下文的勾选取消,接口才会出现在下拉菜单中. 三.接口可以被当做变量的数据类型来使用. 原文地址:https://www.cnblogs.com/timy/p/10508208.ht

ue4 SNew背后的逻辑

ue4的ui库Slate体系非常庞大,即使是在创建对象这一小事上,也是相当复杂: SLATECORE_API TSharedRef<SWidget> SNullWidget::NullWidget = SNew(SNullWidgetContent).Visibility(EVisibility::Hidden); 所有SWidget体系内的对象,都要用SNew这个宏来创建,它的内容是: #define SNew( WidgetType, ... ) \ MakeTDecl<Widget

虚幻UE4的后处理特效介绍

虚幻UE4提供了后处理特效的功能,可以实现景深,光溢出,色调调整,饱和度等等.要使用虚幻4的后处理,就一定要用到PostProcessVolumn,这是一种特殊的体积,可以放置在场景中的任何位置. 每个 PostProcessVolume 实质上是一个类型的混合层.其他混合层可以来自游戏代码(比如命中特效),UI 代码(比如暂停菜单),摄像机(比如暗角效果),或者 Matinee(旧胶片效果).每个混合层都能有自己的权重值,这样混合效果能容易控制.混合的做法始终是 Lerp(线性插值),当前启用

UE4本身的脚本就是C++语言 本文实践这种方法遇到的一些问题

可以看到,有些复杂,特别针对我这种UE4与Android都不熟的人,只有想别办法,首先我的需求并不复杂,只是在一个模型与现实重叠的空间利用Project Tango的Motion tracking功能行走,旋转等,简单来说,我现在的办公室环境,利用3D建模做一个和办公室一样的模型,长宽都要对上,这样利用Project Tango 的Tracking,我能只看屏幕也知道我在办公室的那个位置,前面是否有障碍物,就如HTV vive的那二个像个小音箱的东东来检测可活动区域一样. 这里顺便提一下GL_P

ue4 模块的构建和加载

ue4的代码是模块的形式来组织 在源码层面,一个包含*.build.cs的目录就是一个模块 这个目录里的文件在编译后都会被链接在一起,比如一个静态库lib,或者一个动态库dll. 不管是哪种形式,都需要提供一个给外部操作的接口,也就是一个IModuleInterface指针. *注意这里并不是说调用模块内任何函数(或类)都要通过该指针来进行,实际上外部代码只要include了相应的头文件,就能直接调用对应的功能了(比如new一个类,调一个全局函数等),因为实现代码要么做为lib被链接进exe,或

【UNREAL ENGINE 游戏开发】开篇之UE4的BLUEPRINT(蓝图)与C++(新童鞋必看)

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/unreal-engine-game/2164.html 首先Himi在这里解释下,为什么还是开篇- 原因主要有两点: 考虑到要写也要写点干货不是么?!但是由于官方文档写的真的够详细了,对于提到的基础知识我真的不想再赘述,因此希望各位新童鞋一定要先跟着文档动手过一遍!!!很重要!!!!!!!!!!! 另一方面,本想拿着UE4写点小项目练手,然后

UE4编码规范

翻译原文为Unreal 的官方!自己看着总结了一下,不一定每条都能对上.不足之处,请多多指教! 原文地址:  unreal CodingStandard UE4编码规范 在Epic,有简单几条代码编写标准: l 代码生命的80%时间在于维修 l 没有一个软件在整个过程中只有原作者在维护 l 编码规范可以提供软件可读性,新手可迅速透彻理解代码.新的工程师来会建立新的工程修改代码. l 若对社区开发者放出源码,希望代码易于理解. l 需要满足交叉编译. 命名规范 l 首字母大写,不使用下划线 l 第