# 配置文件读取器

  • 获取文件内容:输入 StreamingAssets 下的文件路径,利用路径助手处理路径,读取文本文件(.txt),返还文件的内容(字符串)
  • 读取配置文件的方法:根据提供的字符串和对应的处理方法处理字符串
  • WWW 和 UnityWebRequest 的写法不同,使用的时候二选一即可(建议使用 UnityWebRequest)
  • Web 端利用 UnityWebRequest 读取文件,其他平台利用 IO 流读取(如果未经过路径助手处理,则只有 PC 端可以用 IO 流读取文件,其他平台仍然需要用 UnityWebRequest 读取文件)

# 代码

ConfigReader
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);
}