【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->Execute_Get3PPivotTarget(ControllerPawn);
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值