UE5中关于使用BlueprintPure需要注意的问题

前言

函数说明符BlueprintPure用于配合UFUNCTION完成函数标记,对函数进行行为补充说明,主要意图提供不带有白色执行引脚的函数给蓝图使用。可以查看下官方说明文档(点击这里,大家看英文注释更清晰,中文被偷工减料了)

操作目的:在蓝图中,将标记的函数去掉白色执行引脚,可以将调用的节点不“直接引入执行逻辑线”中,从而让蓝图执行逻辑看起来更加整洁。

去掉执行引脚的函数

蓝图中

要隐藏执行引脚,在蓝图中需要将函数的细节面板中勾选“纯函数”

蓝图中

C++中

将函数说明中添加“BlueprintPure”或是函数是常函数都可以隐藏执行引脚

1UFUNCTION(BlueprintCallable, BlueprintPure)
2int32 CallFunc1();
3UFUNCTION(BlueprintCallable)
4int32 CallFunc2() const;

总结问题

  • 由于纯函数缺少执行引脚,调用纯函数采用规则是:将输出执行线连接到在执行逻辑中的节点上,故纯函数需要有返回值,即需要有输出引脚
  • C++中如果标记了BlueprintPure的函数没有返回值,编译将出错(BlueprintPure specifier is not allowed for functions with no return value and no output parameters.)
  • 蓝图中的函数可以不带有返回值,勾选纯函数,但是在图表中调用函数将无法加入执行逻辑线
  • 对于纯函数蓝图中使用,函数本身执行次数需要注意的情况
    • 如果在一个执行节点,有多个输入引脚,每个引脚都连接相同的纯函数,则纯函数只调用一次
      图a 执行一次
    • 如果在一条执行逻辑线上,多个节点,分别输入多次同一个纯函数,则函数调用多次
      图b 执行多次

关于调用次数问题,纯函数与普通函数有些区别

图c 普通函数执行一次
普通函数输出引脚被多次连接却只执行一次

规则很简单:

  • 在白色执行线上,只要有连接执行节点就会执行一次节点调用逻辑,至于该节点输入时关联了多个函数,每个函数都只执行一次(图a),即时该函数被多次输入连接,也只执行一次。
  • 而如果函数被不同的执行线节点调用,则该节点也会被多次调用(图b)。
  • 对于非纯函数的函数,执行过后有输出值,输出值被连接多少次,都不会促使函数执行(因为执行已经通过,不会逆向执行 图c)

结语

纯函数使用时,切记关于调用次数的问题。例如写的工厂方法,生产对象,如果将工厂方法标记为纯函数,千万注意在执行逻辑线中多次调用会多次生成对象。

文章评论