![](/img/trans.png)
[英]Text file in/out on Hololens works for writing but not reading (Unity,Hololens,C#)
[英]Unity and Hololens: Reading non-text file exception
[編輯]首先我必須道歉,我剛剛注意到的代碼我粘貼為我們的代碼讀取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);
...引發此異常:
引發異常:Assembly-CSharp.dll中的“ System.NullReferenceException”
並在調用堆棧中僅包含以下內容:
在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后端加載二進制文件,這似乎是一種可靠的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.