我们先来看看什么是接口?

官方的定义是:

接口类有助于确保一组(可能)不相关的类实现一组通用函数。在某些游戏功能可能被大量复杂而不同的类共享的情况下,这非常有用。例如,某个游戏可能有这样一个系统,依靠该系统输入一个触发器体可以激活陷阱、警告敌人或向玩家奖励点数,这可以通过针对陷阱、敌人和点数奖励器执行"ReactToTrigger"函数来实现。然而,陷阱可能派生自"AActor",敌人可能派生自专门的"APawn"或"ACharacter"子类,点数奖励可能派生自"UDataAsset"。所有这些类都需要共享功能,但它们没有除"UObject"之外的共同上级。在这种情况下,推荐使用接口

 

其实要理解接口很简单,我们可以把整个过程想象成一个“炸山工程”,接口就是Bomb,就是我们的Actor,引线就是我们的触发组件

要实现炸山,我们要做的首先就是把Bomb(接口)放到我们需要炸的山(Actor)里,最后再通过引线(触发组件)对接口进行引爆(执行)

 

好的,现在我们用一个交互的例子来看看接口是怎么用的吧。

首先我们要创建一个C++的接口类

 

 我们给这个接口类命名为SGameplayInterface 

现在我们来看看这个接口类里面

 

 这个接口类与其他的类不同,他包含了两个Class,第一个Class是U开口的,第二个是I开头的,我们通常不需要管第一个Class,因为第一个Class只是用来创建和生成第二个I开头的Class的。

所以我们用来实现接口的一些函数和事件都会放到第二个Class里面。

现在我们来定义接口函数。

 

 我们的函数名为Interact (记住,等下要考的),并且设置的函数宏为BlueprintCallable,BlueprintNativeEvent,代表了我们需要使用函数时需要进行implement重写,并且该函数是蓝图可调用的。不知道为什么的可以看我之前关于函数宏的博客。

至此,我们的接口函数定义就已经结束了,它将作为一个父类被其他的类继承,然后重写它的方法。

我们新建一个需要接口的Actor

 

 新建完之后,我们需要在红色部分添加对ISGameplayInterface的继承,然后再蓝色部分重写Interact的_Implement函数。

 

 

 我们想要的效果是,触发之后让上面的盖子翻转一下。这个物体如图所示。

 

 那现在问题来了,我们要怎么用触发这个函数呢?

要实现这个操作,我们只需要给我们的角色添加一个触发组件,通过碰撞事件触发该组件。

所以我们现在新建一个名为:SInteractionComponent的ActorComponent类

 

我们在这个类中实现一个名为PrimaryInteract的函数

 

 

现在我们来分析一下这段代码,前面的部分与本期内容无关,但是他干的一个事情就是:使用线性碰撞的方式来检测Actor看到的物体。

并且看到的物体为HitActor

橙色框,就是要判断玩家看到的这个物体是否实现了我们所定义的接口

蓝色框就是,执行我们在ASItemChest里面的重写的Interact函数。

值得注意的是!!

我们之前重写的函数名是Interact_Implement(),而我们执行的使用的是Execute_Interact(HitActor,MyPawan),重写的时候Interact后面要添加_Implement,以及执行时需要在函数前面加Execute_都是UE引擎所要求的。

并且Execute_XXXXX(param1,param2, ...)这个函数会比我们实现的_Implement函数多一个参数,那就指明我们时哪个对象需要执行Interact函数。本例子里,就是 HitActor

 

现在我们只需要添加这个组件在我们的角色里面,通过调用这个组件就可以实现角色与物体交互的操作了。

首先是添加组件

 

然后是在角色的C++中设置一个PrimaryInteract函数,函数的内容就是调用组件的PrimaryInteract()函数,(这里两个函数名字都是一样的,但是所在的类是不一样的,注意区分)

 

最后绑定我们的键位就完成了。

 

 

最后在从后至前理一理这里的逻辑:

首先我们通过绑定的键位可以调用角色的Primaryinteract()函数,然后函数里面又会调用名为InteractionComp这个ActorComponent的PrimaryInteract()函数

在这个函数里面我们会通过线性碰撞的方式来判断,此刻玩家眼前的物体是否继承了自定义的接口,如果是,则执行接口的Interact函数。

从而实现玩家与物体交互的过程

 

效果:

通过我们绑定的键位,这个盖子翻转了

 

 

刚学这里的时候,没有理清楚这里的逻辑会非常吃力,希望能帮到你理解Inferface的概念。

 

参考链接:

虚幻引擎中的接口 | 虚幻引擎5.0文档 (unrealengine.com)

Calling Interface Functions In C++ - Programming & Scripting / UI - Unreal Engine Forums

 

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/CatSevenMillion/p/16674062.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!