NarraLeaf

函数

声明一段可调用的图、从中返回结果,并在它可见的范围内调用它

fn 是一段有名字、可以被别的图运行的图。Fn声明它并持有参数,Fn Return结束它并交还结果,Call Fn调用它并等待答案。三个节点只为一件事:别再把同样的八个节点抄进每个需要它的控件里

约定

  • fn 的函数体没有自己的一套规则。 它所在的蓝图提供的节点,它都能用
  • fn 的身份是它的头节点,不是它的名字。 在卡片上改名,所有调用方会跟着改标签而不会断掉。同一作用域里两个 fn 同名也仍然解析正确,编辑器会提示这次撞名,因为名字是给你看的,绑定走的是 id
  • 可见性由宿主决定。 声明在globalMain蓝图上的 fn 处处可调用;声明在surfaceMain或widgetMain蓝图上的 fn 只能被同一 Surface 调用,该 Surface 上的 Blueprint Value 也包括在内;声明在componentWidgetMain蓝图上的 fn 只能在同一个组件定义内部调用;声明在storyAction蓝图上的 fn 会提供给每一份 Story Action 蓝图,但只有当运行中的场景里有一行用到声明它的蓝图时,调用才能到达它。Blueprint Value 能调用但永远不能声明
  • 参数和结果引脚是作者写出来的,不是固定的。 Fn和Fn Return的数据引脚由卡片上的按钮生成,每个引脚带一个名字和一个类型,类型从字符串(string)、整数(integer)、数字(float)、布尔值(boolean)、JSON(json)、任意值(any)中选
  • 递归上限为 32 层。 超过就直接失败。编辑器一旦能看出某个 fn 直接或间接调用了自己,就会给出警告

Fn

blueprint.fn.head

Fn(函数)是一个可调用 fn 的头节点。它没有执行入口——图里没有任何东西接进它;它之所以开始执行,是因为有人调用了它,而函数体挂在then上

引脚方向类型说明
thenout · exec—卡片上标为 Body。被调用时开始执行

卡上字段

字段说明
namefn 的名字,也就是调用方 Function 下拉里看到的那个

Add parameter 为每个参数追加一个数据输出引脚(param_N_value),标签和类型都在卡片上设定。参数值在函数体开始前就已注入,所以函数体的第一个节点上,参数引脚已经拿着调用方传来的值

Fn Return

blueprint.fn.return

Fn Return(函数返回)结束函数体并交还结果。它是尾节点——没有执行出口,它之后不会再有东西执行

引脚方向类型说明
inin · exec—

Add return value 为每个结果追加一个数据输入引脚(ret_N_value)。结果引脚从不提供卡上字面量:结果必须从接线的值来源取得,这样图上永远能看出返回值是在哪里产生的

fn 的签名取自从头节点出发能到达的第一个Fn Return。其它分支上还有Fn Return没问题,只要它们声明同样的结果;声明得不一样时编辑器会把不一致的那些标出来,而调用方看到的仍然是第一个的引脚。任何头节点都到不了的Fn Return同样会被标出

Call Fn

blueprint.fn.call · Latent

Call Fn(调用函数)调用一个可见的 fn 并等它跑完。在Function里选好目标,卡片就会按参数长出数据输入、按结果长出数据输出

引脚方向类型说明
inin · exec—
nextout · exec—函数体执行完后继续

卡上字段

字段说明
fnRef要调用的 fn。下拉列出此处可见的全部 fn,标签形如name (scope)

这些参数和结果引脚是按节点上存的一份 fn 签名副本(名字、参数和结果)重建的,所以卡片不必加载被调用方的蓝图就能渲染。类型允许时,参数引脚可以在卡上填字面量

这份副本会跟着 fn 走。和 fn 头节点在同一张图里的Call Fn,在你改动头节点或它的Fn Return后立即更新。其它位置的Call Fn在它所在的蓝图下次在编辑器中打开时更新;在那之前它保留旧引脚,只传递这些引脚带着的参数,编辑器会在它上面显示一条警告。在Function里重新选一次该 fn 会立即更新它

函数体是作为调用方执行的一部分跑的:取消调用方就会取消这个 fn,函数体里抛出的错误会落在Call Fn节点上。函数体读写的是声明该 fn 的那份蓝图的变量,并在调用方所在的位置运行:从列表某一行的事件中调用时,它读到的是那一行;在一个已摆放的组件内部调用时,它读到的是这次摆放的参数,操作的也是这次摆放里的元素

Call Fn是 latent 节点,而 Blueprint Value 图拒绝 latent 节点——只有这一个例外。取值器可以调用 fn,函数体以宿主控件的身份运行;它对世界做了什么,由你自己负责

本页目录