2、对话编辑器
⑴对话数据库
对话数据库是一个资产文件。若要创建对话数据库,请执行以下操作:
- 单击对话管理的Create按钮。
- 或选择Assets → Create → Pixel Crushers → Dialogue System → Dialogue Database
对话数据库包含以下类别:
类别 | 描述 |
Database数据库 | 设置描述、作者和版本,以及数据库范围 |
Actors角色 | 会话参与者(玩家、NPC、交互对象) |
Items/Quests任务系统 | 任务定义 |
Locations位置 | 位置信息 |
Variables变量 | 用户定义的变量来判断对话决策 |
Conversations交谈 | 对话 |
下面就详细的介绍每一个类别
⑵对话编辑窗口
要打开对话编辑器,可以使用菜单项Tools → Pixel Crushers → Dialogue System → Dialogue Editor 或者点击对话管理器的logo横幅,或者双击对话数据库资源。 对话编辑器窗口与Inspector视图一起工作。
⑶Database数据库
Database Properties:
- Author:作者
- Version:版本
- Description:描述
- Global User Script:全局用户脚本,在运行时可以加载数据库设置的Lua代码
- Emphasis Settings:重点设置,可以标注设置颜色值
Global Search & Replace:全局搜索和替换允许您在对话数据库中搜索(可选替换)文本。 Merge Database:允许你将另一个对话数据库的内容合并到当前正在编辑的对话数据库中。 Export Database:允许你将对话数据库导出为各种格式,如voiceover脚本和CSV(电子表格)。 Localization Export/Import:本地化导出/导入foldout允许您以比导出数据库foldout更简单的格式导出本地化CSV文件。 Editor Settings:编辑器设置foldout包含诸如在何处以及如何频繁地对数据库进行自动备份等设置。
⑷Actors角色
Actors选项卡定义对话参与者。 你可以指定参与者的名称(以及在ui中使用的可选显示名称)、可选的人像图像等等。 肖像图像可以是纹理资产或Sprites。 如果你为一个角色使用Sprites,就不要给肖像纹理赋值。 同样的,如果你使用纹理,不要给Sprites赋值。
⑸Quests/Items任务系统
任务/项目选项卡定义任务和项目。项目只是您可以为自己的目的使用的数据记录。对话系统对条目不做任何特殊处理。 任务由任务系统使用,这在任务部分有详细说明。 使用此选项卡定义任务和可选的任务条目(子任务)。 你的任务文本可以包括标记标签。 状态是任务的开始状态。 此值不会在运行时实时更新;相反,在手表选项卡上查看任务的实时状态。 如果你想要任务出现在任务追踪界面,勾选可追踪,并在开始时追踪(任务一激活就会开启追踪)。
⑹Locations位置
位置只是数据记录。对话系统不会对地点做任何特殊的处理。
⑺Variables变量
变量是你可以在游戏中设置和检查的值。使用它们来追踪信息,例如玩家所做的决定,任务所收获或失败的目标数量等。Conversations选项卡和对话系统组件提供下拉菜单来选择变量并检查或设置它们。
对话系统将在对话开始时自动创建和设置四个变量。 你不必将它们添加到数据库中,但是如果你想在对话中方便地在下拉菜单中引用它们,你可以添加它们。
- Actor:对话的主要参与者(通常是玩家)的显示名称。
- Conversant:谈话的主要交谈者(通常是NPC)的显示名。
- ActorIndex:参与者的Actor[]表索引,提供了可选的低级Lua代码。
- ConversantIndex:Actor[]将谈话者的索引放在表中。
如果您的对话将内容分配给内置的变量Alert,对话系统将在对话结束时将其显示为警报消息。您还可以使用逻辑和Lua中描述的ShowAlert() Lua函数。
⑻Conversations对话
这是对话编辑器的核心。 你可以使用节点编辑器(如上所示)创建、编辑和删除对话。 在运行期间,此选项卡显示当前对话的实时视图。
节点编辑器
操作 | 步骤 |
Create new conversation 创造新的对话 | 点击对话标题下拉框右边的“+”。 |
Edit conversation properties 编辑会话属性 | 单击空白画布区域。用于设置标题、主要参与者和覆盖对话管理器的显示设置。 |
Add/delete node 添加/删除节点 | 右键单击node的上下文菜单。(添加子节点时,按住Shift键使用相同的actor分配,而不是交换它们。) |
Edit node 编辑节点 | 单击节点。 |
Edit link arrow Edit链接箭头 | 点击链接箭头。 |
Change display settings 更改显示设置 | Use 在右上角使用Menu 菜单 。 |
节点的检查器视图
操作 | 步骤 |
ID | 内容ID号 |
Title 标题 | 可选文本仅供参考。没有显示给玩家。 |
Description 描述 | 可选文本仅供参考。没有显示给玩家。 |
Actor 角色 | 说这句台词的角色。 |
Conversant 对话 | 说话人对角色(听众)说话。 |
Group 分组 | 如果勾选此项,则将其标记为用于分组子节点的直通节点。 |
Menu Text 菜单文本 | 在播放器响应菜单中显示的文本,例如对对话文本的简短解释。如果为空,则默认为对话文本。 |
Dialogue Text 对话文本 | 文本显示字幕。如果为空,则默认为菜单文本。注意:您还可以双击某个节点,直接在该节点上输入对话文本。 |
Sequence 序列 | 当角色说出这句台词时播放的过场动画。如果为空,则使用对话管理器的默认序列。 |
Response Menu Sequence 响应菜单序列 | 可选序列播放在后台,而响应菜单是可见的。如果玩家在播放响应菜单序列时在响应菜单中进行选择,则响应菜单序列将结束,下一个对话条目的序列将在同一帧上开始。 |
Conditions 条件 | 条件必须为真,才能允许玩家在响应菜单中说出或显示该行。 |
False Condition Action 错误条件的反应 | 当情况不对时该怎么做。 |
Script 脚本 | 调用节点时要运行的操作。 |
OnExecute() | 当这个节点被调用时运行UnityEvent。 |
Links To 链接 | 使用下拉菜单手动设置链接,调整它们的优先级,并调整它们的顺序。 |
Conditions 条件
你可以使用指向并单击下拉菜单或手动输入来将Lua表达式添加到条件字段,以允许对话仅在Lua表达式为真时才使用该输入。 例如,假设你只希望NPC在玩家访问巴黎时说出一行对话。 您可以定义一个初始值为false的变量“VisitedParis”。 当玩家访问巴黎时,将变量设置为true。然后为NPC的对话条目添加一个条件:
- Dialogue Text: "So, what did you think of Paris?" “那么,你觉得巴黎怎么样?”
- Condition 条件: Variable["VisitedParis"] == true 变量(“VisitedParis”) = = true
对话提前一层评估条件
对话系统在对话之前对链接进行额外的一级评估。 它必须这样做,以正确处理某些继续按钮模式。 这意味着,如果你在一个节点设置一个值(例如,节点),然后你不能检查它在下一个节点(节点B)因为对话系统将已经检查节点B之前运行节点的条件。 相反,你需要单独用一个空的间隔节点推迟评估的条件。 为了演示这一点,我们将使用抛硬币的对话示例:
在上面的例子中,“抛硬币”节点将变量x随机设置为1或2。我们不能立即使用两个条件节点(“正面”和“反面”)进行跟踪,因为对话系统提前一层评估——这意味着在“抛硬币”节点运行之前,它已经测试了“正面”和“反面”的条件。
为了解决这个问题,我们在对话中添加了一个中间节点,将标题设置为“延迟评估”以提醒我们自己它的用途,并将对话文本留空。 然后我们将序列设置为None(),这样它将立即进入对话的下一个步骤。 如果您使用的是continue按钮,那么在序列字段上选择 "+" → Continue → Simulate continue button click,而不是使用None()。
在处理条件时,将对话管理器的调试级别临时设置为Info可能也有帮助。 这将向控制台窗口添加大量信息。 如果你仔细阅读,你会发现下面这些行是相似的:
Dialogue System: Lua(x = math.random(2)) Dialogue System: Referee says 'Flipping coin...' Dialogue System: Block on False Link (Referee): ID=5:3 'Heads!' Condition='x == 1' Dialogue System: Add Link (Referee): ID=5:4 'Tails!' (True) Dialogue System: Referee says 'Tails!' 复制代码
第3-4行表示指向'Heads'的链接被阻塞了,因为'x====1'是假的,但它正在将链接添加到'Tails'(因为'x======2'为真)。
OnExecute() UnityEvent
事件折叠包含一个名为OnExecute()的UnityEvent。 使用它类似于将事件处理程序添加到Unity UI按钮的OnClick()事件。 但是,由于对话数据库独立于场景而存在,您不能分配场景对象。 相反,您必须分配一个资产文件,例如prefab或ScriptableObject。 注意:UnityEvents不受数据库导出特性或第三方格式导入器的支持。
在下面的示例中,我们将创建一个ScriptableObject资产,它提供了播放音频剪辑的方法。 然后我们将该方法分配给对话条目的OnExecute()事件。
首先,创建一个名为TestScriptableObject的新c#脚本,其中包含以下代码。 TestScriptableObject.cs
using UnityEngine; [CreateAssetMenu(fileName = "TestScriptableObject")] public class TestScriptableObject : ScriptableObject { public AudioClip[] audioClips; public void PlayAudioClip(int i) { AudioSource.PlayClipAtPoint(audioClips[i], Vector3.zero); } } 复制代码
接下来,在项目视图中选择Create→TestScriptableObject。这将创建一个资产文件:
你可能希望将资产移动到名为Resources的文件夹中。 通过这种方式,它将被包含在构建中。 在Unity的一些版本中,一些平台会剥离它认为不需要的资产。 这种情况通常发生在脚本对象资产中,这些资产在任何场景中都没有被引用。
检查你的新资产文件。你可以分配音频剪辑到它:
最后,检查对话条目节点的OnExecute()事件,单击“+”按钮,并分配TestScriptableObject。选择你想要执行的方法(PlayAudioClip),并指定你想要播放的音频剪辑的索引:
Outline Editor 大纲编辑器
你也可以在大纲模式下编辑对话,如上图所示,这对像Bioware的Aurora工具集这样的编辑器的用户来说可能更熟悉。要切换到大纲模式,选择Menu → Outline
⑼Templates模板
使用Templates选项卡来更改添加到新角色、任务、对话条目等的默认字段。 你还可以更改对话选项卡的大纲模式中使用的颜色。 右上角的菜单允许您保存和加载模板设置,用数据库中已经存在的自定义字段填充模板,并将模板应用于数据库中的所有内容。 若要添加新的自定义字段,请展开要自定义的类别。 然后单击灰色的“+”,提供字段详细信息。 在下面的屏幕截图中,我们为角色添加了一个自定义年龄字段。 我们还选择勾选主复选框,它告诉对话编辑器在actor的主检查器部分显示它,而不只是在所有字段中显示它。
⑽Watches观看
在运行时,一个Watches选项卡将替换Templates选项卡。在这个选项卡中,您可以查看变量、任务和任意Lua表达式的运行时值。您还可以使用窗口底部的代码栏来运行Lua表达式。
⑾使用多个数据库
使用单个对话数据库通常要容易得多。 但是,对话系统支持多个数据库。 您需要对多个数据库进行更多的管理,以跟踪它们,并在适当的时候装入和取出内存,但是它们对于分解您的内容非常有用,既可以用于组织,也可以用于减少在任何给定时间装入内存的内容的数量。
Deciding Between Single Or Multiple Databases 在单个或多个数据库之间进行选择这里有一些准则,以决定使用一个数据库或多个数据库:
- 一个包含1000个平均长度的对话的对话数据库大约需要15 MB的内存,相当于几个纹理文件。
- 如果你正在制作一个桌面游戏,15 MB应该不是问题。在这种情况下,使用多个数据库的唯一原因是为了您的组织利益。
- 如果您构建的是非常低端的移动设备,15 MB可能太多了,但最终这取决于您的规格和需求。
- 单个数据库比您愿意使用的内存预算大,或者您的数据库有许多不同的元素,您需要对其进行组织拆分。
Sync Assets From Another Database 从另一个数据库同步资产
如果你使用多个对话数据库,你可能想要在一个数据库中定义所有的角色,在另一个数据库中定义所有的任务,等等。 然后可以配置对话数据库,从这些数据库中提取元素。 为此,在选项卡的菜单中从DB中选择Sync。然后选择要同步元素的源数据库。 你可以添加更多的元素,但是请记住,与源数据库中相同ID的元素将被覆盖。 例如,假设你正在编写一款游戏,玩家带着一群伙伴从一个星球旅行到另一个星球。 您可以在源数据库中定义播放器和同伴角色。 然后,您可以为每个从这个源数据库同步的行星创建一个单独的数据库,并将特定的参与者添加到该行星。
Unique ID Tool 惟一的ID的工具
如果您只使用一个对话数据库,您可以跳过此页。 在内部,对话数据库中的每个元素(actor、item、conversation等)都有一个ID号。 在单个数据库中,对于每种类型的元素,这些id通常是惟一的。 但是,在一个数据库中使用的ID也可能在另一个数据库中使用。 如果在运行时加载两个数据库,则id将冲突。 对话系统不会知道你用给定的ID引用了哪个资产。 为了防止这种情况,使用唯一ID工具:Tools → Pixel Crushers → Dialogue System → Tools → Unique ID Tool. 只需添加希望保证惟一id的数据库,然后单击Process。如果您勾选详细日志记录,该工具将在控制台中记录所有ID号更改。