FAQ
纺纱机常见问题解答
<详情>
Yarn Spinner 不是一个单独的项目,而是一个项目的集合。从概念上讲,我们认为 Yarn Spinner 具有 核心组件、一些 附加组件 和一些 Yarn Labs 实验。
[!危险] 如果您是 Yarn Spinner 新手,则不一定需要了解其组件。我们强烈建议从[start-here.md](write-yarn-scripts/start-here.md“提及”)开始。
核心组件
这些是生产就绪的组件,具有稳定的、已建立的、已发布的版本:
- Yarn,您编写对话和叙述所用的语言:您用 Yarn 编写 Yarn Spinner 脚本。
- Yarn Spinner for Visual Studio Code,流行的免费文本编辑器 Visual Studio Code 的_扩展_,它使它能够理解 Yarn 语言,并帮助您使用图形可视化工具和其他功能编写 Yarn 脚本。
- Yarn Spinner for Unity,您在 Unity 中构建的游戏中用于_导入_和_使用_Yarn 脚本的软件包。
- 尝试 Yarn Spinner,这是一种在线工具,可让您编写 Yarn 脚本并在 Web 浏览器中运行它们。编写基本的 Yarn 并进行测试很有用。这只是一个您可以访问的网站!
⭐️ 要学习使用核心组件,请跳至初学者指南。
附加组件
这些项目为 Yarn Spinner 提供附加功能,并作为构成 Yarn Spinner 大部分的免费开源项目的附加组件存在:
- Yarn Spinner 的对话轮,Yarn Spinner for Unity 的附加包,提供质量效应风格的对话轮对话演示器。
- Speech Bubbles for Yarn Spinner,Yarn Spinner for Unity 的附加包,提供可自定义的语音气泡作为对话演示者。
⭐️ 要购买附加组件,请访问 Yarn Spinner Itch.io 商店 或 Unity Asset Store,或直接阅读文档。
纱线实验室实验
这些是实验项目,可能最终会发布到 Core 中,但目前处于早期或实验阶段:
- Yarn Spinner for Unreal,您可以在用 Unreal 构建的游戏中_导入_和_使用_您的_Yarn 脚本_的软件包。
- Yarn Spinner for Godot,您在 Godot 中构建的游戏中用于_导入_和_使用_您的_Yarn 脚本_的软件包。
- Yarn Spinner for Rust,您可以使用该软件包在使用基于 Rust 的 Bevy 引擎构建的游戏中_导入_和_使用_您的_Yarn 脚本_。
[!成功] Yarn Spinner for Unreal 将于 2025-2026 年从 Yarn Labs 转移到核心组件。
如果您是 Yarn Spinner 新手,我们建议您下一步是 start-here.md
</详情>
<详情>
Yarn Spinner 是在 GitHub 上作为开源软件公开开发的。您还可以从 GitHub 上的源代码免费安装它。
如果您想将 Yarn Spinner 用于商业游戏,我们建议从我们的 Itch.io Store 或 Unity Asset Store 购买。您还可以联系我们获取定制许可证,或安排咨询、支持,或聘请我们专门为您添加功能!
</详情>
纺纱机脚本常见问题解答
<详情>
我们添加了很多新功能,包括 once.md、detour.md、[line-groups.md](write-yarn-scripts/scripting-fundamentals/line-groups.md “提及”),[node-groups.md](write-yarn-scripts/advanced-scripting/node-groups.md“提及”)等等。 Yarn Spinner 有很多专为故事和显着性设计的功能,您可以通过阅读此处的 saliency.md 指南来了解这些功能。
</详情>
Unity 纺纱机常见问题解答
<详情>
<摘要>文本</摘要>
我的文字根本不显示?
您需要安装 TextMeshPro 基本资源。打开“窗口”菜单 → TMP → 并选择“导入 TMP 基本资源”。
如何设置文本样式?如何将某些单词设置为粗体、斜体、彩色等?
Yarn Spinner 不直接进行文本渲染,我们使用 TextMeshPro 进行最终渲染,它支持 rich-text。
然而,在整个项目中编写 TMP 标签是不切实际的,因此我们通过 Yarn 标记属性 提供了各种样式和调色板。
它们提供了一系列常见的视觉变化,并提供了一个通用的界面
有一个 示例 展示了使用内置标记来设置文本样式,以及如何制作自己的标记来对文本进行更高级的样式设置。
如何制作波浪形文本的动画,就像《林中之夜》中那样?
Yarn Spinner 不处理文本渲染。您需要一个单独的波浪文本系统,例如 Text Animator。
如何使用 Yarn 标记?
标记允许您以通用方式标记一系列文本(单词、短语),无论用途如何。您可以使用它来设置文本样式、添加句子标记、制作可点击的单词等。
// 自定义“波浪文本”标记的 Yarn 脚本示例。
哦,[wave]你好[/wave]在那里!
// 编译后,文本将如下所示:“哦,你好!”
// 然后生成的标记数据将如下所示:
// - 名称:“波浪”
// - 位置:4
// - 长度:5
请注意,YS 仅处理文本数据。您仍然必须自己编写实际的标记效果。请参阅标记。
</详情>
<详情>
<摘要>变量</摘要>
如何在对话中打印变量的值?
将变量(或任何表达式)括在大括号({、})中以对其进行计算并输出。有关更多信息,请参阅变量。
<<将 $variableName 设置为“字符串值”>>
变量名的值为{$variableName}。
// 这将显示为“variableName 的值是一个字符串值。”
如何从 C# 脚本读取/写入 Yarn 变量?
您可以注册以便在变量更改时收到通知。为此,在 C# 中,在 Line Provider 上调用 AddChangeListener() 并提供一个在变量更改时运行的委托:
“csharp var stringListener = VarStorage.AddChangeListener("stringVar", (字符串值) => { Debug.Log("$stringVar 更改为 ” + value); });
当您不再需要收到变量更改的通知时,您可以在侦听器上调用“Dispose()”。如果您不这样做,变量存储将在每次变量更改时继续调用此委托,而您可能不想这样做。
``csharp
stringListener.Dispose();
如果您正在实现自己的变量存储系统,则每次变量值更改时都必须调用“NotifyVariableChanged()”方法,以便通知任何更改侦听器:
“csharp 公共覆盖无效SetValue(字符串变量名,浮点数floatValue) { //(省略更新变量的代码) // 通知更改侦听器此变量已更改 NotifyVariableChanged(变量名, floatValue); }
或者,要从 C# 读取 Yarn 变量,请使用“VariableStorageBehaviour.TryGetValue<T>()”。
要从 C# 写入 Yarn 变量,请使用“VariableStorageBehaviour.SetValue()”。
> [!信息]
> 写变量名时不要忘记`$`!
``csharp
变量存储 = GameObject.FindObjectOfType<InMemoryVariableStorage>();
浮动测试变量;
VariableStorage.TryGetValue("$testVariable", out testVariable);
变量存储.SetValue("$testVariable", testVariable + 1);
您还应该查看我们的 variable-storage 部分和 custom-variable-storage.md 指南。
如何从 Yarn 脚本中读取/写入 C# 变量?
要从 Yarn 读取和写入 C# 变量,您必须首先使用 C# 编写 Yarn 函数和命令。
“csharp 静态 int myNumber = 10;
// 注意:所有 Yarn 函数必须是静态的 [YarnFunction(“getMyNumber”)] 公共静态 int GetMyNumber() { 返回我的号码; }
// Yarb 命令可以是静态的或非静态的 [YarnCommand(“setMyNumber”)] 公共静态无效SetMyNumber(int newNumber){ 我的号码 = 新号码; }
然后调用Yarn中的函数和命令:
我的号码是 { getMyNumber() }! <<设置我的号码999>> 但现在是 { getMyNumber() }!
**如何在 Yarn 和 C# 之间“同步”变量?**
请参阅前面有关使用变量的答案。但我们建议避免任何“同步”模式,因为这样您就必须在两个不同的位置跟踪和维护相同的数据。程序员通常更喜欢[“单一事实来源”](https://en.wikipedia.org/wiki/Single_source_of_truth)。
数据应该只存在于一个地方。变量应该**存在于 Yarn 中或存在于 C# 中,并且**不能同时存在于两者中**。
**如何加载和保存数据/变量/对话状态? (就像保存游戏系统一样)**
要保存当前节点,请将 [`DialogueRunner.CurrentNode`](api/csharp/yarn.dialogue.currentnode.md) 的值保存在某处。然后要恢复它,请调用 [`DialogueRunner.StartDialogue()`](api/csharp/yarn.unity.dialoguerunner.startdialogue.md) 并传入保存的节点名称。
要保存变量,请参阅 [`DialogueRunner.SaveStateToPercientStorage()`](api/csharp/yarn.unity.dialoguerunner.savestatetopersistentstorage.md)。然后要加载变量,请调用 [`DialogueRunner.LoadStateFromPersistentStorage()`](api/csharp/yarn.unity.dialoguerunner.loadstatefrompersistentstorage.md)。这些方法使用 Unity 的内置 JSON 实用程序将变量字典序列化到当前平台 [持久数据路径文件夹](https://docs.unity3d.com/6000.1/Documentation/ScriptReference/Application-persistentDataPath.html)。
对于自定义保存系统,通过子类化 VariableStorageBehaviour 并实现其方法来创建您自己的[变量存储](yarn-spinner-for-unity/components/variable-storage/variable-storage.md)。以 [InMemoryVariableStorage.cs](https://github.com/YarnSpinnerTool/YarnSpinner-Unity/blob/main/Runtime/InMemoryVariableStorage.cs) 为例进行研究。有关更多信息,请参阅[指南:Yarn 变量和变量存储](yarn-spinner-for-unity/components/variable-storage/variable-storage.md)。
</详情>
<详情>
<summary>流量控制</summary>
**如何跳转到特定节点?对话运行时如何切换节点?**
要从 Yarn 跳转到节点,请使用“<<jump (nodeName)>>”。请参阅[节点、线和选项](write-yarn-scripts/scripting-fundamentals/lines-nodes-and-options.md)。
要使用 C# 跳转到节点,只需调用 [`DialogueRunner.StartDialogue()`](api/csharp/yarn.unity.dialoguerunner.startdialogue.md)。\
虽然您可以在对话运行时跳转到另一个节点,但我们建议**不要**这样做,并在开始另一段对话之前调用 [`DialogueRunner.Stop()`](api/csharp/yarn.dialogue.stop.md)。
**如何跳转到节点中的特定行?**
目前不支持跳转到节点中的特定行。相反,[跳转到节点的开头](faq.md#how-do-i-jump-to-a-specific-node-how-do-i-switch-nodes-while-dialogue-is-running)。
</详情>
<详情>
<summary>交互/UI</summary>
**如何通过按键/按钮继续对话而不是单击继续按钮?**
[Line Advancer 组件](yarn-spinner-for-unity/components/dialogue-view/dialogue-advance-input.md) 演示了这一点,它处理这个确切的场景(以及其他场景)。\
我们建议您看看它如何处理加快或推进队伍的不同方式,作为您自己的游戏的起点。
**显示选项时如何显示最后一行文本?如何跳过一组选项之前的最后一行文本?**
当下一步是一组选项时,Yarn Spinner 会自动将“#lastline”标记添加到一行中。创建一个 [自定义对话演示器](yarn-spinner-for-unity/components/dialogue-view/custom-dialogue-views.md),它使用 [`YarnProject.lineMetadata.GetMetadata()`](api/csharp/yarn.unity.linemetadata.getmetadata.md) 检查“lastline”并执行您想要的行为。
**如何自定义对话显示?**
要在 Yarn Spinner 中显示_任何内容_,请使用 [Dialogue Presenter](yarn-spinner-for-unity/components/dialogue-view/custom-dialogue-views.md) 组件。\
有两个内置演示器演示了用于对话行的基本功能 [Line Presenter](yarn-spinner-for-unity/components/dialogue-view/line-presenter.md),[Options Presenter](yarn-spinner-for-unity/components/dialogue-view/options-presenter.md) 用于对话选择。
大多数项目都需要自定义演示者。\
我们建议采用模块化架构,其中每个演示者处理其自己的显示的特定部分。\
一个例子是在内置演示器中,行演示器仅处理显示行,而选项演示器仅处理选择。
**如何让线路演示者的打字机暂停?**
您可以使用内置的暂停标记来暂停打字机效果:
玩家:如果我现在能喘口气[暂停/]当然会很好。
**当我单击/点击对象时如何播放 Yarn 节点?**
编写输入代码来检测点击/点击,然后调用“DialogueRunner.StartDialogue()”。
**当我接近一个物体并按下按钮时,如何播放 Yarn 节点? (与 NPC 进行类似 RPG 的对话)**
每个游戏的这种实现都会有所不同,因此我们故意不尝试设计一种一刀切的通用 NPC 系统。下面是一些您自己的伪代码示例:
if(玩家按空格键) 然后找到最近的NPC 获取该NPC的对话节点名称 使用 NPC 的对话节点调用 DialogueRunner.StartDialogue() 禁用玩家移动
这些示例确实有一个名为 [Dialogue Interactible](https://github.com/YarnSpinnerTool/YarnSpinner-Unity-Samples/blob/main/Shared%20Assets/Scripts/DialogueInteractable.cs) 的共享脚本,它展示了实现此行为的一种方法。
**如何将对话气泡放置在 NPC 的头顶上方,就像“短途远足”中那样?**
数学/代码有点复杂。计算 NPC 在屏幕上的位置,然后将此屏幕位置转换为 UI 画布空间,并重新定位对话气泡。\
如果您想让所有这些都正常工作,我们确实有一个[付费附加组件](add-ons/speech-bubbles/) 可以为您处理所有这些(以及更多)。
**如何实现调整大小的对话气泡/短信界面?**
这更多的是关于 Unity UI 而不是 Yarn Spinner。有关工作示例,请参阅 [电话聊天](yarn-spinner-for-unity/samples/page-1.md) 示例。
要制作自动调整文本大小的对话框气泡,您将需要复杂的 UI 设置。研究示例场景中的 UI 游戏对象和组件。有关其工作原理的更多背景信息,请参阅 [Hallgrim Games 的 Unity UI 布局组解释器](https://www.hallgrimgames.com/blog/2018/10/16/unity-layout-groups-explained)。
**如何将文本输入字段中的文本输入到我的 Yarn 故事中?**
这主要涉及Unity UI,并假设您的项目已经有一个系统,玩家可以像TMPro输入字段组件一样输入文本。如果玩家输入需要在对话执行过程中发生,那么您可以使用 Yarn 命令触发它,并在需要时等待玩家输入。
获得玩家输入值后,您可以将其存储在 C# 变量中并通过 Yarn 函数访问它,或者将该值存储在 Yarn 故事变量中。 [有关如何访问 Yarn 和 YarnSpinner 中的变量的常见问题解答请参见此处](faq.md#variables)。
</详情>
<详情>
<摘要>系统</摘要>
**如何在运行时生成 Yarn 项目?如何在运行时加载/编译 Yarn 脚本?**
预期的工作流程是在编辑器时(而不是运行时)生成和编译 Yarn 项目。请参阅 [Yarn 项目](yarn-spinner-for-unity/yarn-projects.md)。
> [!信息]
> 在运行时编译 Yarn 脚本比乍看起来更加复杂,因为它经常与游戏的特定需求交互,而我们无法提供一种万能的方法。如果您想在自己的游戏中实现运行时加载,可以从 [Yarn.Compiler](api/csharp/yarn.compiler.md) 命名空间的 API 文档开始查找。请注意,我们不鼓励纱线纺纱机新手这样做!
**我应该有多少个 Yarn 文件?我的整个游戏可以在一个项目或脚本中吗?或者每个场景一个项目?我的项目或文件太大了吗?**
Yarn 脚本的数量或 Yarn 项目的大小没有真正的技术限制。您决定如何组织数据,每个项目都有不同的需求。需要考虑的一些因素:
* **简单**。有时,将所有内容放入一个大脚本文件或一个大项目文件中会更简单。
* **易于书写**。作者可能更喜欢按照每个场景一个文件、每个章节一个文件的方式来思考。
* **本地化**。 1 个 Yarn 项目 = 每种语言 1 个 CSV 电子表格。翻译时,使用较少的文件通常比将翻译分散到多个文件中更容易。作为需要多个 Yarn 项目的游戏的解决方法,您可能更愿意创建一个仅限编辑器的 Yarn 项目,仅用于生成字符串文件和翻译。请参阅[本地化和资产](yarn-spinner-for-unity/assets-and-localization/)。
</详情>
<详情>
<summary>本地化</summary>
**如何在 C# 中获取任何 Yarn 本地化字符串?**
一些开发人员使用 YS 来管理所有游戏内本地化文本,例如 UI 字符串。这种用途不是有意的,但它是可能的。手动创建一个 Yarn.Line 结构体,设置线路 ID(请参阅 [Localization](yarn-spinner-for-unity/assets-and-localization/)),然后将该结构体传递到[`GetLocalizedLine()`](https://docs.yarnspinner.dev/api/csharp/yarn.unity/yarn.unity.lineproviderbehaviour/yarn.unity.lineproviderbehaviour.getlocalizedline)。
``csharp
Yarn.Line targetLine = new Yarn.Line();
targetLine.ID = "行:lineid"; // 将 'lineid' 替换为实际线路 ID
LocalizedLine outputLine = LineProvider.GetLocalizedLine(targetLine);
调试.Log(outputLine.Text.Text);
</详情>
<详情>
<摘要>示例</摘要>
我安装了示例包,但包管理器中没有示例,这是怎么回事?
由于某种原因,当您从 Unity Asset Store 安装 samples 包时,它在包管理器中有两个条目。
仅安装了示例包的一份副本,您没有资产和脚本的重复项,它仅在列表中出现两次。
“包 - 资源商店”部分下的第一个条目没有示例,甚至没有示例选项卡。
“Packages - Yarn Spinner Pty Ltd”部分下的第二个条目包含示例。
我们目前正在考虑是否可以做得更好,但现在如果您选择第二个条目,它将具有示例选项卡,您可以从那里安装示例。
</详情>
<详情>
<摘要>其他</摘要>
如何在我的游戏中添加 Yarn Spinner 的积分?
请访问 授信纺纱厂页面 了解更多信息。
Unity 中有任何 Yarn Spinner 实现的示例吗?
是的!我们运送了整个[样品]集合(yarn-spinner-for-unity/样品/“提及”)。
</详情>