您的位置:

Unity中的Dialogue System插件介绍

Dialogue System是一个旨在帮助 Unity 开发者快速添加自然、有机的对话到游戏中的插件。该插件提供了大量可定制化的对话选项,包括文本对话、语音对话、角色头像、背景音乐等。开发者可以使用 Dialogue System 创建出功能完善的对话系统,使游戏更加生动、丰富。

一、插件安装与初始化

Dialogue System需要 Unity 5.1或更高版本,并且可以在 Windows、Mac、Linux 平台上使用。我们可以通过 Unity Asset Store 直接下载 Dialogue System,并将其导入到Unity中。

初始化 Dialogue System 对话管理器非常简单。首先将 Dialogue System 的 prefab 拖拽到场景中,然后添加 Dialogue Manager 组件。现在,在对话管理器的 Inspector 中,您可以添加一个对话数据库。

// C# 代码示例

using UnityEngine;
using PixelCrushers.DialogueSystem;

public class Example : MonoBehaviour
{
    void Start()
    {
        DialogueManager.ShowAlert("Hello, World!");
    }
}

二、对话的构成

Dialogue System 将对话分为许多不同的部分。在 Dialogue Editor 中,您可以创建和编辑每个部分。

Conversation(会话)是对话的最高层次。它包含所有说话者、对话行为、对话选项和初始限制。会话可以存储在作为预制件的对话数据库中,因此对话可以在多个场景中共享。

Actor(演员)是会话中说话的人物。您可以添加多个角色,并为每个角色定义角色信息,包括名称、头像、声音和其他属性。

Participants(参与者)是在会话中参与的演员的子集。您可以定义对话内哪些演员可以说话,并以何时开始对话。

Conversation Lines(回话行)是对话的个体说话。每一行都有说话人、说话内容和说话音效。

Dialogue Entries(对话条目)是对话行为的类型。例如,当会话结束时,您可以告诉 Dialogue System 关闭对话或返回到之前的会话。

三、添加对话组件

Dialogue System 支持多种添加对话组件的方式。对于 UI,您可以使用 Unity 的 UI 元素,例如 Text、Image、Button 等。您可以在对话中使用 Unity 中的任何对象,例如 NPC、道具等。

<!-- XML 代码示例 -->

<DialogueUI>
    <-- 显示说话人的头像 -->
    <PortraitImage>
        <ImageField field="Portrait" actor="Player" useDefaultField=true />
    </PortraitImage>

    <-- 显示对话文本 -->
    <Subtitle>
        <Text>
            <FormattedText>
                <TextField field="DialogueText" />
            </FormattedText>
        </Text>
    </Subtitle>

    <-- 显示对话选项 -->
    <ResponseMenu>
        <ResponseButton>
            <FormattedText>
                <TextField field="Text" />
            </FormattedText>
            <HideIf unselectable />
        </ResponseButton>
    </ResponseMenu>
</DialogueUI>

四、使用切换场景进行对话

您可以让 Dialogue System 通过切换场景进行对话。这对于以前不存在的升级或事件是很有用的。Dialogue System使用角色的快照对话系统,在保存角色快照并加载时也可以使用它。

// C# 代码示例

using System.Collections;
using UnityEngine;
using PixelCrushers.DialogueSystem;

public class Example : MonoBehaviour
{
    public string conversation;

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            StartCoroutine(StartConversationAfterDelay());
        }
    }

    IEnumerator StartConversationAfterDelay()
    {
        yield return new WaitForSeconds(0.5f);
        FindObjectOfType<SnapshotSwitcher>().SaveSnapshot();
        DialogueManager.StartConversation(conversation);
        yield return new WaitForSeconds(0.5f);
        FindObjectOfType<SnapshotSwitcher>().TakeSnapshot();
        UnityEngine.SceneManagement.SceneManager.LoadScene("NextScene");
    }

}

五、使用Lua脚本制作对话逻辑

Dialogue System 支持使用 Lua 脚本编写对话逻辑。这使得对话流程可以更加灵活和复杂。

// Lua 代码示例

function OnConversation(eventType, speaker, conversant)
    if eventType == DialogueSystemEvents.START_CONVERSATION then
        if DialogueSystem:Alert("Yes/No demo.") then
            -- Start a new conversation:
            DialogueSystem:StartConversation("YesNoPrompt");
        end
    end
    return true;
end

function OnConversationLine(eventType, actor)
    if eventType == DialogueSystemEvents.LINE_END then
        if actor == "PC" then
            -- Branch based on the player's response:
            if DialogueSystem.dialogueEntry.ResponseButtons[1].isSelected then
                DialogueSystem:StartConversation("YesResponse");
            else
                DialogueSystem:StartConversation("NoResponse");
            end
        end
    end
    return true;
end

function OnConversationEnd(eventType)
    if eventType == DialogueSystemEvents.END_CONVERSATION then
        DialogueSystem:SendMessage("OnYesNoComplete");
    end
    return true;
end

六、结语

Dialogue System 提供了丰富的功能,支持多种对话的定制。开发者可以在 Unity 中快速搭建对话系统,让游戏更加有机、生动。该插件还支持多种语言,如中文、英文等。