Unity2D对话系统 - 使用Ink标签设置名称、肖像和布局 | Unity + Ink教程
文章目录将如下所示:
目录
- 介绍 🌟
- NPC名称和头像的显示和管理 🎭
- Unity中对话系统的创建和布局管理 🎮
- 使用Ink进行对话编写和标记处理 📝
- 添加标签以设置对话框面板的显示名称 🏷️
- 使用标签更改头像和布局 🔄
- 处理对话中的布局切换 🎭
- 对话管理器中的角色模式设定 ❗
- 重置对话框开启时的默认值 ❄️
- 总结和建议 💡
介绍 🌟
在这个视频中,我将向大家展示一种在Unity中构建的简单但高效的方法,用于显示和管理NPC名称、头像和不同对话布局的对话系统。我们将建立一个系统,可以轻松地在对话的每一行中更改头像和名称,并且可以轻松地更改对话面板的布局。这个教程是我之前制作的有关对话系统和选择的教程的延续,但你不需要看过那个视频才能理解本教程。然而,我们将使用之前构建的对话系统作为本教程的起点。所以如果你刚开始尝试构建对话系统并需要一个起点,我强烈推荐你先查看那个视频,然后再回来看这个。另外,正如我之前提到的,我们将使用Ink来编写对话,Ink在我们管理NPC名称、头像和布局方面发挥了重要作用。我不会详细介绍Ink语法,但我们会保持简单。如果你有兴趣深入了解如何使用Ink编写对话,我将在视频描述中放置一个链接。
NPC名称和头像的显示和管理 🎭
我们可以使用标签(tags)来为任何对话行添加元数据。每个标签只是作为字符串在Unity中读取,所以我们可以根据自己的需求对其进行结构化。一个很好的方式是设置标签和键值对,其中键表示我们在C#代码中要执行的某个操作,值表示该操作使用的某些数据。这里的#
符号表示这是一个标签,speaker
是键,Bob
是值,用冒号分隔。我们可以将此标签作为字符串读入Unity,然后将其解析为键值对,并使用值执行该键的操作。这正是我们将要在设置对话框面板的显示名称时做的事情。类似地,我们还将使用标签来设置对话框面板的头像和布局。不过,在这些情况下,值将与我们在Unity中设置的动画状态的名称匹配。当我们在Ink中读取该标签时,我们可以播放该动画,从而改变头像或布局。
Unity中对话系统的创建和布局管理 🎮
在Unity中,我们最开始创建了一个Unity项目。该项目中已经安装了Unity Ink插件和TextMeshPro,我们稍后会使用它们。项目中有一个场景,其中包含两个NPC。当你走近其中一个时,可以按下一个按钮显示一些对话。对话本身是用附加到NPC上的对话触发器脚本中的Ink文件编写的。当与NPC交谈时,该NPC将Ink文件传递给名为对话管理器的单例类。对话管理器负责读取Ink文件,根据每一行的对话设定对话文本和选项。对于这个教程来说,对话管理器是我们将处理Ink标签的地方,在视频进程中,我会解释得更详细。此外,我提前准备了一些肖像艺术作品,你可以在项目的艺术目录中找到。
使用Ink进行对话编写和标记处理 📝
现在,我们将创建一个使用标签的新的Ink对话文件。为了本教程的目的,我们将将有两个角色:Dr.Green(一个绿色的矩形)和Ms.Yellow(一个黄色的矩形)。在项目的对话文件夹内,我们要新建一个Ink文件,名为DrGreen。然后双击它以在Inky中打开。我将编写一些简单的对话,其中Dr.Green将发表大部分台词。玩家将被给予一个选择,选择他们是快乐还是伤心,这将使Dr.Green感到快乐或伤心。然后,Ms.Yellow说了一句台词,声称Dr.Green实际上并不是一位医生,并且最后我们会使对话连续循环,只要玩家对最后一个问题回答是肯定的。
添加标签以设置对话框面板的显示名称 🏷️
接下来,让我们处理第一行对话中的标签,为此创建一个新的文件夹,在项目的动画文件夹中,命名为"组件"。创建一个新的动画控制器,命名为"重要?然后我们可以对它进行双击,以在Unity的动画编辑器中打开它。接下来,让我们将此动画拖动到场景层次结构中的对话框面板上,将其添加为组件。接下来,我们打开动画窗口,然后在"组件"文件夹中创建一个新的Animation,称为默认的。然后将其动画添加到动画编辑器中,以将其添加到动画中。确保你当前选择的是场景层次结构中的对话框面板,并且动画编辑器显示"默认"作为当前动画。然后,我们可以从艺术目录中将默认肖像拖放到动画中。
使用标签更改头像和布局 🔄
让我们思考一下在最开始时设置头像的情况。我将将头像设置为"Dr.Green neutral"。请记住,这里的值将是后面我们将在本教程中创建的动画的名称。当我们回答"happy"时,将头像设置为"Dr.Green happy",回答"sad"时,将头像设置为"Dr.Green sad"。在Ms.Yellow说话时,将头像切换到"Ms.Yellow neutral"。当然,在下一句台词中,我们将切换回"Dr.Green neutral"。至于布局,我们将为Dr.Green的所有对话使用一个布局,其中头像位于左侧。对于Ms.Yellow,头像将位于右侧。因此,在角色切换时,我们将使用@layout
标签,其中left
和right
对应于我们稍后将创建的动画名称。
处理对话中的布局切换 🎭
我们在Unity中创建了一个文件夹,名为"动画",用于存放不同布局动画。在该文件夹中,我们创建了一个名为"layout animator"的动画控制器。然后,我们创建了名为"Right"和"Left"的两个动画,并将它们拖放到动画控制器中。然后,我们点击场景层次结构中的对话框面板,将右侧动画选择为当前动画。然后,我们可以点击记录按钮,以记录布局更改时的以上位置值。值得注意的是,我们要确保为每个需要移动的游戏对象设置这些值,以便它们变为红色,表示已经录制。在对话中切换布局时,它们还会显示在动画窗口中作为关健帧。如果在录制右侧布局时出现任何问题,你可能需要检查一下参数是否正确。录制完成后,我们再次点击记录按钮,以停止录制。接下来,我们切换到左侧布局,然后重复相同的操作。最后,我们在对话管理器中对各个标签进行处理,就像我们在头像标签中所做的那样。在Unity中,别忘了将对话图像拖放到对话管理器的对话图像插槽中,监测右上的动画框内是否显示出当前所选的动画。现在,如果我们进入播放模式并与Dr. Green交谈,我们会看到头像根据Ink标签的设定而改变。这部分都按照预期工作。
对话管理器中的角色模式设定 ❗
你可能已经注意到,在对话结束后,如果我们与不使用标签的其他NPC交谈,一些信息会从先前的对话中保留下来。我们希望在对话刚开始时,将头像、说话者和布局的信息重置为默认值,这样标签信息就不会在NPC之间传递。回到对话管理器脚本,在"enterDialogMode"方法中,会在与任何NPC交谈开始时调用它,我们添加几行代码来将动画和显示名称文本重置为默认值。然后我们就有一个良好的指示,在缺少标签时和在NPC之间不必要地传递标签时有一个良好的指示。这样就结束了。
重置对话框开启时的默认值 ❄️
void EnterDialogMode()
{
// Reset animators to default states
portraitAnimator.Play("Default");
layoutAnimator.Play("Default");
// Reset display name text
displayNameText.text = "???"";
}
总结和建议 💡
在本教程中,我们学习了如何使用标签在Unity中显示和管理NPC名称、头像和不同对话布局。我们建立了一个系统,可以根据Ink文件中的标签轻松更改对话框的显示名称、头像和布局。我们还学习了如何使用Ink进行对话编写和标记处理。通过添加标签,我们能够根据需要为每一行对话设定相关操作的动画和布局。此外,我们还处理了对话中的布局切换,确保每个角色的对话都有正确的布局。最后,我们重置了对话框的默认值,以防止标签信息在不同NPC之间传递。希望本教程对你有所帮助,谢谢观看!
Resources: