UE4 C++如何使用C++接口

Posted Tanzq*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4 C++如何使用C++接口相关的知识,希望对你有一定的参考价值。

前言

我知道这个概念的时候,很不理解接口的作用,感觉是多此一举,既然知道是这个类,直接调用不就好了,还转换到接口,这不是没事找事做嘛?
冲浪询问之后总结了以下几个使用接口的理由:

  1. UE4 C++只能有一个父类,所以可以用接口来实现多个父类的效果,提高的代码的重用性和鲁棒性。
  2. 不需要知道它具体是怎么实现的,只需要知道他有这个功能就行了,这比父类来说功能更具有优势。
  3. 接口的使用提高了代码的可维护性和可扩展性。
  4. 降低了代码的耦合度。

如果只有一个类中对此接口有需求的话还是没必要使用接口。

创建一个接口类


在其中加入需要接入的函数:

public:
UFUNCTION(BlueprintNativeEvent)
FTransform Get3PPivotTarget();

virtual FTransform Get3PPivotTarget_Implementation();

这里函数宏定义我使用的是BlueprintNativeEvent,先看看他和另一个BlueprintImplementableEvent的区别,我再讲讲我使用前者的原因。

宏定义含义
BlueprintNativeEvent在C++可以声明和定义函数,在C++里调用该函数,蓝图重写实现该函数(蓝图可以重写或不重写C++父类函数)
BlueprintImplementableEvent在C++可以声明函数(不能定义,蓝图重写),在C++里调用该函数,蓝图重写实现该函数

在接口里面,我认为第一个好的原因在于,我们可以直接在接口中实现该函数,然后继承他的类,如果不想实现他也没事。
另一种就需要他的子类都要实现一遍他的函数。

所以这里还需要在CPP文件中实现一遍函数。

FTransform IALS_Camera::Get3PPivotTarget_Implementation()
{
	return {};
}

继承接口,实现接口具体功能

  • 继承接口
 : public ACharacter, public IALS_Camera
  • 实现接口功能
    .h
virtual FTransform Get3PPivotTarget_Implementation() override;

.cpp

FTransform AALS_AnimMan_Character::Get3PPivotTarget_Implementation()
{
	const FVector Location = (GetMesh()->GetSocketLocation(TEXT("head")) + GetMesh()->GetSocketLocation(TEXT("root")))
								/ 2.f;
	
	return FTransform(GetActorRotation(), Location, FVector(1.f, 1.f, 1.f));
}

使用接口

就是看能不能转化为接口的类型,如果有就说明该类继承了他,那么就可以使用他里面的函数。

IALS_Camera* CameraInterface = Cast<IALS_Camera>(ControllerPawn);
if (!CameraInterface) return;

FTransform PivotTarget = CameraInterface->Get3PPivotTarget();

以上是关于UE4 C++如何使用C++接口的主要内容,如果未能解决你的问题,请参考以下文章

UE4 C++第三人称人物创建的基本代码(上)

[UE4]虚幻4链接独立服务器

ue4 c++代码怎么获取场景中的一个actor

AdvancedLocomotionSystemV第二篇 C++ 实现镜头跟随人物缓慢移动

基于C++代码的UE4学习—— 自定义代理结合Timer实现道具的消失与重生

AdvancedLocomotionSystemV第二篇 C++ 实现镜头跟随人物缓慢移动