通过XML文件实现人物之间的对话
一、建立一个XML文档,放在项目中Assert/Resources/XML文件下
XML的内容如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <dialogues1> 4 <dialogue> 5 <role>门派长老</role> 6 <detail>李清,你找我意欲何事?</detail> 7 </dialogue> 8 <dialogue> 9 <role>李清</role> 10 <detail>回禀长老,弟子最近想出城历练一番,望长老允</detail> 11 </dialogue> 12 <dialogue> 13 <role>门派长老</role> 14 <detail>城外老虎数量不断增多,已经威胁到了人们的出行</detail> 15 </dialogue> 16 <dialogue> 17 <role>李清</role> 18 <detail>弟子愿去赶走虎群</detail> 19 </dialogue> 20 <dialogue> 21 <role>门派长老</role> 22 <detail>这里是500金币,你去准备一些随身物品,明天出发</detail> 23 </dialogue> 24 <dialogue> 25 <role>李清</role> 26 <detail>弟子明白</detail> 27 </dialogue> 28 </dialogues1>
二、新建一个C#脚本,读取文件
脚本主要代码如下:
1、加载XML文件,将文件的数据存入到LIst集合中去
1 public static List<string> ListXml;//定义一个string类型的List集合
1 public static int listIndex = 0;
1 public static string role;//角色名字 2 public static string role_detail;//角色的对话
4 public static void LoadXML(string name) 5 { 6 ListXml = new List<string>(); 7 XmlDocument xmlDocument = new XmlDocument();//定义一个XmlDocument 8 string data = Resources.Load(@"XML\"+name).ToString();//Resources加载XML文档 9 xmlDocument.LoadXml(data); 10 //SelectSingleNode(name).ChildNodes 查询该文档下的所有子集,返回一个集合 11 XmlNodeList xmlNodeList = xmlDocument.SelectSingleNode(name).ChildNodes; 12 //遍历集合,给每个子集(每条对话)增加一个分割标识符“:”,方便下面字符串的分割 13 foreach (var xmlNode in xmlNodeList) 14 { 15 XmlElement xmlElement = (XmlElement)xmlNode; 16 ListXml.Add(xmlElement.ChildNodes.Item(0).InnerText+":"+ xmlElement.ChildNodes.Item(1).InnerText); 17 } 18 }
2、分割集合中的子集(每条对话),根据每个子集的角色名字(role),显示出所对应的UI
1 //分割每个子集(每条对话) 2 public static void ListDiv(List<string> rolelist,int index) 3 { 4 5 string[] role_array = rolelist[index].Split(':');//将每条对话从设置好的标识符“:”分割 6 role = role_array[0];//角色名字 7 role_detail = role_array[1];//角色对话 8 Debug.Log(role +":"+ role_detail); 9 string text = role + ":" + role_detail; 10 //根据上面分割的role(角色名字),显示所对应的对话框 11 switch (role) 12 { 13 case "李清": 14 //显示UI界面 15 //text值传过去 16 //我这里用的是UI框架 和 一个text的全局变量来控制的 17 TTUIPage.ShowPage<Liqin>(); 18 Global_Variable.Liqin_text.text = text.ToString(); 19 break; 20 case "门派长老": 21 TTUIPage.ShowPage<Dean>(); 22 Global_Variable.Dean_text.text = text.ToString(); 23 break; 24 } 25 }
3、加载XML文件,读取对话
1 private void Start() 2 { 3 //调用LoadXML方法 4 LoadXML("dialogues1"); 5 } 6 private void Update() 7 { 8 if (Input.GetMouseButtonDown(0)) 9 { 10 //通过集合的长度,判断对话是否全部读取完毕 11 if (listIndex >= ListXml.Count - 1) 12 { 13 //对话读取完毕 14 } 15 else 16 { 17 //读取行下一条对话 18 listIndex++; 19 //调用ListDiv方法继续加载对话 20 ListDiv(ListXml, listIndex); 21 } 22 } 23 }