读取配置文件等对于一个游戏的重要性不需要多说,本文总结了本人最近经常用到的C#解析文本文件的方法。本文作为一个涂鸦,仅仅用于提供几个解决问题的思路,对于代码是否高雅等问题不予考虑。

准备工作

创建一个类,用于保存单个Site信息。

public class Site  {
	public string Name{get;set;}
	public string Url{ get; set;}
}

创建一个类,用于保存Site类数组。

public class SitesList {
        public Site[] sites;
}

创建一个脚本,名称随意,Start方法中写初始化路径代码(下文所提的初始内容即为此):

//Application.dataPath,unity中用来获取Assets路径的属性
string path = Application.dataPath + "/Resources/";
string jsonName = "Sites.json";
string txtName = "Sites.txt";
string xmlName = "Sites.xml";
string jsonPath = path + jsonName;
string txtPath = path + txtName;
string xmlPath = path + xmlName;

TXT文件的存储与解析

TXT保存

思路:将类手动转换成字符串,拼串,保存至文件中。
代码:

public void TxtToFile(SitesList sitesList,string filePath)
        {
                string str = "Name|Url" + '\n';
                for (int i = 0; i < sitesList.sites.Length; i++) {
                        str += sitesList.sites[i].Name
                                + '|' 
                                + sitesList.sites[i].Url 
                      //最后一行不用追加换行
                                +  (i == sitesList.sites.Length - 1 ? "": "\n");
                }
                FileStream fs = File.Open (filePath, FileMode.Create);
                StreamWriter sw = new StreamWriter (fs);
                sw.Write (str);
                sw.Flush ();
                sw.Close ();
                fs.Close ();
                Debug.Log ("保存成功");
        }

start中追加如下内容:

Site s1 = new Site (){ Name = "梓喵出没",Url ="http://www.azimiao.com"};
Site s2 = new Site (){ Name = "Xema", Url = "https://www.xema.ink" };
Site s3 = new Site (){ Name ="Pret",Url = "https://www.pret-page.com"};
SitesList siteList = new SitesList ();
siteList.sites = new Site[]{ s1,s2,s3};
TxtToFile (siteList, txtPath);

unity中创建一个Cube(随意),将该脚本挂载到该游戏对象中,点击运行。
效果如图:

保存文件的内容为:

Name|Url
梓喵出没|http://www.azimiao.com
Xema|https://www.xema.ink
Pret|https://www.pret-page.com

TXT读取与格式化

思路:读取文件中所有内容,按换行符号’\n’切割字符串,获取的字符串数组每个元素即为一个Site对象。按照标识符分隔对象字符串(这里使用的是’|’),创建对象分别赋值即可。
代码:

public void TxtToClass(out SitesList rec,string filePath)
	{
		rec = new SitesList ();
		if (!File.Exists(filePath)) {
			Debug.Log ("文件不存在");
			return;
		}
		FileStream fs = File.Open (filePath, FileMode.Open);
		StreamReader sr = new StreamReader (fs);
		string txtData = sr.ReadToEnd ();
		//切割每一行
		string[] lineData = txtData.Split ('\n');
		//容器内数组初始化
		rec.sites = new Site[lineData.Length -1];
		for (int i = 1; i < lineData.Length; i++) {
			int index = 0;
			//切割元素字符串
			string[] siteTemp = lineData [i].Split ('|');
			//给容器内数组赋值
			rec.sites [i - 1] = new Site (){Name =siteTemp[index++],Url = siteTemp[index++] };
		}
	}

start中追加如下内容(初始内容追加,下同):

SitesList siteList = new SitesList ();
TxtToClass (out siteList, txtPath);
                foreach (Site item in siteList.sites) {
                        Debug.Log (item.Name + "|" + item.Url);
                }

运行结果:

TXT更新

txt文件没有节点一说,也就没有修改某节点局部更新的方法,因此需要拼接新的字符串覆盖原内容。这与保存内容一致,因此不再重复。

JSON文件的存储与解析

额外准备工作:需要导入LitJSON.dll并引用其命名空间:

using LitJson;

JSON保存

思路:先将Site类格式化为Json字符串,然后检查文件是否存在(覆盖or创建),最后保存字符串。
代码:

 //将类转化为Json对象
public void SiteToJson(SitesList siteList,string filePath)
{
        string jsonData = JsonMapper.ToJson (site