NarraLeaf

UI

创建页面与游戏 UI,在画布上排版,并将其中的部分做成组件复用

UI 面板存放项目中的全部界面。界面类型在两类之间切换列表

类型是尺寸
页面标题、设置、存档、历史、画廊等完整界面创建页面时指定
游戏 UI游玩过程中的界面,如对话、选项、HUD、快捷操作和通知项目分辨率

游戏 UI 创建在具体的位置上,每个位置只有一个界面。所有位置都已占用时,从列表中打开已有的游戏 UI,而不是再创建一个

游戏启动时先显示入口页面,其余页面由蓝图打开;游戏 UI 在开始游戏后自动显示在游戏画面之上。两者在运行时如何叠放,参阅运行时的界面

任何页面都可以设为入口页面:右键页面卡片选择设为入口页面,或选中页面后在属性面板中点击设为入口页面。卡片随即标为入口页面,原来的入口页面成为普通页面。指向这两个页面的蓝图和 Go Page 节点不受影响

页面和游戏 UI 可以重命名、复制和删除。删除会一并移除其中的元素。入口页面不能删除,需先将其他页面设为入口页面

画布

界面以标签页打开:左侧是 UI 大纲,中央是画布,右侧是属性面板,下方是插入栏

画布上的一个页面,左侧是 UI 大纲,画布下方是插入栏,右侧是属性面板
  • 在插入栏选择控件,然后在画布上单击或拖动放置
  • 拖动控件可移动位置,拖动控制点可改变尺寸。智能吸附会将控件对齐到画布边缘、中心线和相邻控件
  • 对齐工具以所选内容的包围盒为基准
  • 比例框会在画布上叠加目标设备的安全区,播放按钮在开发模式中打开该界面
  • 页面边缘之外的内容覆盖着一层画布底色的遮罩照常绘制,拖出页面的元素仍然可以选中并拖回来。被所在容器裁掉的已选元素,可以拖动它的选框移动。游戏里只显示页面范围内的内容

画布不会裁切:运行时始终把整个舞台完整放入窗口,因此落在安全区之外的内容在部分设备上仍然可见

文字

文本的内容、按钮的文字和文本输入框的占位文本,各自从一个来源取得文字,在属性面板中选择:直接输入、翻译键,以及文本与按钮还可以选的蓝图值

  • 在页面上,文本或按钮也可以改为显示页面的一个文字参数,在页面参数中选择,见页面参数
  • 使用蓝图值、列表行的字段、组件的参数或页面参数时,控件自身的文字是示例文字:只在编辑器中显示,不进入构建出的游戏
  • 游戏运行时由蓝图写入文字的控件,属性面板把它自身的文字标为默认值,并在游戏中由以下蓝图写入下列出这些蓝图。点选其中一项会打开该蓝图,选中写入的节点并将它移入视野

各个来源如何翻译,见界面文本

自动缩小

文本控件可以缩小到内容放进它所在的盒子。在排版中打开自动缩小:控件上设定的字号成为上限,文本会缩小到整体放得下为止,最小到最小字号。在最小字号下仍然放不下的文本会被裁切

最小字号在自动缩小打开时才出现。这两个属性在画布上与运行中的游戏里同样生效,句子与 NVL 文本控件也带有它们

句子控件出厂即打开自动缩小:一句对白只写一次,却要在游戏发行的每一种语言里显示。该行先按控件上的字号显示,文本抵达盒子末端后,随着余下内容逐字显示而缩小

音效

除界面的根元素外,每个元素在属性面板中都有音效一节,位于动画上方。元素设置音效之前,这一节是折叠的

音效何时播放
悬停指针移入元素时。在触摸屏上点按不会播放
点击点击元素,或用键盘激活元素时

两者都可以选择一个音频资产或资产集;显示未选择音效表示没有设置。选好的音效下方有一行折叠的摘要,例如 音量 1 · SFX,点开是它的播放选项:音量(0 到 1)与音轨。音效默认在 SFX 音轨上播放,可在音轨中更换,玩家对该音轨的音量设置会生效。无论在哪条音轨上,每次悬停或点击只播放一次,不会循环

一次悬停或点击只播放一个音效。带音效的元素相互嵌套时,只播放最内层元素的音效:卡片里的按钮有自己的点击音效时,点按钮播放按钮的音效,点卡片的其他位置播放卡片的音效。被禁用的元素两种音效都不播放

音效在开发模式与游戏中播放,编辑器画布上不播放

关联组件的实例没有音效一节,播放的是组件本身设置的音效。取决于条件的声音,在蓝图中用 Sound 节点播放

页面音乐

页面在属性面板中有音乐一节,决定页面显示期间播放什么音乐。游戏 UI 没有音乐一节,它下面播放的是场景的音乐

  • 未选择音乐时,这一行显示保持当前音乐,页面不改变音乐:打开页面时在播放的音乐继续播放。新建的页面就是这样
  • 选择页面音乐可以选择一个音频资产或资产集,页面播放它。同一段音乐已在同一音轨上播放时,它不中断地继续;否则正在播放的音乐按自己的淡入淡出时间淡出,页面的音乐按页面的淡入淡出淡入
  • 选择页面音乐旁的无音乐使页面显示期间不播放音乐
  • 清除回到保持当前音乐

选好的音乐下方有一行折叠的摘要,例如 音量 1 · 音乐 · 循环,点开是它的播放选项:音量(0 到 1)、音轨、循环与淡入淡出。音乐默认在音乐音轨上播放,可在音轨中更换,玩家对该音轨的音量设置会生效。循环在改动之前跟随音轨自己的设置,音乐音轨是循环的。淡入淡出以秒为单位:音乐按它淡入,被其他音乐接替时也按它淡出

播放哪段音乐由屏幕上的页面从上往下决定:先是打开在页面之上的叠加页面,然后是页面,各自后打开的在前。第一个播放音乐或设为无音乐的页面决定音乐。保持当前音乐的页面交给它下面的页面决定;所有页面都保持当前音乐时,不播放页面音乐

  • 保持当前音乐的页面,例如在标题页上打开的设置页面,让标题页的音乐继续播放
  • 返回到下面的页面时,换回那个页面的音乐
  • 用 Replace Page(替换页面)打开、保持当前音乐的页面,继续播放被替换页面的音乐
  • Play Page Music(播放页面音乐)与 Stop Page Music(停止页面音乐)在页面打开期间改变它们所在蓝图的页面的音乐,例如换成在音乐鉴赏里按下的曲目,见 Sound 节点

游戏进行中由故事决定音乐。开始游戏或读取存档时页面音乐淡出,在游戏中打开的页面(例如存档页面或设置页面)不播放页面音乐。游戏结束、回到页面时(退出游戏或故事结束),重新由页面决定音乐

页面音乐在开发模式与游戏中播放,编辑器画布上不播放。在开发模式中,没有改变页面音乐的编辑不会让它从头播放

列表

列表为每一行绘制一次项模板。每行包含的内容通过属性面板内容分区中的编辑内容设置,按钮下方一行列出字段名

编辑内容打开列表内容:

  • 字段是每行包含的值,各有名称和类型:字符串、数字、布尔值、图片、颜色或 JSON。项模板中的控件在字段中选择显示其中一个
  • 结构位于字段旁,决定字段的来源。自定义是为该列表填写的字段;其余选项是引擎给出的结构,例如结局、存档条目、历史记录条目,以及已加载插件的结构,例如画廊插件启用时的画廊条目
  • 数据是画布上绘制的行;没有其他来源为列表提供内容时,游戏中也绘制这些行

选择引擎或插件的结构后,字段就是对应节点给出的行的字段:显示 Get Endings 结局的列表无需填写,就有 endingId、name、sceneId、sceneName 和 isReached 字段。这些字段不能编辑。行标识和项模板中控件显示的字段改为同名字段。读取当前行的 Get Field 保留原来的字段,结构中没有该字段时会被报告,需重新选择字段。重新选择自定义时保留这些字段,并恢复为可编辑。各结构及其字段见结构

在编辑内容中所做的修改(包括字段改名)都可以用撤销恢复,与其他编辑相同

蓝图向列表提供的行缺少列表声明的字段时(例如把存档条目连入结构为结局的列表),蓝图画布上和问题面板中会报告列表字段不一致,列表中这些字段显示为空。带有全部声明字段且名称和类型都相同的行,无论还有其他什么字段,都可以接受。见 List 节点

页面参数

页面可以声明打开它时传入的值。选中页面,在属性面板的参数中添加。每个参数有名称、类型和默认值:

类型内容
字符串作为值使用的文本,例如 id 或标签
文字玩家阅读的文字。页面上的文本或按钮可以直接显示它
数字数字
布尔值真或假
列表供列表使用的行。它没有默认值,而有行结构:引擎或已加载插件的某个结构,或不指定。初始为空
JSON任意 JSON 值

同一页面内参数名称不能重复。给参数改名后,传入或读取它的蓝图仍保持连接,同一页面上显示它的列表也随新名称更新。游戏 UI 没有参数,因为游戏打开它时不传入任何值

以下方式为参数传入值:

  • Go Page、Replace Page、Show Layer 与 Set Frame Page 会为其 Page 字段中所选页面的每个参数各长出一个输入,见 App 节点
  • 页面控件在属性面板的参数中为其页面的每个参数各显示一个字段。在这里为文字参数填写的文字会参与翻译
  • Show Confirm 传入 message 和 buttons,见 Show Confirm

未传入的参数读取默认值。页面以三种方式使用参数:

  • 文本或按钮显示在页面参数(位于来源选项上方)中选择的文字参数,不需要蓝图。游戏中显示打开页面时传入的文字。节点传入的文字按原样显示;要翻译这些文字,用 Translation Key Text 或 Get Text 为节点提供文字。页面控件传入的文字会翻译。未传入时显示默认值,并且会翻译。在页面自己的画布上显示默认值;默认值为空时,显示控件自身的文字作为示例文字。在画布上双击这样的控件时,会说明其文字的来源,而不是进入编辑
  • 列表显示列表参数:在内容中把运行时项设为页面属性数组,并在参数中选择该参数。项模板显示的字段应包含在该参数的行结构中
  • Get Page Param 在蓝图中读取任意参数,类型随参数而定,见 Get Page Param

骨架模板的确认页面同时用到了两种方式:message 是由消息文本显示的文字参数,buttons 是行结构为确认按钮的列表参数,由按钮列表绘制

项目检查以警告报告以下问题:

检查报告
未声明的页面参数(ui/page-prop-undeclared)页面上的列表显示页面未声明为参数的页面属性。游戏中该列表不显示任何行
未知的页面参数(ui/page-param-unknown)页面控件传入了它所显示的页面未声明的值
不存在的页面文字参数(ui/page-text-param-missing)文本或按钮显示的参数不是页面声明的文字参数,或者控件不在页面上却显示页面参数。游戏中该处不显示文字
与页面参数不符的列表(ui/page-param-list-mismatch)列表显示的页面参数类型既不是列表也不是 JSON,或者其行结构缺少列表显示的字段(名称和类型相同)。行结构中的其他字段不影响
缺失的页面参数(blueprint/page-param-missing)Get Page Param 读取页面未声明的参数

组件

所选内容可以保存到组件库,并在别处再次放置。一组控件需要复用时,将其做成组件,而不是复制粘贴

参数在组件上声明,在每个放置处设置。字符串参数由组件的蓝图通过 Get Component Param 读取。文字参数是玩家读到的文字:组件内的文本或按钮在参数中选择它,各放置处在画布和游戏中显示各自的文字,可以直接输入,也可以使用翻译键

行为

控件行为写在蓝图中,而不是画布上。每个界面有自己的蓝图,项目另有一个面向整个应用的蓝图,即页面列表中的第一张卡片应用逻辑,参见蓝图

本页目录