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

Unity and Hololens: Reading non-text file exception

[已编辑] 首先,我必须道歉,我刚刚注意到我粘贴的一些代码,因为我们读取 png 文件的代码 not 在 .net 后端工作(txt 读取对两者都有效) 、.net 和 il2cpp,如前所述)。调用堆栈来自不同的异常。现已更正

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

一切正常,直到我们最近不得不将我们的脚本后端从 .net 更改为 il2cpp;从那时起,每当我们尝试读取我们的 png 文件时,我们都会发现错误,尽管仍然可以读取 txt,而无需更改我们的 .net 源代码。

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

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

... 引发此异常:

Exception thrown: 'System.NullReferenceException' in Assembly-CSharp.dll

调用堆栈中只有这个:

at CsvReader.d__4.MoveNext()

所以在我们看来,我们的 dataReader 保持为空,但我们并不真正了解正在发生的事情,也不知道如何防止它发生。谁能提供一些阅读此类文件的建议或想法?

问候!

经过一些更多的工作,我们终于找到了为什么这不起作用......这很尴尬。碰巧数组 '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 后端加载二进制文件,这似乎是一种可靠的方法。