7、动画序列
序列和对话条目
在对话系统中,每一行对话都可以绑定到一个过场动画序列——例如,播放动画、音频文件和/或移动摄像机。此序列在对话条目的序列字段中指定,如果对话条目的序列字段为空,则在对话管理器的默认序列中指定。 在进行对话时,对话系统将在对话序列的持续时间内显示对话条目的对话文本。例如,如果序列运行5秒,对话文本将作为副标题显示5秒。
如何编写序列
场景序列是用简单的基于文本的命令定义的,这使得它们非常紧凑,可以在编写对话时快速添加,甚至可以使用外部创作程序,如聊天映射器和articy:draft。 已经包含了一个很大的音序器命令库,您可以轻松地添加自己的命令。 内置音序器命令的完整列表在音序器命令引用中。 在大多数情况下,如果不想手动输入命令,就不需要这样做。 如果您不想在文本字符串中指定序列,您可以使用交互式编辑器(如Unity Timeline),并使用提供的Timeline() sequalizer命令简单地运行时间轴。
Using Camera Angles 使用相机的角度
您按顺序使用相机(x)命令时,它首先检查相机角度预置。如果它找到一个名称与x匹配的子对象,它将使用该子对象从摄像机角度预置的偏移量。然后,它将摄像机置于与角色相同的偏移位置。
示例:默认的相机角度预置有一个名为close - up的子组件,它大约是向上2个单元,向后1个单元。音序器命令相机(特写)将相机向上移动大约2个单位,向后移动1个单位,如下图所示:
默认的摄像机角度预置有另一个名为“Medium”的子组件,它向上2个单位,向后2个单位,这使得摄像机离角色稍微远一点。 要添加一个指向一个坐着的角色的摄像机角度,您可能会添加另一个子对象,它只向上1个单位,向后2个单位。 如果对话系统在摄像头角度预置中没有找到匹配的子对象,则在场景中寻找一个名为x的GameObject(游戏物体)。如果它找到一个,它就把它当作一个绝对的相机位置。它将摄像机移动到与GameObject(游戏物体)相同的位置并旋转。你可以添加空的GameObjects到场景中,指定绝对的摄像机位置。
Default Camera Angles 默认的相机角度
默认的相机角度预制包含这些角度:
Angle 角 | Description 描述 |
Closeup 特写镜头 | Front-on head shot 前面的头 |
Closeup Back 特写镜头back | Back of head 后面的头 |
Closeup Left 特写镜头左 | Left side of head 左面的头 |
Closeup Right 特写镜头右 | Right side of head 右面的头 |
Medium 中间 | Head and torso 头部和躯干 |
Medium Back 中间back | Back of head and torso 头和躯干的后部 |
Medium Left 中间左 | Left side of head and torso 头部和躯干的左侧 |
Medium Right 中间右 | Right side of head and torso 头部和躯干的右侧 |
Full 完整的 | Front-on body 前面的身体 |
Full Back 完整bakc | Back of body 后面的身体 |
Full Left 完整左 | Left side of body 身体左侧 |
Full Right 完整右 | Right side of body 身体右侧 |
Wide 宽 | Body with space (farther than Medium shots) 有空间的身体(比中景更远) |
OTS Left OTS左 | Over the left shoulder 左肩以上 |
OTS Right OTS右 | Over the right shoulder 右肩以上 |
Down 下来 | Looking down on the subject 看下面 |
Up 向上 | Looking up at the subject 抬头看 |
Camera Angle Editor 相机角度的编辑
您可以使用相机角度编辑器工具来帮助您创建相机角度预制组件。使用相机角度编辑器:
- 1.Select menu item Tools → Pixel Crushers → Dialogue System → Tools → Camera Angle Editor.
- 2.主题:在场景中分配一个角色。编辑器将在游戏视图中显示与该角色相关的摄像机角度。
- 3.相机角度收集:分配一个游戏对象。您可以从参考资料中的默认角度预置开始,也可以从头开始创建自己的角度预置。如果你指定一个预制件,你只能编辑现有的角度。要添加新的角度,你必须点击按钮来实例化预制的场景对象。
- 4.相机角度:从下拉菜单中选择相机角度。游戏视图将移动到所选择的摄像机角度的位置。要添加一个新的相机角度,点击弹出菜单旁边的“+”。
记住将你的新相机角度集合保存为一个预制的或者场景对象,这样你就可以将它分配给你的对话管理器的显示设置。
8、任务系统
任务通常是通过与npc对话来开始和完成的。对话系统提供了一个集成的任务系统,使得在对话和游戏过程中管理任务变得很容易。
Writing Quests 写作任务
使用对话编辑器的任务/条目部分来编写任务。
Quest Fields 探索领域任务
Field | Description 描述 |
Name 名字 | 对话数据库中任务的名称。如果Use Display Name 使用显示名称 is unticked, this name is also used in UIs. 未勾选此项,此名称也在ui中使用。 |
Use Display Name 使用显示名称 | 在UIs中使用不同于的名称Name 的名字 field. 字段。 |
Display Name 显示名称 | 如果Use Display Name 使用显示名称要在ui中使用的名称。 |
Use Groups 使用组 | 在用户界面中将任务分组。 |
Group 分组 | 如果Use Groups (被勾选)将这个任务分类的组。 |
State 状态 | 任务开始状态。 |
Trackable 可跟踪的 | 任务可以显示在屏幕上的任务跟踪HUD。玩家可以切换跟踪和关闭。 |
Track On Start 在开始跟踪 | W当任务激活时,立即在任务跟踪界面中显示它(跟踪被打开)。 |
Visible 可见 | 可选;如果为真,不要显示在任务日志窗口。 |
Abandonable | 玩家可以放弃任务。 |
Has Entries (Subtasks) 条目(子任务) | 任务有子任务。 |
Description 描述 | 任务的描述,在任务激活时显示在任务日志窗口中。 |
Success Description 成功的描述 | 当任务处于成功状态时显示的描述。如果空白描述显示。 |
Failure Description 故障描述 | 当任务处于失败状态时显示的描述。如果空白,Description 描述 is shown. 显示。 |
Entry # 输入# | (If (如果Has Entries 有项 项目的描述。 |
Entry # State | 输入#状态 条目的起始状态。 |
Markup Tags 标记标签
你可以在任务文本中使用像[var=varName]和[lua(code)]这样的标记。这经常被用在条目中来显示当前的任务计数器的值。
Localization 本地化
你可以在all fields部分或Template选项卡中定义所有文本字段的本地化版本,例如名称、显示名称、描述、条目#等。例如,要添加显示名称的法语版本,请添加字段显示名称fr。
Runtime States 运行时状态
对话编辑器的任务/条目部分显示对话数据库的设计时内容,而不是任务的运行时状态。要在播放期间查看运行时状态,请使用Watches选项卡。
Example Quest 任务演示
这是对话系统演示场景中的一个任务:
- 玩家可以切换任务界面跟踪(Trackable),跟踪开始(Track on Start)。
- 任务完成后会有不同的描述(成功描述)。
- 标记标记以显示当前计数,该计数保存在一个名为enemiesKilled的变量中。
Controlling Quests 控制任务
Controlling Quests in Conversations 在对话中控制任务您通常可以使用指向并单击Lua向导来检查和设置对话中的任务状态。Quest-Related Lua Functions Quest-Related Lua函数如果你想直接使用quest management Lua函数,可以总结如下:
Lua Function Lua函数 | Description 描述 | Example 例子 |
CurrentQuestState(questName) | Returns a quest state as "unassigned", "active", "success", or "failure" | CurrentQuestState("Kill 5 Rats") == "active" |
SetQuestState(questName, state) | Sets a quest state 设置任务状态 | SetQuestState("Kill 5 Rats", "success") |
CurrentQuestEntryState(questName, entryNum) | Returns a quest entry state 返回任务进入状态 | CurrentQuestEntryState("Escape", 2) == "active" |
SetQuestEntryState(questName, entryNum, state) | Sets a quest entry state 设置任务进入状态 | SetQuestEntryState("Escape", 2, "success") |
Quest Management Triggers 任务触发管理器你可以使用这些组件来控制任务:
- Increment On Destroy 在杀死或收集目标时,增加毁灭任务的指示物。
- Dialogue System Trigger 对话系统触发器-通用动作。
- Condition Observer 状态观察器——当条件为真时,监视条件并执行操作。
- Timeline Set Quest State playable时间轴设置任务状态可玩-控制时间轴上的任务。
- The general-purpose Trigger Event, Collision Event, Timed Event components are also useful for managing quests. 通用触发事件、冲突事件、定时事件组件对于管理任务也很有用。
Controlling Quests in Scripts 控制脚本中的任务QuestLog类提供了添加和删除任务、获取和设置它们的状态以及获取它们的描述的方法。这是一个静态类,因此你可以调用它的方法,而不必创建一个QuestLog对象。 注意,任务状态通常在对话中更新。在大多数情况下,您可能会在对话期间使用指向并单击Lua向导来设置任务状态,因此你可能永远不需要使用这个类中的许多方法。 如果你使用这些方法,你不必将空格和连字符转换为下划线(如关于表索引的重要说明中所述); QuestLog类将自动为你完成此任务。Quest
State Messages 任务状态信息当任务状态改变时,对话系统发送一个OnQuestStateChange消息。
Quest Management Example 任务管理的示例在上面的例子任务中,NPC Sergeant Graves在对话中给玩家一个kill任务:
在突出显示的节点中,使用指向并单击Lua向导设置了脚本字段。它做两件事:
- 设置任务激活。
- 设置警报变量,以便在对话结束时显示警报消息。
每个敌人有一个增量的摧毁组件,增加一个变量命名为敌人被杀。
组件的OnIncrement()事件也运行OnUse方法的对话系统触发器的游戏对象名为敌人:
多人任务
如何在多人游戏中管理任务很大程度上取决于游戏的设计。 在许多情况下,你可以在每个客户端为每个玩家维护对话系统环境(包括任务)。 但是,如果您使用的是权威的主服务器,比如MMO,您可能希望在主服务器上验证任务状态,以防止作弊。为此,将覆盖方法分配给这些委托:
- QuestLog.SetQuestStateOverride
- QuestLog.CurrentQuestStateOverride
在SetQuestStateOverride方法中,联系主服务器以确认允许玩家设置请求的状态。如果是,调用QuestLog.DefaultSetQuestState(),它将在本地设置quest状态,更新跟踪器,并通知侦听器。
在CurrentQuestStateOverride方法中,联系主服务器以确认玩家的权威任务状态。此方法的使用可能比SetQuestStateOverride更复杂。与主服务器的通信通常是异步的;您的override方法可能无法立即返回quest状态,因为它需要等待来自主服务器的响应。相反,您的方法可以返回一个异步操作的字符串引用。然后,调用CurrentQuestState()的代码可以等待异步操作完成并从响应中检索quest状态,而不是立即使用override方法的返回值作为quest状态。 任务状态经常在对话中被检查和设置。当使用不立即返回值的异步重写方法时,您可能希望配置对话条目的序列,以等待表明异步方法已完成的排序器消息。在对话项中,使用WaitForMessage()排序器命令等待排序器消息。在异步方法中,使用sequencer . message()方法来发送排序器消息。如果对话项被配置为等待一个任务状态(即任务状态)。,您已经设置了CurrentQuestStateOverride),您可以注册一个额外的Lua函数,您可以在下一个对话条目中使用该函数来返回从主服务器接收到的值。
如果你的任务使用任务条目(子任务),你也可以设置这些覆盖:
- QuestLog.SetQuestEntryStateOverride
- QuestLog.CurrentQuestEntryStateOverride
任务界面
Quest Log Window 任务日志窗口
任务日志窗口显示了玩家的活动任务和完成任务的详细信息。设置任务日志窗口的推荐方法是使用标准的UI任务日志窗口组件。
** 标准的UI任务日志窗口** 标准的UI任务日志窗口管理上面屏幕截图中显示的UI元素。这些元素是:
- 主面板:控制在显示活动任务和完成任务之间的切换。
- 选择面板:显示任务标题,可选的包含在组文件夹中。玩家可以切换跟踪或者选择一个任务来查看它的细节。
- 细节面板:显示当前选择的任务的细节。
所有的UI元素都可以重新定位和调整。
设置任务日志窗口最简单的方法是使用Prefabs ► Standard UI Prefabs ► Basic这个预制组件被分配给对话管理器预制组件的实例化预制组件,这意味着它将在对话管理器的画布下自动实例化。
标准的用户界面任务日志窗口组件有以下属性:
HUD任务系统
任务指标
你可以使用任务指示来告诉玩家NPC有任务信息。
设置任务指示:
- 添加指示游戏对象到NPC。例如,添加一个带有一个或多个图像的Unity UI world space canvas,例如一个问号表示有新的任务可用,一个感叹号表示NPC有任务更新。在DemoScene2场景中,NPC中士Graves有一个任务指示画布。
- 添加一个Quest State Indicator 任务状态指示器给NPC这允许您将gameobject(游戏物体)(如world space canvas图像)与数字指示符级别相关联。关于格雷夫斯中士,指标是:
Level 0: nothing 0级:没有 Level 1: question mark 第一级:问号 Level 2: exclamation mark 二级:感叹号
- 向NPC添加一个任务状态监听组件。当任务状态发生变化时,该组件会更新任务状态指示器的当前指示器级别,并通过UnityEvent(可以在检查器中连接)可选地做其他事情。若要配置任务状态监听器,请将元素添加到任务状态指示器级别折叠中。在每个元素中,指定一个任务状态和与任务状态相关联的指示符级别。任务进入状态也有相应的折页。最高指示级别总是优先级。如果你的NPC涉及多个任务,你可以添加多个任务状态监听器。
9、保存系统
对话系统采用Pixel Crushers Common Library’s的保存系统。 在演示场景中配置了Save系统组件。对话管理器有一个保存系统组件和一些与保存系统组件相关的组件:
演示菜单调用静态脚本方法SaveSystem.SaveToSlot()来保存游戏,调用SaveSystem.LoadFromSlot()来加载游戏。
保存系统设置
- 1.在场景中添加一个保存系统组件——例如在演示场景中的对话管理器上。Save System组件将使GameObject作为一个持久的单例对象,这意味着它在场景更改后仍然存在,并且通常只有一个实例。
- 2.添加对话系统保护程序。此组件将对话系统的数据发送到保存系统。
- 3.添加一个Json数据序列化器组件。该组件将二进制保存的游戏数据转换为可保存的格式—在本例中是JSON文本。如果您想要使用不同的序列化器,您可以添加您自己的DataSerializer类的实现。
- 4.添加一个Player Prefs保存的游戏数据存储器或磁盘保存的游戏存储器组件。此组件将序列化的数据写入持久存储(如PlayerPrefs或加密的本地磁盘文件)。所有平台都支持Player Prefs保存的游戏数据存储。在独立的构建中支持磁盘保存的游戏存储程序。如果您想以不同的方式存储游戏,您可以添加自己的SavedGameDataStorer类的实现。
- 5.可选地添加一个标准的场景转换管理器。该组件可以在改变场景时加载中间加载屏幕场景和/或播放淡入淡出等动画。在演示场景中,转换管理器被配置为在场景更改期间淡入黑色。更多信息,请参见场景转换管理器。
保存组件设置
添加这些组件到任何游戏对象的状态,你想要保存:
Component 组件 | Function 函数 |
Active Saver | 保存游戏对象的活动/非活动状态。如果GameObject开始不活动,将此组件添加到保证为活动的不同GameObject中,并分配目标GameObject。 |
Multi Active Saver r | 保存多个游戏对象的活动/非活动状态。 |
Animator Saverr | 保存GameObject 's animator的状态。 |
Destructible Saver r | 保存时,游戏对象已被销毁或禁用。下一次加载游戏或场景时,如果GameObject之前已经被销毁/禁用,这个脚本将再次销毁/停用它。如果指定了预制件,它还会产生一个被破坏的替换版本。 |
Enabled Saver r | 保存组件的启用/禁用状态。如果GameObject启动为非活动状态,则将此组件添加到保证为活动的不同GameObject中,并分配目标组件。 |
Position Saver r | 保存游戏对象的位置和旋转。 |
保存和加载
要从脚本中保存和加载游戏,请使用静态方法pixelcrusher . savesystem。SaveGameToSlot PixelCrushers.SaveSystem.LoadGameFromSlot。
保存系统的方法
要在不使用脚本的情况下访问Save系统方法,例如在一个UI按钮的OnClick()事件中,添加一个Save系统方法组件,并配置UI按钮来调用组件的SaveSlot和LoadFromSlot方法。
检查点保存
关卡保存是当玩家进入时自动保存游戏的触发区域。设置一个检查点保存:
- 1.创建一个游戏对象,并添加一个触发器碰撞器。(至少有一个对象,即玩家或触发器,可能需要一个刚体来记录触发冲突。)
- 2.添加保存系统方法组件。
- 3.添加一个Trigger Event 触发事件 组件
-- 将标签蒙版设置为适当的蒙版,例如Player。 -- 配置On Trigger Enter事件来调用SaveSystemMethods。保存你想要使用的游戏插槽号。 -- 你可能还想在触发器中禁用GameObject(游戏物体),这样它就不会重新触发。
自动保存和加载
手机游戏通常在玩家关闭游戏时自动保存,在玩家重新开始游戏时自动加载。要将此行为添加到您的游戏,添加一个自动保存加载组件到保存系统:
- 1.启动时勾选加载,启动时加载保存的游戏(如果存在),退出时勾选保存,退出时保存游戏。
- 2.当玩家暂停/最小化游戏时,勾选Save On Pause来保存游戏。这样,如果玩家暂停应用程序并杀死它,游戏将被正确保存,而不是在应用程序本身中正常退出。
- 3.当应用程序失去焦点时,勾选Save On Lose Focus来保存游戏。
改变场景
使用LoadLevel()序列器命令
要使用对话系统感知更改场景,请使用LoadLevel()排序器命令。 或者,在c#中使用SaveSystem.LoadScene(),或者将UnityEvents连接到SaveSystemMethods.LoadScene。
场景过渡管理
要播放动画,并/或显示加载场景,而加载下一个实际的场景,添加一个标准的场景转换管理器到您的保存系统:
如果有场景转换管理器,保存系统将:
- 1.设置离开场景转换的动画器触发器(如果指定)。
- 2.加载加载场景(如果指定)。
- 3.异步加载下一个实际场景。
- 4.在实际场景加载后,设置进入场景转换的触发器(如果指定)。
生成对象
对话系统有一个生成的对象管理器,它可以跟踪在运行时实例化到场景中的对象,并将它们包含在已保存的游戏中。当你加载一个游戏时,它会重新实例化对象。
这是配置过程的概述:
- 1.将生成的对象组件添加到对象预置中。
- 2.将生成的对象管理器添加到场景中,并将对象预置分配给它。
创建生成对象预制
将派生的对象组件添加到将被实例化的预制组件中。重复所有可以在你想要保存的游戏场景中实例化的项目。
创建衍生对象管理器
创建一个空的GameObject并添加一个衍生对象管理器组件,如下所示。每个场景都应该有自己的派生对象管理器。
将场景中可以创建的所有衍生对象预制块添加到衍生对象预制块列表中。如果列表中缺少预制组件,那么在加载游戏或返回场景时,派生的对象管理器将无法重新派生它。在上面的示例屏幕快照中,一个名为“pickup_sniper_”的预制组件被添加到列表中。
保存系统概述流程图
下图概述了保存系统与对话系统的工作原理:
加载的过程是自下往上的。 当改变场景时,除了不使用保存的游戏数据存储器外,整个过程是一样的。保存系统只是将保存的数据保存在内存中,并将其应用到新加载的场景中。保存系统在改变场景时执行以下步骤:
- 1.告诉当前场景中的所有保护程序组件保存它们的状态。
- 2.告诉所有的保护程序组件,他们将被卸载,所以如果他们更新一个计数器销毁时,他们应该忽略它这一次。
- 3.如果有场景转换管理器,则播放“离开当前场景”转换(例如,淡出或加载加载屏幕场景)。
- 4.加载下一个场景异步。
- 5.如果有场景转换管理器,则播放“进入新场景”转换(例如,淡入)。
- 6.告诉新场景中的所有保护程序组件从保存的数据更新它们的状态。
10、本地化
对话系统支持对话数据库的语言本地化,并提供通用文本表。 当您从默认设置更改语言时,对话系统将使用包含指定语言本地化版本的字段中的文本。 对话系统支持Inter-Illusion的I2定位。如果您使用I2本地化,您可能想要使用对话系统的I2本地化支持支持。
语言代码
于每种本地化语言,您都将使用一种语言代码。代码由您决定,但是一个好的选择是ISO 639-1标准:en.wikipedia.org/wiki/List_o…
Example language codes are: 示例语言代码如下:
Code 代码 | Language 语言 |
es | Spanish 西班牙语 |
ru | Russian 俄罗斯 |
fr-CA | French (Canadian) 法语(加拿大) |
可本地化的对话数据库字段
通过在字段名中添加空格和语言代码,所有字段都是可本地化的。唯一的例外是对话文本字段。对于对话文本,单独使用语言代码。将本地化字段的类型设置为本地化。 下面的字段是要本地化的常见字段。如果没有为当前语言定义本地化字段名,它将使用默认字段。
常见本地化的对话输入字段
对于每种语言LN,对话输入字段的名称为:
Default Field | Localized Field | Example |
Dialogue Text | LN | es |
Menu Text | Menu Text LN | Menu Text es |
Sequence | Sequence LN | Sequence es |
Response Menu Sequence | Response Menu Sequence LN | Response Menu Sequence es |
探索领域
对于每种语言LN,任务域的名字是:
Default Field | Localized Field | Example |
Name | Name LN | Name es |
Description | Description LN | Description es |
Success Description | Success Description LN | Success Description es |
Failure Description | Failure Description LN | Failure Description es |
Entry # | Entry # LN | Entry 3 es |
在Lua代码中,可以使用GetLocalizedText()函数来获取字段的本地化版本,这在对话输入脚本或条件字段或使用[Lua (code)]标记标记时非常有用。
如何在对话编辑器中本地化
使用对话编辑器进行本地化的最简单方法是向template选项卡上的模板添加本地化字段。这样,当您添加它们时,它们将自动添加到资产中。 按照下面的说明将本地化添加到对话数据库中。
如何本地化对话
这些步骤演示了如何将西班牙语(es)和俄语(ru)添加到对话中。
- 1.在“模板”选项卡上展开Dialogue Entries 对话记录 foldout. 折页。
单击与对话条目标题相同的行上的+以添加字段。 在标题中,输入语言代码。 设置Type 类型Localization
选择 Menu → Apply Template to Assets,将更改应用于所有现有的对话项。
- 在Conversations选项卡上,检查对话条目节点。
将翻译添加到本地化字段:
如何本地化任务
这些步骤演示了如何将西班牙语(es)和俄语(ru)添加到任务中。
- 1.在“模板”选项卡上展开Quests 任务 foldout. 折页。
在任务标题的同一行点击+来添加一个字段。 在Title 标题后跟空格和语言代码。 设置Type 类型 为Localization
- 在任务选项卡上,检查一个任务。
把你的翻译添加到任务中:
对话编辑器本地化导出/导入折叠
导入格式的本地化
11、脚本编写
源代码的概述
Namespaces 名称空间
所有对话系统源代码都包含在名称空间 PixelCrushers.DialogueSystem. namespace. PixelCrushers公共库源代码在PixelCrushers名称空间中。 Language.Lua包含在名称空间中。
代码概述: 对话系统采用模型-视图-控制器(MVC)架构: MVC| Description 描述 -|-|- Model 模型| 对话数据库、Lua和活动对话的状态。 View 视图| 对话UI和过场音序器。 Controller 控制器| 在模型和视图之间进行中介。
常用的方法
DialogueManager ClassPixelCrushers.DialogueSystem.DialogueManager.Bark:
DialogueManager.Bark("Converation With Bark Lines", barker.transform); 复制代码
PixelCrushers.DialogueSystem.DialogueManager.BarkString:
DialogueManager.BarkString("I'm barking this text.", barker.transform); 复制代码
PixelCrushers.DialogueSystem.DialogueManager.GetLocalizedText:
DialogueManager.SetLanguage("fr");string frenchForCheese = DialogueManager.GetLocalizedText("cheese"); 复制代码
PixelCrushers.DialogueSystem.DialogueManager.PlaySequence:
DialogueManager.PlaySequence("Fade(in,2); Audio(Tada)@2"); 复制代码
PixelCrushers.DialogueSystem.DialogueManager.SendUpdateTracker:
DialogueManager.SendUpdateTracker(); // Manually refresh quest tracker HUD & quest log window displays. 复制代码
PixelCrushers.DialogueSystem.DialogueManager.ShowAlert:
DialogueManager.ShowAlert("This is an alert."); 复制代码
PixelCrushers.DialogueSystem.DialogueManager.StartConversation:
DialogueManager.StartConversation("Some Conversation", actor.transform, conversant.transform); 复制代码
PixelCrushers.DialogueSystem.DialogueManager.StopConversation:
DialogueManager.StopConversation(); 复制代码
DialogueLua Class
PixelCrushers.DialogueSystem.DialogueLua.GetVariable:
string s = DialogueLua.GetVariable("favoriteColor").asString; 复制代码
PixelCrushers.DialogueSystem.DialogueLua.SetVariable:
DialogueLua.SetVariable("favoriteColor", "blue"); 复制代码
QuestLog Class
PixelCrushers.DialogueSystem.QuestLog.GetQuestState:
QuestState state = QuestLog.GetQuestState("The Holy Grail"); 复制代码
PixelCrushers.DialogueSystem.QuestLog.SetQuestState:
QuestLog.SetQuestState("The Holy Grail", QuestState.Active); 复制代码
PixelCrushers.DialogueSystem.QuestLog.GetAllQuests:
string[] quests = QuestLog.GetAllQuests() 复制代码
SaveSystem Class
PixelCrushers.SaveSystem.SaveToSlot:
SaveSystem.SaveToSlot(1); 复制代码
PixelCrushers.SaveSystem.LoadFromSlot:
SaveSystem.LoadFromSlot(1); 复制代码
PixelCrushers.SaveSystem.LoadScene:
SaveSystem.LoadScene("Tavern@Entryway"); // Load Tavern scene, move player to position of Entryway GameObject. 复制代码
对话系统Attributes
ConversationPopup Attribute ConversationPopup属性
使用[ConversationPopup]属性将字符串转换为conversation popup。它有一个可选的bool参数来显示数据库选择字段。
using UnityEngine; using PixelCrushers.DialogueSystem; public class MyClass : MonoBehaviour { [ConversationPopup] public string conversation; // Shown without database selection field. [ConversationPopup(true)] public string conversation2; // Shown WITH database selection field. } 复制代码
QuestPopup Attribute QuestPopup属性
在你的类定义中使用[QuestPopup]属性将一个字符串转换成一个quest popup。它有一个可选的bool参数来显示数据库选择字段。
using UnityEngine; using PixelCrushers.DialogueSystem; public class MyClass : MonoBehaviour { [QuestPopup] public string questName; // Shown without database selection field. [QuestPopup(true)] public string questName2; // Shown WITH a database selection field. } 复制代码
QuestEntryPopup Attribute QuestEntryPopup属性
在你的类定义中使用[QuestEntryPopup]属性将一个int类型转换成一个任务条目弹出。注意:只有当您的脚本中有一个名为'quest'、'questTitle'、'questName'、'quest'、'questTitle'或'questName'的字符串变量时,这个属性才会起作用。这就是任务条目弹出窗口知道显示哪个任务条目的方式。
using UnityEngine; using PixelCrushers.DialogueSystem; public class MyClass : MonoBehaviour { [QuestPopup] public string questName; [QuestEntryPopup)] public string questName2; // Shows a popup with the entries defined in the quest named by questName. } 复制代码
12、导入&导出
对话系统可以导入和导出几种格式:
导入格式
- articy:draft
- Aurora Toolset
- Chat Mapper
- CSV
- Ink
- TalkIt
- Twine
- Importing Your Own Formats
导出格式
- 导出XML到聊天映射器
- 导出到逗号分隔值(CSV)
- 导出画外音脚本
- 导出语言文本Text
导入自己的格式
. 要导入不同的格式,请复制Templates►Scripts►ConverterWindowTemplate.cs
导出其他的格式
对话编辑器的数据库选项卡有一个导出文件夹,允许您以这些格式导出对话数据库数据:
- XML
- CSV
- Voiceover Script
- Text
13、组件参考
Always Face Camera
Component > Pixel Crushers > Dialogue System > Actor > Always Face Camera 始终面对摄像机使游戏对象始终面对主摄像机。
属性
属性 | 功能 |
YAxis | 只能在y轴上转动。 |
Rotate 180 | 如果对象是面向后的,则勾选。 |
Bark Group Member
Component > Pixel Crushers > Dialogue System > Actor > Bark Group Member 对话组成员将GameObject配置为对话组的成员。当一个组的一个成员对话,其他成员将隐藏任何活动的对话
属性
属性 | 功能 |
Group Id | 指定组的字符串或Lua表达式 |
Evaluate Id Every Bark | 勾选以重新评估成员ID。 |
Forced Hide Delay | 当隐藏一个活动的对话,等待的时间量之前,实际上隐藏它。 |
#### Bark On Idle | |
Component > Pixel Crushers > Dialogue System > Trigger > Bark On Idle | |
在空闲时对话,每隔一段时间就自动对话一次。 | |
网络异常,图片无法展示
|
|
Cinemachine Priority On Dialogue Event
Component > Pixel Crushers > Dialogue System > Trigger > On Dialogue Event > Cinemachine Priority On Dialogue Event 当对话事件发生时,设置Cinemachine虚拟摄像机的优先级。
Condition Observer
Component > Pixel Crushers > Dialogue System > Trigger > Condition Observer 条件观察器以常规频率检查条件,并在条件为真时运行操作。
Conversation Logger
Component > Pixel Crushers > Dialogue System > Misc > Conversation Logger 将对话活动记录到控制台。
Default Camera Angle
Component > Pixel Crushers > Dialogue System > Actor > Default Camera Angle 设置演员的默认摄像机角度。
Dialogue Actor
Component > Pixel Crushers > Dialogue System > Actor > Dialogue Actor 可选组件,允许您将GameObject与actor相关联,并配置它在UIs中的显示方式。
Dialogue System Events
Component > Pixel Crushers > Dialogue System > Miscellaneous > Dialogue System Events 将对话系统事件统一显示。
Dialogue System Controller
Component > Pixel Crushers > Dialogue System > Misc > Dialogue System Controller 这是主要的对话系统组件,在对话管理器一节中有详细的描述。
Dialogue System Trigger
Component > Pixel Crushers Dialogue System > Trigger > Dialogue System Trigger 当触发事件发生时,对话系统触发器组件可以执行许多对话系统操作。
Extra Databases
Component > Pixel Crushers > Dialogue System > Misc > Extra Databases 在运行时环境中添加和删除额外的数据库。
Increment On Destroy
Component > Pixel Crushers > Dialogue System > Actor > Increment On Destroy 当游戏对象被销毁或禁用时,Lua变量的销毁增量。
Lua Console
Lua控制台提供了一个游戏内接口,您可以在其中运行Lua命令。
Override Dialogue UI
Component > Pixel Crushers > Dialogue System > UI > Override > Override Dialogue UI 覆盖对话管理器的对话UI,用于涉及GameObject(游戏对象)的对话。
Override Display Settings
Component > Pixel Crushers > Dialogue System > UI > Override > Override Display Settings 覆盖对话管理器对涉及此游戏对象的对话的显示设置。
Proximity Selector
Component > Pixel Crushers > Dialogue System > Actor > Player > Proximity Selector 接近选择器为玩家提供了一个界面来瞄准“usables”并通过输入他们的触发区域向他们发送“OnUse”消息。
Range Trigger
Component > Pixel Crushers > Dialogue System > Actor > Range Trigger 距离触发只在玩家处于触发区域时激活游戏对象和/或组件。
Selector
Component > Pixel Crushers > Dialogue System > Actor > Player > Selector 选择器为玩家提供了一个接口来定位可用的组件并向它们发送OnUse消息。
Selector Use Standard UI Elements
Component > Pixel Crushers > Dialogue System > UI > Standard UI > Selection > Selector Use Standard UI Elements 修改选择器或接近选择器以使用标准的UI选择器元素。
Sequencer Shortcuts
Component > Pixel Crushers > Dialogue System > Misc > Sequencer Shortcuts 为排序器命令定义别名。
Standard Bark UI
Component > Pixel Crushers > Dialogue System > UI > Standard UI > Bark > Standard Bark UI 使用对话系统的标准UI系统显示对话。
Standard Dialogue UI
Component > Pixel Crushers > Dialogue System > UI > Standard UI > Dialogue > Standard Dialogue UI 使用对话系统的标准UI系统管理对话UI。
Standard UI Menu Panel
Component > Pixel Crushers > Dialogue System > UI > Standard UI > Dialogue > Standard UI Menu Panel 放置在将由标准对话UI使用的菜单面板上。
Standard UI Quest Log Window
Component > Pixel Crushers > Dialogue System > UI > Standard UI > Quest > Standard UI Quest Log Window 使用对话系统的标准UI系统管理一个任务日志窗口。
Standard UI Quest Tracker
Component > Pixel Crushers > Dialogue System > UI > Standard UI > Quest > Standard UI Quest Tracker 使用对话系统的标准UI系统管理一个任务跟踪界面。
Standard UI Subtitle Panel
Component > Pixel Crushers > Dialogue System > UI > Standard UI > Dialogue > Standard UI Subtitle Panel 放置在将被标准对话UI使用的字幕面板上。
Timeline Trigger
Component > Pixel Crushers > Dialogue System > Trigger > Timeline Trigger 当指定事件发生时触发时间线(可播放的控制器)。
Usable
Component > Pixel Crushers > Dialogue System > Actor > Usable 指定GameObject(游戏对象)是可用的——也就是说,玩家可以瞄准它并发送OnUse消息。
四、案例演示
案例一、简单对话
步骤: 1.步骤1.创建一个新场景(File → New Scene).
步骤2.拖动预制体 Dialogue Manager进入场景:
步骤3.建立一个对话数据库,单击Create:
步骤4.在为数据库指定好路径以及名字之后,再次打开“对话编辑器”窗口:
步骤5.单击Conversations标签,单击“+”按钮添加新会话。
步骤6.新建两个对话节点
步骤7.在节点的Inspector面板,分别设置Dialogue Text为“Hello.”,"Goodbye."
步骤8.创建一个空游戏对象重命名为“Player”,创建一个Cube命名为NPC将空游戏对象。
步骤9,点击NPC。加一个对话系统触发器:
步骤10.单击Add Action并选择Start Conversation:
步骤11.从Conversation下拉,指定Conversation字段为New Conversation 1,并将Player分配给Conversation Actor,NPC分配给Conversation Conversant.
步骤12.最后,设置Trigger为On Start。这告诉对话系统触发器在场景开始时执行其操作。
第13步,现在开始你的第一次对话。
步骤14.现在加入交互。点击NPC,找到Dialogue System Trigger组件。设置Trigger为On Use。对话系统触发器在接收OnUse消息时执行其操作
步骤15.为NPC添加Usable组件。这是交互组件,说明NPC可被点击的最大距离是30
步骤16.点击Player对象并添加一个Selector组件。设置Select At为Mouse Position:
步骤17.现在再启动场景。将鼠标放置在立方体上,以便看到以下黄色消息:
这意味着玩家的选择器组件已经检测到NPC的可用组件。现在按空格键或鼠标右键。
Selector组件将向NPC发送OnUse消息,NPC的对话系统触发器将通过启动会话来响应。
步骤18.控制Selector组件在会话期间保持活动状态,添加一个Dialogue System Events组件:
源工程:download.csdn.net/download/q7…
案例二、《功夫》中经典对话
步骤1.创建对话数据库,输入台词
步骤2.在项目中找到Dialogue Manager、Player、Private Hart、Room预制体,拖入到场景中:
步骤3.指定对话数据库到你新建的数据库 Player:
Private Hart:
步骤4.更改Dialogue System的对话皮肤:
直接找到这个预制体拖入卡槽中就行:
Basic Standard UI Selector Elements.prefab
步骤5.运行一下试试吧
源工程下载: