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 ¶m1, 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 ¶m1, bool param2) override;
.cpp file,可以这么洋洋洒洒的写一写测试语句,可以被蓝图调用的。
AActor* AImplementInterfaceActor::GetPreMember_Implementation()
{
AActor *temp = nullptr;
return temp;
}
FVector AImplementInterfaceActor::GetTailLocation_Implementation(int32 ¶m1, bool param2)
{
GEngine->AddOnScreenDebugMessage(-, 5.0f, FColor::Red, FString::FromInt(param1));
if (param2)
{
GEngine->AddOnScreenDebugMessage(-, 5.0f, FColor::Red,TEXT("True") );
}
param1 = ;
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 = ;
FVector TmpVector = iTemp->Execute_GetTailLocation(this, refInt, true);
GEngine->AddOnScreenDebugMessage(-, 5.0f, FColor::Red, TmpVector.ToString());
GEngine->AddOnScreenDebugMessage(-, 5.0f, FColor::Red, FString::FromInt(refInt));
}
4.确定特定类是否实现了接口
为保证 C++ 和实现接口的蓝图类之间的兼容性,使用以下代码:
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++ 接口的更多相关文章
- [UE4]Grabbable接口
首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分.或者说,它是面向对象编程体系中的思想精髓之一. 接口是一组规则 ...
- [UE4]小地图接口设计
一.地图缩略图片 二.要显示的图标及其对应的Actor 三.比例尺 四.对位点,只需要一个对位点就可以了. 函数名称 SetupMap 函数功能 设置地图 参数类型 MapImage:地图缩略图 Ma ...
- UE4学习心得:蓝图间信息通信的几种方法
蓝图间通信是一个复杂关卡能否正常运行的关键,笔者在这里提供几种蓝图类之间的信息交互方法,希望能对读者有所帮助. 1.类引用 这是最直接的一种蓝图类之间的信息交互方式.首先在Editor中创建2个Act ...
- ue4访问php接口
继上一篇介绍ue4打开web url窗口,这篇就来介绍下怎么访问php接口. 要做的两步: 1.c++自己写个接受请求的方法 f Post lhc-URL Request就是自定义的c++方法, /* ...
- UE4使用UMG接口操作界面
原文链接:http://gad.qq.com/article/detail/7181131 本文首发腾讯GAD开发者平台,未经允许,不得转载 UE4的蓝图之强大让人欲罢不能,但是实际在项目的开发中,C ...
- [UE4]引用Grabbable接口
一.当前:可抓取对象的类型是GrabTargetActor 二.修改目标:可抓取对象的类型改成Grabbable. 1.Fand Grab Target的返回值改成Grabbale(变量的数据类型可以 ...
- [UE4]接口
一个椅子可以被抓起和放下,一扇门可以打开和关上.一个抽屉可以拉开和关上. 椅子.门.抽屉都可以用手拉,然后放下,但是它们的打开和关上的行为是不一样的,它们之间没有继承关系,没法共用“打开”和“关闭”的 ...
- 【UE4 C++ 基础知识】<9> Interface 接口
概述 简单的说,接口提供一组公共的方法,不同的对象中继承这些方法后可以有不同的具体实现. 任何使用接口的类都必须实现这些接口. 实现解耦 解决多继承的问题 蓝图使用 使用方法 三种调用方法的区别 调用 ...
- [UE4]Get All Widgets Of Class、Get All Widgets with Interface,根据类名或者接口UI实例对象
Get All Widgets Of Class.Get All Widgets with Interface,是系统蓝图函数库提供的方法,可以在任何蓝图中使用. 可以方便地获得UI实例对象,进而使用 ...
随机推荐
- git初学习体会
github:项目版本控制器 git和传统的版本控制器相比,最大的一点是,界面简单,给与非线性开发模式的强有力的支持,完全分布式等. 对于完全分布式的实现,我的理解是这个样子的.这多少要涉及到一点它的 ...
- JSBinding / FAQ & Trouble Shooting
Q: Why javascript file extension is .javascript?A: Because Unity treats .js files as Unity script an ...
- Linux-awk直接修改原文件
#注意:重定向符号后面的文件名需要加双引号 awk '{print > "file"}' file
- Unity 相关经典博客资源总结(持续更新)
就作为一个记录吧,把平时看过的Unity相关的一些好的Blog记录并分享. 好的论坛: Unity官方脚本 点评:这个不用说了,最核心的内容,理解整个Unity引擎的方方面面,梳理结构. Unity ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十二) 代码重构使用反射工厂解耦(一)缓存切换
前言 上一篇中,我们用了反射工厂来解除BLL和UI层耦合的问题.当然那是最简单的解决方法,再复杂一点的程序可能思路相同,但是在编程细节中需要考虑的就更多了,比如今天我在重构过程中遇到的问题.也是接下来 ...
- IIS7.5打开GZip压缩,同时启用GZip压缩JS/CSS文件的设置方法[bubuko.com]
IIS7.5或者IIS7.0开启GZip压缩方法:打开IIS,在右侧点击某个网站,在功能视图中的“IIS”区域,双击进入“压缩”,如图下图: 分别勾选“启用动态内容压缩”和“启用静态内容压缩”.这样最 ...
- 【Infobright】infobright数据导入导出测试
创建数据库 create database if not exists `mytestdb` default charset=utf8; use mytestdb; 说明: 如果使用utf8字符集,则 ...
- STM32启动文件详细解析(V3.5.0) 以:startup_stm32f10x_hd.s为例
我用的是IAR,这个貌似是MDK的,不过很有用,大家可以看一下 ;* 文件名 : startup_stm32f10x_hd.s ;* 库版本 : V3.5.0 ;* 说明: 此文件为STM32F10x ...
- (AIDE)Android Eclipse JNI 调用 .so文件加载问题
背景:对于Android工程 Eclipse里编译好的.so文件放到 libs\armeabi下以后, 这样.so文件就可以打包到apk文件里,在apk装到手机上以后 在libs\armeabi下的. ...
- [MySQL] 高可用架构MMM简单介绍
一.来源及原理: 众所周知,MySQL自身提供了AB复制(主从复制),然后可以很轻松实现master-master双向复制,同时再为其中一个Master节点搭建一个Slave库. 这样就实现了MySQ ...