Unity读取TXT文本文件

27 篇文章 3 订阅
2 篇文章 0 订阅

Unity读取TXT文本文件

读取

Unity的文本读取,可以分成四种方式:

  1. 使用TextAsset类。
    在程序脚本中,以字段public TextAsset text;的形式,直接在Inspector面板中拖动赋值。在之后的程序中,使用text.text;就可以获得文本中的内容。

  2. 使用Resources.Load加载方式。
    Resources.Load我们通常是用于预制体(GameObject)的加载,但其实Resources.Load可以加在很多种类的资源,只要是在Resources文件夹下,然后找到资源相对应的类,就可以了。对于文本文件,使用的就是上面提到的 TextAsset
    用法示例:TextAsset textAsset = Resources.Load(...) as TextAsset;,其中参数填的依然是Resources文件夹下的相对路径。

    另外,Resources.Load加载其他资源分别用的是:图片可以使用SpriteTexture2D(我只试过这两种);音频是使用AudioClip
    同时,除GameObject外,其他文件没有发现需要进行**实例化(Object.Instantiate)**的操作。
    大家如发现,有其他的可以加载的文件、其对应的类或某些特殊情况,可以留言探讨。

  3. 使用WWW或者UnityWebRequest加载方式。
    WWW类是Unity自己封装的一个可以加载外部资源或网络资源的类。而在最新版的Untiy中UnityWebRequest系列的类取代了WWW类的作用。这里只简单介绍UnityWebRequest类加载文本文件的方式。代码如下:

public IEnumerator Load(string path)
{
    UnityWebRequest m_request = UnityWebRequest.Get(path);
    yield return m_request.SendWebRequest();
    string result = m_request.downloadHandler.text;
}

一般这样使用就可以。但为保安全,一般我都会使用下方的代码:

public IEnumerator Load(string path)
{
    UnityWebRequest m_request = UnityWebRequest.Get(path);
    yield return m_request.SendWebRequest();
    while (!m_request.isDone)
    {
        yield return null;
    }
    if (m_request.isNetworkError)
    {
        Debug.LogError(m_request.error);
        yield break;
    }
    string result = m_request.downloadHandler.text;
}
  1. 使用StreamReader类读取。
    StreamReader类是System.IO库中的类,比较通用,所以比较上面的几种方法,更加实用。
public void ReadData(string path)
{
    FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None);
    StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
    if (null == sr) return;
    string str = sr.ReadToEnd();
    sr.Close();
}

上面只是一种创建使用StreamReader类的方式,还有很多方式可以使用,例如StreamReader sr = File.OpenText();等。在StreamReader类中获取分本内容的方式除了上面例子中使用的,还有使用ReadLine函数按行进行读取,例如while ((line = sr.ReadLine()) != null)或者for (int i = 0; (str = sr.ReadLine()) != null; i++)等,其他的函数还有按照块进行读取(ReadBlock,能力有限暂时并未使用过,如果有大神知道的希望可以指点一下。

解析

文本文件的解析是不确定的,因为除了比较常用的JSONXML等格式(这些可以直接使用现成的工具或库进行解析)以外,不同的人或项目所使用的格式都不会确定。这里我就举一个例子,是我项目中遇到的,一个文本文件(txt)其中的内容并不是某个特定的格式,但也比较简单,数据都是由空格(' ')和换行('\n')隔开的。
文本内容示例:

frame_0 0.0180 0.0180 0.0011 0.0008 0.0008 0.0000 0.0000 0.0000 0.0022 0.0022 0.0000 0.0000 0.0000 0.0556 0.0556 0.0000 0.0238 0.0238 0.0058 0.0058 0.0000 0.0000 0.0000 0.0000 0.0755 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.1066 0.0000 0.0000 0.0000 0.0000 0.0000 0.1242 0.0000 0.0053 0.0046 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.1482 0.1482 0.0234 0.0234
frame_1 0.0083 0.0083 0.0011 0.0008 0.0008 0.0000 0.0000 0.0000 0.0114 0.0114 0.0000 0.0000 0.0000 0.0426 0.0426 0.0000 0.0117 0.0117 0.0177 0.0177 0.0000 0.0000 0.0000 0.0000 0.1490 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0010 0.0000 0.0000 0.0000 0.0000 0.0000 0.1048 0.0000 0.0053 0.0046 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.2342 0.2342 0.0123 0.0123
frame_2 0.0159 0.0159 0.0018 0.0013 0.0013 0.0000 0.0000 0.0000 0.0088 0.0088 0.0149 0.0149 0.0773 0.0277 0.0277 0.0773 0.0112 0.0112 0.0106 0.0106 0.0000 0.0000 0.0000 0.0000 0.1696 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0162 0.0000 0.0025 0.0025 0.0000 0.0000 0.0396 0.0000 0.0053 0.0046 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.2162 0.2162 0.0521 0.0521
frame_3 0.0110 0.0110 0.0022 0.0015 0.0015 0.0000 0.0000 0.0000 0.0074 0.0074 0.0287 0.0287 0.1421 0.0136 0.0136 0.1421 0.0053 0.0053 0.0082 0.0082 0.0000 0.0000 0.0000 0.0000 0.1792 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0002 0.0000 0.0067 0.0067 0.0000 0.0000 0.0157 0.0000 0.0053 0.0046 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.2124 0.2124 0.0336 0.0336
frame_4 0.0077 0.0077 0.0017 0.0012 0.0012 0.0000 0.0000 0.0000 0.0055 0.0055 0.0311 0.0311 0.1515 0.0054 0.0054 0.1515 0.0053 0.0053 0.0056 0.0056 0.0000 0.0000 0.0000 0.0000 0.1729 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0206 0.0206 0.0000 0.0000 0.0000 0.0000 0.0111 0.0104 0.0000 0.0000 0.0257 0.0257 0.0000 0.0000 0.1866 0.1866 0.0284 0.0284

下面是我程序中的解析函数:

protected Queue<float[]> Parsing(string original)
{
    Queue<float[]> frames = new Queue<float[]>();
    string[] arr = original.Split('\n');
    for (int i = 0; i < arr.Length; i++)
    {
        string[] temp = arr[i].Split(' ');
        float[] frame = new float[temp.Length - 1];
        for (int j = 1; j < temp.Length; j++)
        {
            try
            {
                frame[j - 1] = float.Parse(temp[j]);
            }
            catch
            {
                Debug.LogError("读取数据:" + temp[j] + "转换“float”失败!");
                continue;
            }
        }
        frames.Enqueue(frame);
    }
    return frames;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天富儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值