找回密码
 立即注册
查看: 277|回复: 0

Unity 对话系统

[复制链接]
发表于 2022-10-12 08:12 | 显示全部楼层 |阅读模式
视频地址:https://wwt.lanzouy.com/iRcEp0d88rbi
源文件地址:https://wwt.lanzouy.com/ilgTW0d88s6j

实现原理:
首先创建一个Excel文件里面存放对话:
标志(是连续对话还是分支对话)ID(对话的ID) 人物(谁说的话) 内容(说的什么话)NPC(对谁说话)
跳转ID(说完下一步跟谁说) 效果(增加属性) 和目标(给谁增加属性)


然后我们保存为CSV文件,保存CSV文件的好处是文件自动以英文的逗号分隔。
解析完成的样子:


给人物添加触发器,当进入触发器范围时候就显示UI
给Ui添加一个按钮,注意将按钮UI图片调节为透明,实现每次点击UI的时候进行下一次对话




先用一个数组来接收:用换行符分割的所有的行


现在可以操纵每一行的内容了,添加一个ID索引,每一次进行操作的时候,ID索引进行变化,显示不同的对话
设置为1是因为我们从第1个ID开始对话。


/// <summary>
/// 分析每一行
/// </summary>
    public void MeiYihang()
    {
        for (int i = 0; i < dialogRows.Length; i++)
        {
            string[] cells = dialogRows.Split(','); //通过英文的,进行分割,获取每一行的数组

//如果标识符==#并且当前数组的ID==我们设置的ID索引并且目前对话的NPC和我们接触的NPC是同一个名字  (执行顺序说明)
            if (cells[0] == "#" && int.Parse(cells[1]) == curDialogIndex && CurNpcName == ExcellNpcName)
            {
                ExcellNpcName = cells[4];  //获取Excell中NPC的名字  通过获取不同行的对话人来修改ExcellNpcName中的人物名称
                UpdateText(cells[2], cells[3]);  //修改头像和说话的文本       在后面会写道这个方法的作用
                curDialogIndex = int.Parse(cells[5]);  //因为是for循环 所以将下一次的索引给curDialogIndex 让for循环进行遍历
                break;
            }
//如果标识符==&并且当前数组的ID==我们设置的ID索引并且目前对话的NPC和我们接触的NPC是同一个名字  (执行分支说明)
            else if (cells[0] == "&" && int.Parse(cells[1]) == curDialogIndex && CurNpcName == ExcellNpcName)  //如果是&,就说明要进行分支了
            {
                GenerateOptionButton(i); //执行分支的方法  传入不同的i索引获取对话内容
                break;
            }
        }
    }

修改头像和对话的文本内容文本:  


分支的实现原理:如果是&那就说明到分支选择了,运行GenerateOptionButton方法,传入当前行的索引
实例化Button,修改按钮下的文本,并且给按钮通过委托添加行为
delegate{OnOptionClick(int.Parse(cells[5]));
传入的参数就是点击不同的Button后后面要说的话,,最后继续运行    MeiYihang();//继续查找是#还是&

//分支选择
    public void GenerateOptionButton(int index)
    {
        string[] cells = dialogRows[index].Split(',');  //读取index所在行的内容  拿到&数组的行
        if (cells[0] == "&")//如果可以进行分支点击后
        {
            Nextbtn.interactable = false; //点击下一步的按钮关闭
            GameObject btn = Instantiate(optionButton, ButtonGroup);  //生成分支的对话框
            btn.transform.SetParent(ButtonGroup, false);  //给对话框设置父物体
            btn.GetComponentInChildren<Text>().text = cells[3]; //找到按钮下面的文本并且修改

            btn.GetComponent<Button>().onClick.AddListener(     //给生成的按钮添加事件
                delegate { OnOptionClick(int.Parse(cells[5]));  });  ////使用一个委托来添加事件

            GenerateOptionButton(index + 1);  //使用递归,直到列表的表示不是&为止  从而获取所有的对话语言
        }
        
    }



点击不同的按钮后运行的程序

    /// <summary>
    /// 分支点击的响应事件
    /// </summary>
    /// <param name="index"></param>
    void OnOptionClick(int index)
    {
        Nextbtn.interactable = true;   //点击下一步按钮可以进行点击
        curDialogIndex = index;  //给不同的分支给与不同的跳转ID就是Index

        for (int i = 0; i < ButtonGroup.childCount; i++) //点击按钮之后就将所有的生成的对话语言删除
        {
            Destroy(ButtonGroup.GetChild(i).gameObject);
        }

        MeiYihang(); //继续开始语言说明
    }

完结!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-15 10:35 , Processed in 0.089268 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表