UE5笔记【十二】蓝图函数BluePrint Function

上一篇讲了蓝图变量,这一篇说蓝图函数。BluePrint Function

函数,一般是为了将一段功能的代码提取出来,然后方便我们反复使用。重复的代码可以提取一个函数。类似的,相同的蓝图,我们也可以提取出一个蓝图函数来。

如果我们修改蓝图函数中的某一部分,那么所有调用这个函数地方,也相应的跟着改变。


假设场景需求:有一个像超级玛丽中Smasher的Cube,当玩家碰到他时gameOver。

首先我们在内容抽屉中,新建一个BluePrints的文件夹,便于整齐的存储文件。

 点击进入文件夹。然后右键空白新建【蓝图类】,然后选择【Actor】,并命名为BP_Smasher。

 然后双击打开。然后添加一个Cube。

然后添加一个【框碰撞】

 调整大小,使碰撞检测框大于cube。当玩家碰到这个box时,玩家GameOver。

然后我们点击编译,然后保存。进入到游戏界面,然后将这个cube放置在场景中。从内容抽屉中,直接拖拽。 

我们需要将碰撞框box和Cube一个整体,这样在移动cube时,box可以跟着一起移动。所以我们让其包含就可以。我们将box拖拽,直接放在cube下面。然后编译,保存。

接下来,就要进入到事件图表graph中,编辑事件逻辑了。

首先我们需要cube的位置。将其拖拽到事件图表中。

 然后获取相关位置:

完事,需要一个【movecomponent to】节点。

 然后将事件开始运行时与move componet to组件连接。我们希望cube上下移动,所以,将位置分割出z轴来。右键【分割结构体引脚】。

 移动组件的xyz也需要分割。

 X轴和Y轴保持不变,直接连接,对于z轴。我们需要增加400。

因为移动物体是cube,所以我们需要在移动模块中,将cube与component连接。

然后编译,保存,进入游戏,看看游戏启动时,他是否移动。

速度太快,我们需要修改component模块中的overtime项,然后高度有点高。进行调整。

然后重新编译,保存。重新进入游戏,发现,盒体上升速度慢了。我们需要其静止2秒钟,然后坠落,然后砸向地面。如果下面有玩家,则over。

设置Duration为2.0。 

 有个小技巧:当盒体降落时,我们还是需要,cube这个节点,然后目标位置。然后add节点。这三个节点,我们可以框选,然后Ctrl+C,然后Ctrl+V,复制到后面直接用。

Z轴由350,变为负的-350。相当于,盒体降落,降落速度。1秒。然后编译,保存。进游戏查看。



上面实现了一个cube升降的动作蓝图。现在我们需要这个cube不断重复这个动作。



函数的作用,首先需要取代一些重复的代码。在蓝图中,我们计算位置变换的部分,这部分重复,我们可以用一个函数来代替:

我们新建一个函数:然后将其命名为Rise。此时界面将进入Rise函数编辑界面。

 对于一个这个函数,我们需要分别【添加】一个输入和一个输出,输入类型为StaticMeshComponent。我们将其命名为SM。输出设置为Vector类型,然后命名为:Location。然后我们将上面重复的位置变化的蓝图Ctrl+X剪切,Ctrl+V粘贴到函数中,然后将输出的Location向量分解为X、Y、Z。与重复的部分连接。将函数的输入部分SM连接到函数重复部分。注意函数细节中:在输入部分:支持:通过引用传递。也就是编程中的值传递和引用传递中的引用传递


回到事件图表中,

然后将Rise函数拖出: 

插一句:现在感觉UE5中这种拖动:在编程中,相当于函数的调用,或者说对于类型的实例化

将cube作为参数输入到函数中,也就是连线。因为函数输出为向量,所以蓝图中的MoveToComponent组件中的目标相关位置也要重新组合为向量。然后与函数的输出连接。

 将Rise函数的输出与MoveToComponet组件连接,然后我们需要一个Fall函数。简单做法:直接复制一个Rise函数,然后将其中个参数改为负值。-350。

 回到事件图表中,然后将函数调用。完成替换。点击编译。保存。

编译报错:说我们的函数执行引脚未连接:

这个执行,可以理解为,你要调用这个函数,但是你要把函数放在哪个上下文中调用。这个需要确认,因为执行是一个流图。

 我们要把函数的执行点与这个事件开始执行连接起来。使得事件开始执行后,转入函数中,然后将函数后执行接入到MoveToComponent组件上,Fall函数处理方式相同。

然后重新编译,保存,进入游戏中,测试是否实现对cube的升降动作实现。


接下来是循环:

将与事件开始执行的组件连线断开,然后新建一个自定义事件节点:add custom

我们将这个事件命名为Start,将Start执行点位与函数执行点位连接。此时编译,保存,回到游戏中,cube不会有任何变化,因为,虽然我们建立了一个事件,但是并没有调用它。这个事件类似于一个函数。

此时,我们在蓝图的【事件开始运行】结点出引出一条线,然后开始搜索这个Start。 

此时编译保存,进入游戏界面,cube正常升降。


如何循环呢?

单个流程进行完,之后,我们在后面再补上一个Start。

此时编译,保存,进入游戏界面测试。实现整个动作循环执行。

如果我们希望每次循环之前,有点停顿。我们可以加入delay。

 编译,保存,查看。



基于上面的蓝图,我们再建一个实体。 

 插一句:现在感觉这个拖动,也是实例化。那些蓝图类的操作,是在新建一个类。

 我们观察这个新建实例的效果。

我们可以发现:两个Cube同时升降。现在我们想让他们错落有序。

我们回到这个蓝图类的事件图表中。然后新建一个变量。命名:StartDelay。类型为浮点类型。

 然后,拖动到图上,选择【获取StartDelay】,然后将其连接到Delay模块上。在右侧细节栏中,设置默认值为1.0。然后勾选【可编辑实例】。然后编译。保存。进入到游戏界面中。

 在游戏界面中,将两个实例的StartDelay分别设置为0.7和1.2。然后启动游戏查看。

两个cube实例,错落升降。 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值