上一篇讲了蓝图变量,这一篇说蓝图函数。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实例,错落升降。