😎
Hololens2でKnownFolders.DocumentsLibraryを扱おうとしたら「index out of range of
現象
Hololens2のエミュレータの段階で、タイトルのようなエラーがでました
再現コード
string UWP_DIR_NAME = "myDir";
string FILE_NAME = "obj_info.json";
string jsonString = "{\"objs\":{\"x\":100,\"y\":200,\"z\":300}";
await Task.Run(async () =>
{
try
{
var readFolder = await KnownFolders.DocumentsLibrary.GetFolderAsync(UWP_DIR_NAME);
var readFile = await readFolder.GetFileAsync(FILE_NAME);
using (var stream = await readFile.OpenStreamForReadAsync())
{
var bytes = new byte[stream.Length];
await stream.ReadAsync(bytes, 0, bytes.Length);
var text = System.Text.Encoding.UTF8.GetString(bytes);
jsonString = text;
}
}
catch (Exception e)
{
var folder = await KnownFolders.DocumentsLibrary.CreateFolderAsync(UWP_DIR_NAME, CreationCollisionOption.OpenIfExists);
var file = await folder.CreateFileAsync(FILE_NAME, CreationCollisionOption.ReplaceExisting);
using (var stream = await file.OpenStreamForWriteAsync())
{
var bytes = System.Text.Encoding.UTF8.GetBytes(jsonString);
await stream.WriteAsync(bytes, 0, bytes.Length);
}
}
});
あるフォルダ内のファイルを見に行って、なければダミーのjsonファイルを作るというもの
実際のコードではないけど、var多いし、もっときれいに書きたいやつです
発生したエラー
catchのほうでもエラーが出てしまってこの後の処理がうまく通っていなかった
エラー内容は「index out of range of ToggleList: 0」
エラー箇所はそのあとたくさんDebug.Log
を使ってvar readFolder = await KnownFolders.DocumentsLibrary.GetFolderAsync(UWP_DIR_NAME);
らへんだと判明
ちなみにエミュレータでDebug.Logを見る方法
参考:https://zenn.dev/fumiyahr/articles/a97842e3954560
いちいちダウンロードがめんどうですが、できました
環境
- Unity: v2019.4.18f1
- MRTK: v10.0.19041
- Hololens2エミュレータ: v10.0.20348
- Visual Studio 2019
解決した方法
参考
- https://docs.microsoft.com/en-us/uwp/api/windows.storage.knownfolders?view=winrt-20348
- https://www.fixes.pub/program/379935.html
- https://www.fixes.pub/program/270850.html
- https://qiita.com/miyaura/items/75ec7f3d6ab0500ccf72
- https://blog.kaorun55.com/entry/2017/03/04/203152
エミュレータでの簡単な手順
- Unity上でUWP向けにビルド
-
Package.appxmanifest
をテキストエディタなどで開き、<uap:Capability Name="documentsLibrary" />
を追加 - VisualStudioでエミュレータのプロジェクトを開いて
Package.appxmanifest
を探して開き、宣言追加 - エミュレータ実行
実機での簡単な手順
-
Package.appxmanifest
をテキストエディタなどで開き、<uap:Capability Name="documentsLibrary" />
を追加 - VisualStudioでエミュレータのプロジェクトを開いて
Package.appxmanifest
を探して開き、宣言追加 - Unity内でMRTKのビルド
Discussion