UE4 C++如何使用C++接口
Posted Tanzq*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4 C++如何使用C++接口相关的知识,希望对你有一定的参考价值。
前言
我知道这个概念的时候,很不理解接口的作用,感觉是多此一举,既然知道是这个类,直接调用不就好了,还转换到接口,这不是没事找事做嘛?
冲浪询问之后总结了以下几个使用接口的理由:
- UE4 C++只能有一个父类,所以可以用接口来实现多个父类的效果,提高的代码的重用性和鲁棒性。
- 不需要知道它具体是怎么实现的,只需要知道他有这个功能就行了,这比父类来说功能更具有优势。
- 接口的使用提高了代码的可维护性和可扩展性。
- 降低了代码的耦合度。
如果只有一个类中对此接口有需求的话还是没必要使用接口。
创建一个接口类
在其中加入需要接入的函数:
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++接口的主要内容,如果未能解决你的问题,请参考以下文章
AdvancedLocomotionSystemV第二篇 C++ 实现镜头跟随人物缓慢移动