Google

2016年11月9日水曜日

UnityのUWP環境におけるStream系API問題

最近はPixiJSの初心者記事を続けていますが、表題についてノーマーク過ぎた件について備忘録を書いておきます。

うちでは以前Windowsアプリを開発していたのですが、UWP関連の案件は殆どやってない(というかそういう案件が来ない)のでWindowsPhoneの実機も買う気がなく、Win10はあるものの殆どUWPの情報を仕入れてませんでした。
と、そんな折、海外のお客様から連絡が。

RuntimeSTLLoaderがUWPで動かないのでアドバイスが欲しい、、、、と。

慌ててWin10環境でUWPへのビルドを掛けるとエラーがorz

元々互換性を考えてUnity4.6を基準として作っているし、UWPはサポート対象に入ってないから関係ないしとか、色々言い訳を考えつつも調べてみると、StreamReader系はUWP環境で動作するAPIが変わっている事に気づきました。

このあたりがUnity monoとMicrosfot系.netとの互換に関する問題というか、メリットでもデメリットでもある特性の一つです。
そもそもUnityのmonoは完全互換とは言いがたくUnity .netとか呼んでいたりしたぐらいですし、このStreamReaderのようにUnityに存在しないライブラリは他の環境から持ってこれたりするのでこんな問題も発生したりします。


愚痴はこれぐらいにして、問題となったのはまずコンストラクタ。
StreamReaderのコンストラクタには幾つか種類がありますが、、、、

    new StreamReader(file_name, System.Text.Encoding.Default);

旧バージョンはこういう書き方でした。
Encoding.Defaultは問題も多くやめたほうが良いという記事も散見されるのですが、どうせアスキー処理しかしないのでここでは関係なかったりもします。
それでもエラーはエラーなのでこれはこう書き換えました。

    StreamReader((System.IO.Stream)File.OpenRead(file_name));

続いてクローズ。
こんなのまでだめとは。

    StreamReader reader;
    // 読み込み処理等がここに入ります。
    reader.Close();

代替メソッドとしてDisposeが使えるようなのでそちらに変更。

    reader.Dispose();

後は必要に応じてガーベッジコレクション等も掛けるべきです。
これでUnity Editorは勿論、VisualStudioに持っていってもエラーは出なくなり一安心。

これ以外にも幾つかの変更があったのですが、RuntimeSTLLoaderはこれぐらいで済みました。
当然ながらStreamWriterも同様に相違点がありますし、細かいAPIを挙げていくとキリがないかも知れません。

StreamReader MSDN
https://msdn.microsoft.com/ja-jp/library/system.io.streamreader(v=vs.110).aspx


ちなみにこの修正を施したRuntimeSTLLoaderは間もなくリリースです。
エラー修正のみのリリースはアレなので、3Dプリンタに関係する追加機能を盛り込む予定。
既にお使いの方はお待ち下さい。

0 件のコメント:

コメントを投稿