Unity和Hololens:读取非文本文件异常

时间:2019-01-28 20:19:38

标签: c# file unity3d hololens il2cpp

[已编辑] 首先,我必须道歉,我只是注意到粘贴的一些代码,因为我们读取png文件的代码在.net后端中均不能使用(txt读取对.net都适用和il2cpp,如前所述)。调用堆栈来自另一个异常。现在已更正

我们正在为Microsoft Hololens开发XR应用程序,其中涉及读取txt和二进制文件(后者作为字节数组,由Texture2D.LoadImage作为Unity纹理加载)。由于我们需要为用户提供一种简单的方式来更改/修改文件,这两个文件都位于hololens的3D对象文件夹中。

一切正常,直到最近我们不得不将脚本后端从.net更改为il2cpp为止;从那时起,尽管我们仍可以在不更改.net源代码的情况下读取txt的情况下尝试读取png文件,但发现错误。

我们正在读取这样的文本文件(工作正常):

    Windows.Storage.StorageFolder objectsFolder = Windows.Storage.KnownFolders.Objects3D;
    Windows.Storage.StorageFile csvFile = await objectsFolder.GetFileAsync(oneFile);
    string contentText = await Windows.Storage.FileIO.ReadTextAsync(csvFile);

对于PNG,我们尝试了几种不同的方法,包括最简单的File.ReadAllBytes( pngFile.Path);(适用于.net,但不适用于il2cpp),FileStream和其他方法,但它们总是在某些时候失败。最后一个是这样:

     Windows.Storage.StorageFolder pngObjectsFolder = Windows.Storage.KnownFolders.Objects3D;
     Windows.Storage.StorageFile pngFile = await pngObjectsFolder.GetFileAsync(i.ToString() + ".png");

     Windows.Storage.Streams.IBuffer buffer = await Windows.Storage.FileIO.ReadBufferAsync(pngFile);
     Windows.Storage.Streams.DataReader dataReader = Windows.Storage.Streams.DataReader.FromBuffer(buffer);


     dataReader.ReadBytes (fileData);

...引发此异常:

  

引发的异常:“ System.NullReferenceException”   Assembly-CSharp.dll

并且仅在调用堆栈中包含此内容:

  

在CsvReader.d__4.MoveNext()

因此,在我们看来,dataReader保持为空,但我们真的不了解发生了什么,也没有办法防止它发生。谁能提供一些建议或想法来阅读此类文件?

致谢!

1 个答案:

答案 0 :(得分:2)

经过更多的工作,我们终于找到了为什么它不起作用...而且令人尴尬。碰巧数组“ fileData”没有初始化。源代码应为:

        Windows.Storage.StorageFolder pngObjectsFolder = Windows.Storage.KnownFolders.Objects3D;
        Windows.Storage.StorageFile pngFile = await pngObjectsFolder.GetFileAsync(i.ToString() + ".png");             
        Windows.Storage.Streams.IBuffer buffer = await Windows.Storage.FileIO.ReadBufferAsync(pngFile);                      
        Windows.Storage.Streams.DataReader dataReader = Windows.Storage.Streams.DataReader.FromBuffer (buffer);

        fileData = new byte[buffer.Length];     
        dataReader.ReadBytes (fileData);

到那时,我们在fileData中将png文件作为字节数组,我们可以自由地对其进行所需的操作。在我们的示例中,将其加载到Unity 3d纹理对象中:

        tex = new Texture2D(2, 2);
        tex.LoadImage(fileData);

因此,如果其他任何人都在努力使用il2cpp后端加载二进制文件,这似乎是一种可靠的方法。