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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity和Hololens:读取非文本文件异常相关的知识,希望对你有一定的参考价值。

[编辑]首先我要道歉,我刚刚注意到我粘贴的代码,因为我们的读取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但我们并不真正理解发生了什么,也没有如何防止它。任何人都可以提供一些阅读此类文件的建议或想法吗?

问候!

答案

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

以上是关于Unity和Hololens:读取非文本文件异常的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D发布打包系列之——Hololens打包发布

使用 Unity3D 写入 HoloLens 2 上的 Application.persistentDataPath,然后通过设备门户网站访问文件

.dll、.winmd 可以在 Unity 中读取,但不能在 XAML 项目中读取

HoloLens开发手记 - Unity之场景共享 Shared holographic experiences in Unity

Unity 和 HoloLens 中的 Prefab 低于空间映射

Unity-Hololens-Vuforia开发(图片识别和模型识别)