对话树扩展
提示
尝试这些游戏示例! 🎮
对话树扩展可以用于快速创建动态对话树行为。它提供了动作、条件和表达式,使设置这样一个系统非常容易,包括文本滚动、动画头像和条件对话。示例演示项目只需 16 个事件即可实现这一切。
如果你想制作一个以故事为主的游戏——不管是 RPG、视觉小说还是其他类型的游戏,这个扩展将帮助你快速实现目标,并让你专注于你的故事。
GDevelop 不仅提供这个扩展,还附带了一个流行的故事编辑器,名为 YARN,用于编辑扩展使用的数据。
YARN 在许多商业和独立游戏中经过了考验。如果你使用 Ren'Py、RPG Maker、AGS 或其他专注于故事丰富的游戏引擎,你会在 GDevelop 中感到宾至如归。继续阅读;)
入门
YARN 使用特殊的 JSON 文件格式存储对话数据。要创建或编辑现有的 YARN JSON 文件,你需要首先在 GD 的事件表中添加一个需要它的动作。该动作称为“从 JSON 文件加载对话数据”。在资源下拉菜单中——不管你是否已有任何 JSON 资源,你将找到一个小刷子按钮,点击它将让你打开 YARN 并创建/编辑一个文件。
关于 YARN:交互式故事语法解剖
对话树扩展建立在一个名为 bondagejs 的 JavaScript 库之上。
它有一个非常易学但也非常强大的语法,可用于基于用户选择或用户已访问事件创建复杂的故事事件。
YARN 对话语法被设计成易于让对编程知识很少或没有的作者理解。它对于你的游戏如何向玩家展示对话,或者玩家如何选择他们的回应,没有任何假设。
YARN 文件由节点构成——这些通过箭头相连的小方块。当你有一堆这些方块用箭头连接在一起时,就形成了一个对话树。我们将这棵树的每个节点称为分支。在单个文件中可以有多棵树,例如,你可以将整个村庄 NPC 的对话都展示在面前,每个村民是一棵树。要编辑 YARN 中的节点,只需双击它。要关闭并保存它,只需点击其编辑区以外的位置。
当你编辑一个节点时,你正在使用 YARN 语法编写。在 YARN 中编写故事就像编写对话一样,但也要在其中夹杂对玩家隐藏的幕后指令,这些指令被包装在特殊的标签中。这些指令可以用于驱动游戏中发生的事情。根据<> \[包裹\]<> 标签,YARN 理解三种类型的数据,这三种类型在我的扩展中称为“对话行类型”:
1. 文本行类型
这段文字是玩家在到达它所在对话分支时看到的。如果你没有在文本周围放置其他类型的特殊包装——它将保持为普通文本。当情况不是这样时,YARN 会通过更改颜色来提示你。
提示
YARN 解释新行作为两个文本行类型之间的逻辑暂停。因此,每当你在新行上写入文本时,这也告诉游戏引擎在玩家按下按钮后开始在新行上打印文本。当然,这种行为完全是可选的,取决于你如何使用扩展。因为这是最常见的情况,应该注意到它是出于设计考虑。
2. <> 行类型
还记得我们之前提到的神奇 YARN 语法吗——我们放置在玩家阅读的普通文本之间,以触发游戏中事件的单词? 我们称它们为命令。它们被包裹在 <><< 和 >> <> 之间。你放置在这两个符号之间的任何内容都是玩家看不到但 GDevelop 可以看到的 <>。这些消息可用于为您触发事件。如果你使用扩展内置的滚动逻辑,这些命令将在文本滚动到<> 时触发。
命令还可以携带引擎用于决定如何触发某事的参数。要向命令传递参数,只需在命令的第一个单词之后键入它们,使用空格,就像这样:
<> 等等。
示例项目中的一个示例是更改动画头像的方式:
<> 当触发命令 avatar 时,设置头像精灵对象更改其动画为其后的单词-CommandParameter(0)(ant)
提示
如果你使用扩展的内置滚动功能,可以使用内置的<> 命令在文本/其他命令之间插入暂停。在这种情况下,1000 等于 1 秒,但可以是任何你选择的内容。例如,<> 将暂停文本滚动半秒钟,然后继续。如果在此之后有另一个命令,那么在过半秒钟之前不会触发它。因此,等待可以用于在一系列自定义命令之间插入暂停-类似于 RPG 制作人 😃
除了你可以为自己设置的命令和内置于扩展中的命令之外,YARN 的解析器库-bondagejs 还附带了一些非常酷的内置命令,可用于存储信息,并使用它来有条件地向玩家展示文本。所以,假设你的玩家曾经访问过一个项目的对话分支并阅读过它。然后拥有这些信息,玩家与 NPC 开始对话。这让您告诉Yarn,如果玩家看到了该物品,NPC将说一件事 - 如果没有看到,则会说另一件事。执行此操作的语法非常简单:
(1) **<
** 将告诉Yarn将您的值存储在$myYarnVariable中。您可以在玩家读到已经看到或拿到物品或任何故事需要的情况下设置它。
(2) **<
**
blah blah blah
**<
**
more blah
**<
**
other blah
**<
**
将告诉Yarn检查**<<if $myYarnVariable**是否等于aValue,如果是,将显示_blah blah blah_
如果不是,将检查**<<elseif...**是否为真,如果是,将显示_more blah_
如果所有都失败,**<
将触发_other blah_发生。< 和< 是可选的。不要忘记使用< **关闭它
注
示例:
您发现了一块奇怪的石头 **<
**
注
在另一个节点树的示例:
有一个奇怪的井。 凝视下去,您只能看到黑暗...
**<
**
您是否要把您在井中找到的奇怪的石头扔下去?
[putRockNode](https://wiki.gdevelop.io/yes do it)
[otherNode](https://wiki.gdevelop.io/I rather not)
**<
**
不要忘记您可以在此**<
...< **块中放置任何内容 - 无论是其他指令还是导致其他分支的对话选项。
注
对话树扩展将存储玩家在玩游戏时设置的所有$variables,并提供用于获取/设置它们的表达式/操作 - 以便在玩家保存游戏时存储它们并能够重新加载它们。
3. 选项线类型
这是创建节点之间箭头的类型。这是Yarn用于向用户显示选择的内容。语法如下:
** [? [player choice|otherNodeTitle] **
** [? another choice|anotherNodeTitle] **
左侧的文本**|**的文本是玩家将看到的内容。右侧的文本是您用来告诉Yarn玩家将被发送到的节点的标题。
您还可以这样做
** [? anotherNodeTitle] **
这只是告诉Yarn继续到那个节点,而不需要任何用户输入。嵌套在if语句中时很有用。
注
当您开始**[ ]时,Yarn将为您自动完成它,但是如果您想知道如何写**|,在大多数英语键盘上是shift + **
警告
请注意,截至目前,节点标题不能包含空格,破折号或任何奇怪的字符。只能使用字母a-Z和数字0-9
警告
避免使用包含指向不存在节点的链接或没有链接的选项。这可能会导致扩展程序崩溃您的游戏
**需要注意的问题:**如果您尝试执行以下条件选项:
好孩子们,我们要选择... [不确定](https://wiki.gdevelop.io/Frog Head) <<endif>>
Yarn将会将玩家发送到“不确定”而不是将其显示为两个选项,即使if条件为真。正确的做法是:
好孩子们,我们要选择... <<if $robot_head_0_done == 1>> [不确定](https://wiki.gdevelop.io/Bird Head) <<endif>>
如果当if语句为真时,只是要将玩家发送到另一个节点(PickRobotMascot0)而不显示任何选项,您可以这样做:
好孩子们,我们要选择... <<if $robot_head_0_done == 1>> [PickRobotMascot0](https://wiki.gdevelop.io/Bird Head) <<endif>>
已知问题:
使用->快捷键会导致我的游戏崩溃 - 这是 bondage.js中的已知错误 - 对话树扩展程序正在使用该库解析yarn文件. 请参阅 https://github.com/hylyh/bondage.js/issues/31
从<
后面的文本会被剪切 - bondagejs中的已知错误https://github.com/hylyh/bondage.js/issues/61
警告
如果您在遇到消息中提到bondage.min.js文件的问题,请更有可能是该库的问题。请报告至 bondagejs git跟踪器,而非gdevelop的https://github.com/hylyh/bondage.js/issues/
- 我在使用Yarn编辑对话时遇到了问题 - 如果发生了这种情况,除非在打开或保存对话时遇到问题 - 这很可能是Yarn的错误,而不是 GDevelop。
警告
要报告Yarn编辑器错误,请使用Yarn bug跟踪器,更多开发人员将在其中查看。
https://github.com/YarnSpinnerTool/YarnEditor
- 我遇到了来自对话树的文本样式问题 - 如果出现此问题,很可能是另一个扩展的错误。如果您正在使用BBcode扩展,并且例如下划线文本样式不起作用或某些文本样式组合不起作用,则问题更有可能出现在它使用的pixi-multistyle-text库中。值得注意的是pixi当前不支持文本下划线样式。 因此,尽管您可以在Yarn编辑器中看到它,但它在您的游戏中将无效**
警告
要报告 pixi-multistyle-text 错误,请使用下面的跟踪器:https://github.com/tleunen/pixi-multistyle-text
在GDevelop中设置事件表单
要开始真正起步,最好的方法是打开对话树扩展的演示项目。从那里,您可以在其上构建自己的功能,甚至自己的扩展。如果查看事件表,您将发现整个逻辑适合单个屏幕截图
演示项目并未使用扩展程序的全部功能,并旨在以最简单/最快的方式提供功能。扩展程序包含许多操作、条件和表达式,可用于构建非常可定制的演示给玩家的方式。### 对话的基本生命周期
- 游戏开始或关卡开始时加载对话树数据
- 设置对话触发条件 - 使用"从分支开始对话..."操作,并将节点标题的名称作为参数传递,通常是树的根节点。在示例中,npc对象的dialogueBranch变量被使用。这样可以轻松地创建多个npc并只需在其属性中更改该变量。
- 告知游戏引擎如何将对话数据显示给玩家并让引擎使用 - 针对每种对话类型
- 设置可被Yarn触发的可重复使用命令,比如更改头像、播放音效以及任何其他有助于讲故事的游戏事件。
示例
参考
所有操作、条件和表达式均在对话树参考页面中列出。