MRが楽しい

MRやVRについて学習したことを書き残す

hololensアプリでテキスト設定ファイルの読み込みを行う

本日は hololens の技術調査枠です。
アプリの設定を外部テキストファイルとして読み込みます。

以前の assetbundle の調査結果を応用しました。
bluebirdofoz.hatenablog.com

ここで assetbundle ではなく、テキストファイルを読み込みます。

前回と同様に、UnityEditor 上では"Application.streamingAssetsPath"を参照します。
これは Unity 上の「Asset/StreamingAssets」フォルダとなります。
f:id:bluebirdofoz:20171005223007j:plain

Hololens 上では"Windows.Storage.ApplicationData.Current.LocalFolder.Path"を参照します。
これは Hololens 上の「LocalAppData/AppName/LocalState」フォルダとなります。
f:id:bluebirdofoz:20171005223018j:plain

以下のようにフォルダを自動で切り替えるように実装します。
・AppSettingManager.cs

/// <summary>
/// アプリ設定ディレクトリパス
/// 実行環境によって参照ディレクトリを変更する
/// </summary>
private string SettingFileDirectoryPath()
{
    string directorypath = "";
#if WINDOWS_UWP
    // HoloLens上での動作の場合、LocalAppData/AppName/LocalStateフォルダを参照する
    directorypath = Windows.Storage.ApplicationData.Current.LocalFolder.Path;
#else
    // Unity上での動作の場合、Assets/StreamingAssetsフォルダを参照する
    directorypath = UnityEngine.Application.streamingAssetsPath;
#endif
    return directorypath;
}

設定ファイルの読み書きを作り込むのは面倒です。
今回はインスタンスXml形式で入出力する XmlSerializer クラスを利用しました。

・AppSettingManager.cs

/// <summary>
/// アプリ設定フォーマットクラス
/// </summary>
public class AppSettings
{
    public string AppName;
}

/// <summary>
/// アプリ設定読み込み(XML)
/// </summary>
/// <returns>読み込み成否</returns>
public bool XMLRead()
{
    UtilLog.DebugLog(this, "XMLRead");

    // 読み込み成否
    bool ret = false;

    // オブジェクトの型を指定して Serializer オブジェクトを作成する
    System.Xml.Serialization.XmlSerializer serializer;
    serializer = new System.Xml.Serialization.XmlSerializer(typeof(AppSettings));

    // ファイルの存在確認
    if (System.IO.File.Exists(XMLFilePath()) == true)
    {
        // 読み込みファイルを開く
        System.IO.StreamReader streamreader;
        streamreader = new System.IO.StreamReader(XMLFilePath(), new System.Text.UTF8Encoding(false));

        // XMLファイルから逆シリアル化する
        p_AppSettings = (AppSettings)serializer.Deserialize(streamreader);

        // ファイルを閉じる
        streamreader.Close();

        // 読み込み成功
        ret = true;
    }

    return ret;
}

これでUWPアプリにビルドしてみると……。
f:id:bluebirdofoz:20171005223047j:plain
エラーが発生しました。Unity 上では動くのに。

以下の記事によると、Windows Storeアプリケーションでは .CLose() メソッドや BinaryReader は使えないらしい。
qiita.com

以下の記事を参考に読み込み方法を変えてみました。
dhero.hatenablog.com


問題個所を以下の通り、修正します。
・AppSettingManager.cs

        // 読み込みファイルを開く
        System.IO.StreamReader streamreader;
        //streamreader = new System.IO.StreamReader(XMLFilePath(), new System.Text.UTF8Encoding(false));
        streamreader = new System.IO.StreamReader((System.IO.Stream)System.IO.File.OpenRead(XMLFilePath()));

        // XMLファイルから逆シリアル化する
        p_AppSettings = (AppSettings)serializer.Deserialize(streamreader);

        // ファイルを閉じる(WindowsStoreアプリではClose()メソッドは使用不可)
        //streamreader.Close();
        streamreader.Dispose();

今度はビルドが成功しました。
f:id:bluebirdofoz:20171005223059j:plain

以下のような xml ファイルを所定のフォルダに置くことで、アプリから設定読み込みが可能です。
・settings.xml

<?xml version="1.0" encoding="utf-8"?>
<AppSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <AppName>TestName</AppName>
</AppSettings>