NarraLeaf

示例:好感度与多结局

用存档变量记录好感度,在选项中修改它,用蓝图值在对话框中显示它,按它进入不同结局,并在标题页显示已达成的结局数

本示例在骨架模板创建的项目中实现一个好感度系统:

  • 选项增加存档变量好感度
  • 对话框右侧显示好感度的当前值
  • 好感度不低于 20 时出现一段额外分支
  • 故事结尾根据好感度和真心进入三个结局之一
  • 标题页显示已达成的结局数
部分位置作用
存档变量好感度变量面板保存好感度,随存档保存和读取
/inc、/if、/ending场景增加好感度,按好感度分支,标记结局
蓝图值游戏 UI 对话中的文本读取好感度并显示
Get Endings(获取结局列表)页面标题中的文本显示已达成的结局数
结局条件
一起参加文化祭好感度不低于 35,且在社团活动室选择了「做点真心的东西。」
明天老时间好感度不低于 20
离开社团其他情况

准备

使用骨架模板新建项目,步骤见入门。骨架包含走廊、社团活动室和最后的光三个场景。社团活动室的菜单将选择写入存档变量真心;最后的光根据真心显示不同的台词,并以结局明天老时间结束

以下步骤依次声明变量、修改三个场景,最后修改游戏 UI 对话和页面标题

1. 声明变量

在右侧栏打开变量,在存档变量中点击添加。将新变量命名为好感度,类型设为数字,默认值保留0

存档变量属于整个项目,所有场景和蓝图都可以读写。其值写入存档,读档时恢复,开始新游戏时重置为默认值。其他作用域见变量

2. 在选项中修改好感度

走廊

在 Narra 的台词「一个半。天还没黑你就走了。」之后新建一行,输入/menu并按两次 Enter,Studio 插入一个菜单及其第一个选项。在菜单行上点击添加选项添加第二个选项,双击选项输入文字,然后在选项上点击在内部添加动作,输入选择该选项后执行的行:

选项选项内的行
今天我待到最后。Narra:「那今天一起锁门。」
/inc 好感度 10
今天有别的事。Narra:「知道了。」

社团活动室

菜单**我们做什么?**的两个选项中各有一行/set 真心 …,在其后分别加入:

选项加入的行
做点真心的东西。/inc 好感度 20
做点真的会有人来的东西。/inc 好感度 10

输入/inc 好感度 20并按 Enter 后,该行显示为增加 好感度 20。/inc省略数值时加 1,/dec用于减少,/set 好感度 好感度 + 20与/inc 好感度 20效果相同

社团活动室的两个选项内各有一行「增加 好感度」,右侧变量面板的存档变量中有好感度(数字,默认值 0)和真心

3. 在对话框中显示好感度

添加文本

在左侧活动栏选择 UI,在界面中选择游戏 UI,打开对话。从画布下方的工具栏将文本拖到对话底带右侧,命名为好感度,文字设为右对齐。该位置在名牌右侧:位置 X 1420、Y 754,尺寸 320 × 46

将文本设为蓝图值

选中该文本,在属性面板的内容中将文本从直接输入切换为蓝图值。Studio 为其创建蓝图值,原有文字成为示例文字,仅在编辑器中显示。点击打开蓝图值

UI 编辑器中打开的游戏 UI 对话,选中的文本好感度在属性面板中使用蓝图值,示例文字为好感度:30

搭建图

蓝图值中已有Init(初始化)连接到Return Value(返回值),并由一个String(字符串)提供原有文字。删除String,按下表加入节点并连线:

节点设置连接到
Init(初始化)执行连接到Get Saved Var
Get Saved Var(获取存档变量)存档变量选择好感度执行连接到Return Value;值连接到Concat的 B
Concat(拼接)A 填写好感度:结果连接到Return Value的值
好感度的蓝图值:初始化连接到获取存档变量和返回值,存档变量的值经拼接加上前缀后连接到返回值

蓝图值读取的存档变量每次写入后,文本都会重新求值。执行/inc、读档和开始新游戏时,对话框中的数值都会更新

开发模式中 Narra 提问后的两个选项,对话框右侧显示好感度:30

4. 按好感度分支

在最后的光中,于真心的条件之后、Narra 的台词「明天老时间。别再迟到了。」之前新建一行,输入/if 好感度 >= 20并按 Enter,在如果下加入:

  • Narra:「回去的时候,要一起走到车站吗?」
  • 一个菜单:选项「一起走吧。」内为 Narra:「好。」和/inc 好感度 15;选项「今天不行。」内为 Narra:「那下次吧。」

好感度低于 20 时跳过整个分支。该条件没有否则分支,不满足时继续执行下一行

/if的条件是表达式,支持比较运算以及&&、||和!。也可以在属性面板中将条件切换为变量,从下拉框选择变量和比较方式

5. 三个结局

删除最后的光末尾的两行旁白和结局明天老时间。在场景末尾输入/if 好感度 >= 35 && 真心并按 Enter,然后在条件行上点击否则如果和否则,加入另外两个分支:

分支条件分支内的行
如果好感度 >= 35 && 真心旁白「文化祭当天,我和 Narra 一起布置了社团活动室。」
/ending 一起参加文化祭
否则如果好感度 >= 20/ending 明天老时间
否则旁白「之后,我没有再去社团。」
/ending 离开社团

/ending在该行结束故事,并记录玩家到达的结局

最后的光末尾的三个分支,每个分支以结局行结束,选中的第一个分支在属性面板中显示条件表达式

6. 结局后返回标题页

打开项目 → 应用,在变体中展开 main,将剧本结束后显示的页面设为标题。故事在结局行结束后显示该页面。单个结局行可以在属性面板的结束后显示的页面中指定其他页面

7. 在标题页显示已达成的结局

玩家到达的结局记录在存档之外,读档、开始新游戏和重新启动游戏都不会清除该记录

打开页面标题,在标题分隔线下方添加一个文本,命名为结局进度。将文本切换为蓝图值并打开

添加Get Endings(获取结局列表),故事选择骨架。它的结局列表输出类型为结局列表。从结局列表拖出连线,在画布空白处松开,添加节点菜单打开在字段分组,列出对结局各字段可做的操作。选择按 isReached 筛选:Studio 添加Array Filter By Key(数组按键筛选),键设为isReached,值设为真,并把结局列表连到它的数组

添加其余节点,按下表连接:

节点设置连接到
Init(初始化)执行连接到Return Value
Get Endings(获取结局列表)故事选择骨架结局列表连接到Array Filter By Key的数组
Array Filter By Key(数组按键筛选)键为isReached,值为真数组连接到Array Length
Array Length(数组长度)长度连接到Make Array的项 1
Get Endings(获取结局列表)故事选择骨架结局列表连接到第二个Array Length
Array Length(数组长度)长度连接到Make Array的项 2
Make Array(创建数组)两项数组连接到Format的值列表
Format(格式化)模板填写已达成结局 {0} / {1}结果连接到Return Value的值

Get Endings列出故事中的所有结局行。每个结局都有isReached字段,表示玩家是否到达过该结局。第一个Get Endings筛选出已到达的结局,第二个统计全部结局。从同一个结局列表输出再拉一条连线会替换原有的连线,因此两个计数各用一个Get Endings。结局的字段以及读取这些字段的其他节点,见结构

结局进度的蓝图值:两个获取结局列表,一个经数组按键筛选和数组长度,另一个只经数组长度,两个数值进入创建数组,再由格式化生成文字

模板是写在图中的文字,不随游戏语言切换。项目包含多种语言时,使用Translation Key Text(翻译键文本)提供模板

开发模式中的标题页,游戏标题下方显示已达成结局 1 / 3

测试与检查

  • 按 F5 在开发模式中运行项目。在某一行上点击从这一行开始播放,从该行开始运行
  • 开发模式左下角的调试按钮 → 故事 → 变量列出存档变量的当前值,并可直接修改。将好感度改为 40、打开真心后运行到结尾,检查结局一起参加文化祭
  • 开发模式按钮旁的箭头 → 重置玩家数据 → 开发模式,清除开发模式的全部存档和结局记录,标题页恢复为已达成结局 0 / 3
  • 在故事面板中点击打开场景流程,在变量列表中选择好感度。每个场景显示到达时好感度的范围;展开分支显示每个选项的增减量,以及以结局结束的分支
  • 条件的阈值高于任何路线可达到的值时,问题面板报告没有路径能满足的条件,并给出该处好感度的范围
聚焦好感度的场景流程:到达走廊时为 0,社团活动室为 0-10,最后的光为 10-30,展开的分支标出各选项的增量和三个结局分支

相关页面

本页目录