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

问题描述 投票:2回答:1

[编辑]首先我要道歉,我刚刚注意到我粘贴的代码,因为我们的读取png文件的代码也不能在.net后端工作(txt读取对两者都有效,.net和il2cpp,如说明)。调用堆栈来自另一个异常。现在纠正了

我们正在为Microsoft Hololens的XR应用程序工作,它涉及读取txt和二进制文件(后者作为字节数组,由Texture2D.LoadImage作为Unity纹理加载)。因为我们需要为用户提供一种简单的方法来更改/修改文件,这两种文件都位于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);

...抛出此异常:

抛出异常:Assembly-CSharp.dll中的“System.NullReferenceException”

并且在调用堆栈中只有这个:

在CsvReader.d__4.MoveNext()

因此在我们看来,我们的dataReader保持为null但我们并不真正理解发生了什么,也没有如何防止它。任何人都可以提供一些阅读此类文件的建议或想法吗?

问候!

c# file unity3d hololens il2cpp
1个回答
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后端加载二进制文件,这似乎是一种可靠的方法。

© www.soinside.com 2019 - 2024. All rights reserved.