显着性

在 Yarn Spinner 中,显着性可让您控制如何 线组节点组 选择要运行的内容。

[!警告] 我们建议您阅读 storylets-and-saliency-a-primer.md 在阅读本页之前。

当线路组或节点组需要运行内容时,它需要决定选择组中的哪一项。做出此决定的方法称为“显着性策略”。

显着性策略提供了有关每个项目的以下信息:

  • 它的条件有多少通过了(即 when: 节点组上的子句,或行组上的单个条件)
  • 有多少条件不满足
  • 其所有条件的总复杂度:
    • always 条件的复杂度为零。
    • 否则,将以下值相加:
      • 如果条件是 once 条件,加1。
      • 如果条件有表达式,请将存在的布尔运算符(and、or、not、xor)总数加上 1。
  • 标识内容的唯一密钥。

[!信息] 以下是计算复杂度的一些示例 when: 标题:

  • when: always 复杂度为0。
  • when: $a 复杂度为 1。
  • when: $a or $b 复杂度为2。
  • when: once 复杂度为 1。
  • when: once if $a or $b 复杂度为3。

您可以使用 Yarn Spinner 的内置显着性策略之一,也可以创建自己的自定义显着性策略。

Yarn Spinner 有几种内置的显着性策略。

  • 第一个: 选择组中未满足任何条件的第一个项目。
    • 如果节点组的项目全部位于同一文件中,则组的顺序就是它们在文件中出现的顺序。如果节点组的节点分布在多个文件中,则未定义节点的顺序。
  • 最佳: 未满足任何条件的项目按其总复杂度分数排序,并选择分数最高的第一个项目。
  • 最近最少查看的最佳: 未满足任何条件的项目按此策略选择的次数排序,然后按分数排序。如果剩余多个最佳项目,则选择其中第一个。
  • 随机最佳最近最少查看: 未满足任何条件的项目按此策略选择的次数排序,然后按分数排序。如果剩余的最佳项目超过一项,则会随机选择其中一项。

如果您自己没有在任何地方设置显着性策略,则默认值将为随机最佳最近最少查看。

显着性策略被赋予一组可能的选项,并返回应该运行的其中一个,或者 null 表明它们都不应该运行。

[!危险] 您只能在 Try Yarn Spinner 中以及在 Unity 等游戏引擎中使用 Yarn Spinner 时更改显着性策略。

更改 Try Yarn Spinner 中的主动显着性策略

使用 Try Yarn Spinner 时,您可以通过调用以下内置命令之一来设置显着性策略:

<<set_saliency first>>
<<set_saliency random>>
<<set_saliency best>>
<<set_saliency best_least_recent>>
<<set_saliency random_best_least_recent>>

更改 Yarn Spinner for Visual Studio Code 中的主动显着性策略

使用 Visual Studio Code 预览对话框时,您可以在预览视图顶部的下拉菜单中更改活动显着性策略:

更改 Visual Studio Code 中的显着性策略。

创建自定义显着性策略

您的 C# 代码可以创建自定义显着性策略。为此,请创建一个实现以下功能的类型 IContentSaliencyStrategy 接口,并将其分配给您的 Dialogue 对象的 ContentSaliencyStrategy 财产。

IContentSaliencyStrategy 有两个必需的方法。

  • ContentSaliencyOption? QueryBestContent(IEnumerable<ContentSaliencyOption> content) 确定应运行一组选项(如果有)中的哪一个。它应该从可用选项中返回最佳内容,或者 null 如果他们都不应该运行。这是您为自定义策略编写特定逻辑的主要方法。
    • 调用此方法_并不_表明内容_已被选择;_相反,它是一个确定_应该选择什么_的查询。您对此方法的实现不应更改任何状态,并且应该是只读的。该方法返回的内容不保证实际运行。
  • void ContentWasSelected(ContentSaliencyOption content) 被调用以指示先前调用返回的特定内容片段 QueryBestContent 已被选中。该方法应该更新任何适当的状态来表示这一事实,例如通过更新内容被选择的总次数。

查询是否有内容可以运行

您可以使用节点组来检查其任何项目是否可以运行,这在确定是否显示角色是否应标记为准备说话,或其任何节点是否具有特殊标签(例如,角色是否有重要信息要讨论,而不是更一般的对话)时非常有用。