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(&#39;,&#39;); //通过英文的,进行分割,获取每一行的数组
//如果标识符==#并且当前数组的ID==我们设置的ID索引并且目前对话的NPC和我们接触的NPC是同一个名字(执行顺序说明)
if (cells == &#34;#&#34; && 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 == &#34;&&#34; && 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(&#39;,&#39;);//读取index所在行的内容拿到&数组的行
if (cells == &#34;&&#34;)//如果可以进行分支点击后
{
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=&#34;index&#34;></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]