# 配置文件读取器
- 获取文件内容:输入 StreamingAssets 下的文件路径,利用路径助手处理路径,读取文本文件(.txt),返还文件的内容(字符串)
- 读取配置文件的方法:根据提供的字符串和对应的处理方法处理字符串
- WWW 和 UnityWebRequest 的写法不同,使用的时候二选一即可(建议使用 UnityWebRequest)
- Web 端利用 UnityWebRequest 读取文件,其他平台利用 IO 流读取(如果未经过路径助手处理,则只有 PC 端可以用 IO 流读取文件,其他平台仍然需要用 UnityWebRequest 读取文件)
# 代码
using System; | |
using System.IO; | |
using UnityEngine; | |
namespace Common | |
{ | |
/// <summary> | |
/// 配置文件读取器 | |
/// </summary> | |
public class ConfigReader | |
{ | |
/// <summary> | |
/// 使用 WWW 读取 StreamingAssets 中的文件 | |
/// </summary> | |
/// <param name="path">StreamingAssets 下的文件路径 & lt;/param> | |
/// <returns > 读取到的字符串 & lt;/returns> | |
[Obsolete("Use GetConfigFile instead", true)] | |
public static string GetConfigFileWWW(string path) | |
{ | |
string localPath = PathHelper.GetPath(path); | |
WWW www = new WWW(localPath); | |
// 读取文件出错 | |
if (www.error != null) | |
{ | |
Debug.LogError("Error while reading files : " + localPath); | |
throw new System.Exception(www.error); | |
} | |
// 等待完成请求 | |
while (!www.isDone) { } | |
return www.text; | |
} | |
/// <summary> | |
/// 读取 StreamingAssets 中的文件 | |
/// </summary> | |
/// <param name="path">StreamingAssets 下的文件路径 & lt;/param> | |
/// <returns></returns> | |
public static string GetConfigFile(string path) | |
{ | |
string localPath = PathHelper.GetPath(path); | |
#if UNITY_WEBGL | |
// 创建 UnityWebRequest 对象 | |
UnityWebRequest www = UnityWebRequest.Get(localPath); | |
// 发送请求并等待返回 | |
// 如果不是静态方法,可以使用协程 | |
//yield return www.SendWebRequest(); | |
www.SendWebRequest(); | |
while (!www.isDone) { } | |
// 检查请求是否有错误 | |
if (www.result == UnityWebRequest.Result.Success) | |
{ | |
// 读取文本内容 | |
return www.downloadHandler.text; | |
} | |
else | |
{ | |
// 报错 | |
throw new Exception(www.error); | |
} | |
#else | |
string content; | |
using (StreamReader sr = new StreamReader(localPath)) | |
{ | |
content = sr.ReadToEnd(); | |
} | |
return content; | |
#endif | |
} | |
/// <summary> | |
/// 读取配置文件 | |
/// </summary> | |
/// <param name="fileContent"> 文件内容 & lt;/param> | |
/// <param name="handler"> 读取方法 & lt;/param> | |
public static void ReadConfigFile(string fileContent, Action<string> handler) | |
{ | |
// 通过字符串读取器实现 | |
//StringReader 提供了逐行读取的功能(ReadLine ()) | |
// 程序在退出 using 代码框后,会自动释放资源(自动调用 Dispose ()) | |
// 不论程序是正常退出还是异常退出,都会自动释放资源 | |
// 如果不在 using 代码框中,程序异常退出时不会执行 Dispose () | |
using (StringReader reader = new StringReader(fileContent)) | |
{ | |
string line; | |
while ((line = reader.ReadLine()) != null) | |
{ | |
if (line != string.Empty) | |
{ | |
handler(line); | |
} | |
} | |
// 在 using 代码框中,不需要写这两串代码 | |
//reader.Dispose(); | |
//reader.Close(); | |
} | |
} | |
} | |
} |
# 使用方法
public void Test() | |
{ | |
string configfile = ConfigReader.GetConfigFile("/your_file_name.txt"); | |
ConfigReader.ReadConfigFile(configfile, BulidLine); | |
} | |
/// <summary> | |
/// 读取一行 | |
/// </summary> | |
/// <param name="line"></param> | |
private void BulidLine(string line) | |
{ | |
print(line); | |
} |