幻蓝博客 – 孤月蓝风

追寻互联网科技、Unity开发、AR/VR开发、游戏开发、Web前后端开发等技术。

Unity插件之plyGame教程:DiaQ对话系统


本文为孤月蓝风编写,转载请注明出处:http://fengyu.name/?cat=game&id=296

DiaQ是plyGame旗下的一款对话及任务系统。拥有可视化的对话及任务编辑器,能够很方便的处理对话及任务。但是官方文档却不给力,经过一般研究,终于会使用简单的对话系统了,分享给大家。

首先,你需要安装DiaQ插件,DiaQ有单独的,同时也被包含于plyGame中,至于哪里有的“卖”,请使用伟大的搜索引擎。

在安装DiaQ插件后,菜单栏的Windows中会出现DiaQ的菜单,Tools中会有PL Young菜单,下面会有DiaQ。

我们打开DiaGraphs编辑器,Tools > PL Young > DiaQ > Graph Editor。

图标从左到右依次为:增加、删除、向上移、向下移、修改名称、打开任务编辑器、设置、帮助文档。

我们点击增加,列表中增加一项,之后我们就可以在右边的窗口中创建对话及流程了。选中左侧列表中的一个对话,右边最上方会出现和左边一样的工具条。

从左到右依次为:条件判断、发送消息(SendMessage事件)、设置变量值、等待、调试、任务奖励、完成任务、任务状态、对话。

这一篇中,我们只讲最后一个:对话。

点击对话图标,会在下面视图中创建一个对话框,单机选中对话框,在Unity的Inspector面板中,会显示当前对话框的各种属性。

Dialogure Text:对话内容

Responses:对话选项,例如,NPC询问你是否接受任务,可以回答“接受”和“拒绝”,每一个选项一行,点击右侧的加号添加

Linked Quest:连接到任务

Id:当前对话框的ID

Custom Ident:当前对话的自定义ID,类型为string字符串

Comment:用于对话编辑器中显示的备注信息,用于说明次对话用途,只在编辑器中显示,对话中不显示

Show in Graph:上面的备注信息是否显示在编辑器中

Node MetaData:对话传递的数据,可以在这里传递各种类型的数据,供下一条对话使用

现在,你可以随便创建几个对话内容,并将它们连接起来。你可以点击箭头,会出现连接线,再点击需要连接的对话,两个对话框就会被线连接起来。

在所有对话的内容完成之后,你会在 Assets / plyData / DiaQ 文件夹中看到有一个DiaQ的Prefab,将它添加进游戏场景中。

接下来我们写对话的代码。

首先,你需要:

using plyCommon;
using DiaQ;

其次,我们需要声明一个变量,用于保存获取到的对话内容:

private plyGraph conversation = null;

然后在Start中,获取对话内容(这里你可以通过IdentName两种方式获取,自由选择):

conversation = DiaQEngine.Instance.graphManager.GetGraphByIdent(dialogureID.ToString());

之后,所有的对话,都是在GUI中显示,所以代码均写在OnGUI中:

//判断当前是否有对话正在进行
if (DiaQEngine.Instance.graphManager.ActiveGraph() == null)
{
    //没有对话进行则开始对话
    DiaQEngine.Instance.graphManager.BeginGraph(conversation);
}
else
{
    //获取对话节点
    DiaQNode_Dlg dlg = DiaQEngine.Instance.graphManager.NodeWaitingForData() as DiaQNode_Dlg;
    //如果节点不为null,则调用内容
    if (dlg != null)
    {
        //获取对话内容,并赋值
        string _text = dlg.dialogueText;
        Rect dialogbox = new Rect(0,0,300,300);
        GUI.Box(dialogbox, _text);
        //获取选项数量,并循环所有选项,将选项用按钮输出
        _choicesCount = dlg.responses.Length;
        for (int i = 0; i < _choicesCount; i++)
        {
            //dlg.responses[i]为选项的内容文字
            if (GUI.Button(new Rect(0, i * 45), 100, 50), dlg.responses[i]))
            {
                //根据选项跳转到下一个相连的对话
                DiaQEngine.Instance.graphManager.SendDataToNode(i);
            }
        }
    }
}

这样,我们完整的创建并调用了使用DiaQ制作的对话。