3、对话管理器
对话管理器预制体
对话管理器协调运行时活动并维护包含对话系统运行时数据的Lua环境。添加对话管理器,拖动预制Assets ► Plugins ► Pixel Crushers ► Dialogue System ► Prefabs ► Dialogue Manager
对话管理器的默认设置使其在场景更改时保持不变,并确保场景中只存在一个副本。 您通常会使用一个对话管理器,添加到您的主菜单场景。 你可以在你的外景场景中放置其他对话管理器,这样你就可以在不需要从主场景中进入的情况下测试它们。 但是请记住,在正常的游戏中,主场景中的对话管理器将会执行并摧毁你的位置场景中的“test”对话管理器。
Dialogue System Controller 对话系统控制器
对话系统控制器组件保存对话系统的设置。Initial Database 最初的数据库对话管理器在对话数据库启动时加载该对话数据库。Display Settings 显示设置
显示设置部分包含以下子部分:
- 本地化设置:控制如何处理语言本地化。
- 字幕设置:控制对话UI显示字幕的方式。
- 相机和过场设置:控制过场音序器的工作方式。
- 输入设置:控制玩家响应菜单在对话中的工作方式。
- 警告设置:控制对话UI在屏幕上显示警告消息的方式。
Persistent Data Settings 持久数据设置
持久数据设置部分允许您指定哪些数据包含在已保存的游戏中,以及在场景更改时保存哪些数据。
Other Settings 其他设置
其他设置部分包含其他设置。值得注意的是:
- 实例化数据库:加载对话数据库的副本,而不是直接在Unity编辑器的playmode中使用该资产。
- Dialogue Time Mode 对话的时间模式:默认情况下,对话系统运行Realtime 实时模式,如果你想使用时间刻度,设置对话时间模式GamePlay
- 调试级别:在Unity编辑器的控制台中设置对话系统的日志级别,在构建中设置播放器日志文件。这对于通过对话系统活动进行跟踪非常方便。
Instantiate Prefabs组件实例化预制块:将基本的UI预制块实例化到对话管理器的画布中。 这些包括选择器元素(参见触发器和交互),以及任务跟踪HUD和任务日志窗口(参见任务)。 你可以分配不同的预制组件来定制游戏的外观。
Input Device Manager组件输入设备管理器:检测鼠标、操纵杆和键盘控件之间的切换,并帮助UI知道何时自动对焦UI按钮(在操纵杆和键盘模式下),何时不对焦按钮(在鼠标模式下)。
4、触发与交互
本节讲一下如何交互
Dialogue System Trigger对话系统Trigger
对话系统触发组件有三个主要部分:
- 触发Trigger:导致对话系统触发的事件。
- 条件Conditions:对话系统触发执行其动作时必须为真的状态。
- 动作Actions:触发器应该做的事情,比如开始对话或设置任务状态。
Trigger可以设置触发器下拉到这些值:
Trigger触发 | 描述 |
On Use 在使用 | 玩家的选择器或接近选择器向GameObject发送一个OnUse消息,或在UnityEvent或脚本中手动调用对话系统触发器的OnUse()方法。 |
On Start 在开始 | 组件启动(例如,在场景启动时)。 |
On Enable 在启用 | 组件已启用。 |
On Disable 在禁用 | 组件被禁用。 |
On Destroy 在摧毁 | 组件被破坏了。 |
On Trigger Enter 在触发输入 | 组件已启用。 |
On Enable 在启用 | 该组件收到了一条OnTriggerEnter消息。要使用这个触发器,组件的GameObject应该有一个触发器碰撞器。你可能需要设置Conditions → Accepted Tags将此触发器限制为带有特定标记(如)的GameObjects Player 。 |
On Trigger Exit 在触发退出 | 组件收到一个OnTriggerExit消息。 |
On Collision Enter 在碰撞输入 | 组件收到了一条OnCollisionEnter消息。 |
On Collision Exit 在碰撞退出 | 组件收到一个OnCollisionExit消息。 |
On Bark Start 在bark上开始 | GameObject开始玩bark游戏(一次性的对白)。 |
On Bark End 在bark结束 | GameObject(游戏物体)完成了对bark的游戏。 |
On Conversation Start 在对话开始 | GameObject只是作为对话的主要参与者。 |
On Conversation End 在谈话结束 | GameObject刚刚结束了对话。 |
On Sequence Start 在序列开始 | GameObject只是作为过场动画序列的主要参与者而开始的。除非您勾选了对话管理器中的对话序列,否则不会调用此事件Subtitle Settings → Inform Sequence Start And End |
On Sequence End 在序列结束 | 刚刚结束了一个序列。 |
Conditions 条件
条件类型 | 描述 |
Lua Conditions Lua的条件 | Lua表达式,例如检查变量的值。 |
Quest Conditions 任务条件 | 需要探索。 |
Accepted Tags 接受标签 | 对于OnCollision和OnTrigger事件,另一个GameObject必须有这些标签中的一个。如果接受的标签是空的,所有的游戏对象都是允许的。 |
Accepted GameObjects 接受对象 | 对于OnCollision和OnTrigger事件,另一个GameObject必须在这个列表中。如果接受的gameobject是空的,那么所有的gameobject都是允许的。 |
Action行动
Action行动 | 描述 |
Set Quest State 设置任务状态 | 设置任务和/或任务进入状态 |
Run Lua Code 运行Lua代码 | 运行Lua表达式。 |
Play Sequence 播放顺序 | 播放过场动画 |
Show Alert 显示警报 | 通过对话UI显示警告消息。 |
Send Messages 发送消息 | 使用Unity的SendMessage()方法将消息发送到目标。 |
Start Conversation 开始谈话 | 开始一个对话。 |
Set GameObjects Active/Inactive 设置GameObjects活动/活动 | 在整个游戏对象上工作。 |
Set Components Enabled/Disabled 设置启用/禁用组件 | 工作在游戏对象的特定组件。 |
Set Animator States 设置动画状态 | 在GameObjects上设置animator状态。当对话开始时对空闲字符有用。 |
OnExecute() UnityEvent | 允许您使用UnityEvent指定其他操作。 |
Selectors & Usables 选择器和可用
对话系统提供了一个可选的交互系统,可以与带有可用组件的游戏对象(如npc)进行交互。你可以添加两个组件到播放器:
Selector 选择器
选择器组件通过从指定位置(如鼠标位置或屏幕中心)进行光线投射来检测可用项。当玩家按下use按钮时,它会向用户发送一个OnUse消息。
Proximity Selector 距离选择器
接近选择器组件在输入触发器碰撞器时检测可用项。当玩家按下use按钮时,它会向用户发送一个OnUse消息。
OnUse Message 消息
当玩家瞄准一个可用的并按下使用键或使用按钮时,选择器将发送一个OnUse(转换播放器)消息到可用的游戏对象。 对话系统的触发器(如对话系统触发器)响应此消息。 您自己的脚本也可以通过添加OnUse方法来响应这条消息,例如:
void OnUse(Transform player) { Debug.Log("I'm being used by " + player); } 复制代码
5、对话UI
Dialogue UI
本章解释了如何建立对话用户界面和用户界面。 对话系统使用对话ui来显示交互式对话和屏幕上的警报消息。 您可以通过添加一个对话参与者组件来定制每个参与者在ui中的显示方式。
Standard Dialogue UI 标准对话界面
标准对话UI是一组组件,用于管理上面屏幕快照中显示的UI元素。这些元素是:
- 警告面板:显示警告消息。
- 字幕面板:显示演员的对话文本。
- 响应菜单:显示玩家可以选择的响应。
- 计时器:如果对话管理器配置为定时响应菜单,则显示倒计时。
- 文本输入:从播放器中读取文本输入。
所有的UI元素都可以重新定位和调整。
Standard Dialogue UI Prefabs 标准对话UI预制件最简单的方法是为对话管理器的对话UI字段分配一个预制块。位于Prefabs ► Standard UI Prefabs模板为:
- Basic:上面显示的默认UI。
- Bubble:显示字幕面板和响应菜单的卡通气泡上方的角色
- Focus:每行的说话者淡出,而另一个行动者淡出到50%的透明度。
- Letterbox:电影风格的字幕,在屏幕的顶部和底部有黑色的条。
- VN:传统的视觉小说布局与较大的肖像图像上方的字幕/菜单框。
- WRPG:带有滚动对话日志的传统西方RPG布局。
Subtitle Panels & Menu Panels 字幕面板和菜单面板
一个标准的对话UI通常有一个或多个字幕面板和菜单面板。 将字幕面板分配给字幕面板列表。 设置NPC默认字幕面板和PC默认字幕面板,指定NPC和玩家默认使用哪些面板。 拥有对话Actor组件的Actor可以指定使用与默认面板不同的面板。 如果在开始对话时允许打开字幕面板为真,对话系统将检查所有对话参与者以识别他们的字幕面板。 如果任何这些副标题面板指定它们应该在对话开始时立即打开,它就会打开它们。 如果你知道对话开始时没有任何面板被配置为打开,则可以取消此复选框以绕过该复选框。 将菜单面板分配给菜单面板列表。将默认菜单面板设置为默认菜单面板。 通常,您将只有一个菜单面板。 在大多数情况下,你将分配与对话UI位于同一画布中的字幕面板和菜单面板。 然而,分配位于不同画布上的面板是可以的。
Subtitle Panel 字幕面板
Menu Panel 菜单面板
Panel Animation 动画面板
字幕面板和菜单面板可以在状态改变时播放动画。 要分配动画,请向面板添加Animator组件。 指定一个动画控制器,该控制器具有以下一种或多种状态的触发器。 下面的列表描述了设置每个触发器的时间:
- Show: 当面板打开时。
- Hide: 当面板关闭时。
- Focus: 当面板正在积极显示对话文本/菜单的当前行时。
- Unfocus: 当面板仍然可见,但不包括当前活动的面板时。
6、逻辑&Lua
对话系统中不需要脚本。 但是,对话系统提供了一种名为Lua的通用脚本语言,它提供了一种非常强大的方法来控制对话流、检查和更改任务状态等等。 在大多数情况下,您可以使用简单的单击菜单。 对话系统使用了Chat Mapper建立的数据模型,Chat Mapper是行业内常用的另一种专业对话创作工具。关于所有参与者、项、位置、变量和对话的信息都存储在Lua表中。 您可以通过指定Lua条件和脚本来控制对话,通常是通过使用指向和单击菜单。 对于那些感兴趣的人,聊天映射器手册有更多关于Lua和对话系统使用的表的背景信息,在标题为用Lua编写脚本的部分。
对话系统中Lua用在哪里
在运行时,对话系统将您的对话数据库视为只读的。它将数据库值加载到Lua中,在Lua中可以检查和更改当前值。 您可以在对话系统的以下区域使用Lua:
- 对话条目中的条件和脚本字段。
- 在[lua(代码)]标签内的对话条目和任务字段的文本(见标记标签)。
- 对话系统触发
- 在您自己的脚本中,使用Lua和/或DialogueLua类(参见如何在您的c#脚本中使用Lua)
- 对话编辑器的手表选项卡和游戏中的Lua控制台组件。
Point-and-Click Lua
在大多数您可以手动输入Lua代码的地方(如果您愿意),您还可以单击a '…按钮将字段切换为点击模式。在这种模式下,你可以使用下拉菜单,而不需要输入任何代码:
点击“+”添加新的条件或动作。点击恢复取消或应用应用您的选择,这将关闭下拉菜单,并为您编写Lua代码:
如何编写Lua代码
如果你喜欢直接写Lua代码,你会发现它类似于c#或UnityScript。有关Lua的更多信息,请参见www.lua.org。