UnityからWindowsStoreAppの移植する際に気を付けること

# まずびっくりしたこと
* using System; の標準機能がすべて
* 非同期処理を含む関数のPluginでコードを書き、実行された瞬間でゲームが落ちた！
* ファイル読み書きする場合、UnityとWindowsStoreAppでは使う命令が違った。
* Application.Path系でUnity上とWindowsStoreApp上では、パスが違った！
* .NET3.5がつかえるかな～ っと思ったら別のバージョンだった！！
* GUI.Lavelが出てこない！
* WindowsStoreAppではデバッグがし難い！
* UnityとWindowsStoreAppの互換性がなさすぎる

# 問題案から解決案への変換
* using SystemがWindowsStore側で使用ができないので、UnityPortingの[MyPlugin](https://github.com/windowsgamessamples/UnityPorting)を導入し、少しの機能が補えた。
* Application.dataPathで書き出すのではなく、Application.persistentDataPathを使用して補った。本当はServerがあればServerにPOSTしたかったが・・・。
* .NETのVersionの違いに関しては、とにかく.NET2.0でも動く環境を目指した。

# UnityEditor ↔ WindowsStore8.1 について
* 全く互換性がない。
* Unity上で動くものがすべてWindowsStoreで動くと思ってはいけない。
* 使い分けをしないといけない。
* WinRTのPluginはUnityEditorでは実行できない。
* WinRTは、Pluginで作るのではなく、WindowsStoreビルド先のソリューションにコーディングして使用可能にした。  

# WinRTクラスライブラリー
* 最低限必要なファイルの読み込み

``` c#:LibForWinRT.cs
/// <summary>
/// WinRTのライブラリー
/// </summary>
public class LibForWinRT 
{
 
#if UNITY_METRO && !UNITY_EDITOR
 
    /// <summary>
    /// ファイルパスがあるかどうかを調べる。
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    public static async Task<bool> IsFileExistAsync(string filePath)
    {
        var folder = ApplicationData.Current.RoamingFolder;
 
        try
        {
            var url = "ms-appdata:///roaming/" + filePath;
            var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(url));
 
            return true; 
        }
        catch
        {
            return false; 
        }
    }
 
    /// <summary>
    /// ファイルを読み込む
    /// </summary>
    /// <param name="fileName">ファイルパス</param>
    /// <returns>ファイルのbyte型の配列が戻り値</returns>
    public static async Task<string> ReadFileText(string filePath)
    {
        var url = "ms-appdata:///roaming/" + filePath;
        var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(url));
        var text = await FileIO.ReadTextAsync(file);
        return text;
 
    }
 
    /// <summary>
    /// ファイルを読み込む
    /// </summary>
    /// <param name="fileName">ファイルパス</param>
    /// <returns>ファイルのbyte型の配列が戻り値</returns>
    public static async Task<byte[]> ReadFileBytes(string filePath)
    {
        var url = "ms-appdata:///roaming/" + filePath;
        var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(url));
        var buf = await FileIO.ReadBufferAsync(file);
        var bytes = new byte[buf.Length];
        var dr = DataReader.FromBuffer(buf);
        dr.ReadBytes(bytes);
        return bytes;
 
    }
 
      
    private static async Task<byte[]> GetBtyeFromFile(StorageFile storageFile)
    {
        var stream = await storageFile.OpenReadAsync();
 
        using (var dataReader = new DataReader(stream))
        {
            var bytes = new byte[stream.Size];
            await dataReader.LoadAsync((uint)stream.Size);
            dataReader.ReadBytes(bytes);
 
            return bytes;
        }
    }  
    /// <summary>
    /// 書き出す
    /// </summary>
    /// <param name="folderPath">Folderパス</param>
    /// <param name="fileName">ファイルパス</param>
    /// <param name="body">byte配列のデータ</param>
    public static async void WriteFile(string folderPath,string fileName, byte[] body)
    {
        // ローミングフォルダ
        var folder = await ApplicationData.Current.RoamingFolder.CreateFolderAsync(folderPath, CreationCollisionOption.OpenIfExists);
 
        // ファイル（存在すれば上書き）
        var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
 
        // 書き込み
        using (var rStream = await file.OpenAsync(FileAccessMode.ReadWrite))
        using (var oStream = rStream.GetOutputStreamAt(0))
        {
            var writer = new DataWriter(oStream);
            writer.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
            writer.WriteBytes(body);
            await writer.StoreAsync();
        }
 
    }
    /// <summary>
    /// 書き出す
    /// </summary>
    /// <param name="folderPath">Folderパス</param>
    /// <param name="fileName">ファイルパス</param>
    /// <param name="body">byte配列のデータ</param>
    public static async void WriteSharePicture(string folderPath, string fileName, byte[] body)
    {
        // ローミングフォルダ
        var folder = await KnownFolders.PicturesLibrary.CreateFolderAsync(folderPath, CreationCollisionOption.OpenIfExists);
 
        // ファイル（存在すれば上書き）
        var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
 
        // 書き込み
        using (var rStream = await file.OpenAsync(FileAccessMode.ReadWrite))
        using (var oStream = rStream.GetOutputStreamAt(0))
        {
            var writer = new DataWriter(oStream);
            writer.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
            writer.WriteBytes(body);
            await writer.StoreAsync();
        }
 
    }
    
    /// <summary>
    /// 書き出す
    /// </summary>
    /// <param name="folderPath">Folderパス</param>
    /// <param name="fileName">ファイルパス</param>
    /// <param name="body">stringの文字データ</param>
    public static async void WriteFileText(string folderPath, string fileName, string body)
    {
        // ローミングフォルダ
        var folder = await ApplicationData.Current.RoamingFolder.CreateFolderAsync(folderPath, CreationCollisionOption.OpenIfExists);
 
        // ファイル（存在すれば上書き）
        var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
 
        // 書き込み
        using (var rStream = await file.OpenAsync(FileAccessMode.ReadWrite))
        using (var oStream = rStream.GetOutputStreamAt(0))
        {
            var writer = new DataWriter(oStream);
            writer.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
            writer.WriteString(body);
            await writer.StoreAsync();
        }
 
    }
#endif
 
}
```



<br>
  
上記は、個人的な意見です。

 もし、開発する機会があったら様々な点を気を付けて開発していってください。