zt3ff3n 发表于 2022-10-12 08:12

Unity 对话系统

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

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


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

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

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

            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(); //继续开始语言说明
    }

完结!
页: [1]
查看完整版本: Unity 对话系统