次の方法で共有


Unity と UWP に .NET API がない

.NET を使用して UWP ゲームをビルドする場合、Unity エディターまたはスタンドアロン PC ゲームで使用できる一部の API が UWP に存在しないことがあります。 これは、.NET for UWP アプリには、各名前空間の完全な .NET Framework で提供される型のサブセットが含まれているためです。

さらに、一部のゲーム エンジンでは、Unity の Mono など、UWP 用の .NET と完全には互換性のないさまざまな種類の .NET が使用されています。 そのため、ゲームを記述している場合は、エディターですべてが正常に動作する可能性がありますが、UWP 用のビルドに移動すると、次のようなエラーが発生する可能性があります。型または名前空間 'Formatters' が名前空間 'System.Runtime.Serialization' に存在しません (アセンブリ参照がありませんか?)

幸いなことに、Unity では、これらの不足している API の一部を拡張メソッドと置換の種類として提供しています。これは、「ユニバーサル Windows プラットフォーム: .NET スクリプト バックエンドの .NET 型がありません」で説明されています。 ただし、必要な機能がここにない場合は、Windows 8.x 用 .NET アプリ 概要、WinRT または .NET for Windows ランタイム API を使用するようにコードを変換する方法について説明します。 (Windows 8 について説明しますが、Windows 10 UWP アプリにも適用できます)。

.NET Standard

一部の API が動作しない理由を理解するには、さまざまな .NET フレーバーと、UWP で .NET がどのように実装されているかを理解することが重要です。 .NET Standard は、クロスプラットフォームであり、さまざまな .NET フレーバーを統合することを目的とした .NET API の正式な仕様です。 .NET の各実装では、特定のバージョンの .NET Standard がサポートされています。 標準と実装の表は、.NET 実装サポートで確認できます。

UWP SDK の各バージョンは、異なるレベルの .NET Standard に準拠しています。 たとえば、16299 SDK (Fall Creators Update) は .NET Standard 2.0 をサポートしています。

ターゲットとする UWP バージョンで特定の .NET API がサポートされているかどうかを確認する場合は、.NET Standard API リファレンス 確認し、そのバージョンの UWP でサポートされている .NET Standard のバージョンを選択できます。

バックエンド構成のスクリプト作成

UWP のビルドで問題が発生した場合は、まず、プレーヤー設定 ([ファイル] [ビルド設定]をオンにして、[ユニバーサル Windows プラットフォーム] を選択し、[プレーヤー設定]を します)。 その他の設定 > 構成では、最初の 3 つのドロップダウン (スクリプト ランタイム バージョンスクリプト バックエンド、および Api 互換性レベルの) はすべて考慮すべき重要な設定です。

スクリプト ランタイム バージョン は、Unity スクリプト バックエンドで使用されるものです。これにより、選択した (ほぼ) 同等のバージョンの .NET Framework サポートを取得できます。 ただし、そのバージョンの .NET Framework のすべての API がサポートされるわけではありません。UWP が対象としている .NET Standard のバージョンの API のみであることに注意してください。

多くの場合、新しい .NET リリースでは、.NET Standard により多くの API が追加され、スタンドアロンと UWP で同じコードを使用できる場合があります。 たとえば、System.Runtime.Serialization.Json 名前空間は.NET Standard 2.0 で導入されました。 スクリプト ランタイム バージョン を .NET 3.5 と同等の (以前のバージョンの .NET Standard を対象とする) を に設定すると、API を使用しようとするとエラーが発生します。これを .NET 4.6 と同等の (.NET Standard 2.0 をサポート) に切り替えると、API が機能します。

スクリプト バックエンド は、.NET または IL2CPPに設定できます。 このトピックでは、.NETを選択していることを前提として、ここで説明する問題が発生することを仮定します。 詳細については、「スクリプト バックエンド」を参照してください。

最後に、Api 互換性レベルの を、ゲームを実行する .NET のバージョンに設定する必要があります。 これは、スクリプト ランタイムバージョンのと一致している必要があります。

一般に、スクリプト ランタイム バージョンAPI 互換性レベルのでは、.NET Framework との互換性を高めるために使用可能な最新バージョンを選択し、より多くの .NET API を使用できるようにする必要があります。

構成: スクリプティング ランタイム バージョン; スクリプティング バックエンド; API 互換性レベル

プラットフォームに依存するコンパイル

UWP を含む複数のプラットフォーム向けに Unity ゲームをビルドする場合は、プラットフォームに依存するコンパイルを使用して、UWP 用のコードが UWP としてビルドされている場合にのみ実行されるようにする必要があります。 これにより、スタンドアロン デスクトップやその他のプラットフォーム用の完全な .NET Framework と、ビルド エラーを取得せずに UWP 用の WinRT API を使用できます。

UWP アプリとして実行する場合にのみコードをコンパイルするには、次のディレクティブを使用します。

#if NETFX_CORE
    // Your UWP code here
#else
    // Your standard code here
#endif

NETFX_CORE は、.NET スクリプト バックエンドに対して C# コードをコンパイルしているかどうかを確認することのみを目的としています。 IL2CPP などの別のスクリプト バックエンドを使用している場合は、代わりに ENABLE_WINMD_SUPPORT を使用します。

一般的な問題と回避策

次のシナリオでは、.NET API が UWP サブセットから欠落している場合に発生する可能性のある一般的な問題と、それらを回避する方法について説明します。

BinaryFormatter を使用したデータのシリアル化

セーブ データをシリアル化して、プレイヤーが簡単に操作できないようにするのが一般的です。 ただし、オブジェクトをバイナリにシリアル化する BinaryFormatterは、.NET Standard バージョン2.0より前では利用できません。 代わりに、XmlSerializer または DataContractJsonSerializer 使用することを検討してください。

private void Save()
{
    SaveData data = new SaveData(); // User-defined object to serialize

    DataContractJsonSerializer serializer = 
      new DataContractJsonSerializer(typeof(SaveData));

    FileStream stream = 
      new FileStream(Application.persistentDataPath, FileMode.CreateNew);

    serializer.WriteObject(stream, data);
    stream.Dispose();
}

I/O 操作

System.IO 名前空間の一部の型 (FileStreamなど) は、以前のバージョンの .NET Standard では使用できません。 ただし、Unity では、ゲームで使用できるように、DirectoryFile、そして FileStream の種類が用意されています。

または、UWP アプリでのみ使用できる Windows.Storage API を使用することもできます。 ただし、これらの API は、アプリが特定のストレージに書き込むのを制限し、ファイル システム全体への無料アクセスを提供しません。 詳細については、ファイル、フォルダー、およびライブラリの を参照してください。

重要な注意事項の 1 つは、Close メソッドは .NET Standard 2.0 以降でのみ使用できるということです (ただし、Unity には拡張メソッドが用意されています)。 代わりに Dispose を使用してください。

スレッド

ThreadPoolなど、System.Threading 名前空間の一部の型は、以前のバージョンの .NET Standard では使用できません。 このような場合は、代わりに Windows.System.Threading 名前空間を使用できます。

プラットフォームに依存するコンパイルを使用して UWP プラットフォームと非 UWP プラットフォームの両方を準備することで、Unity ゲームでのスレッド処理を処理する方法を次に示します。

private void UsingThreads()
{
#if NETFX_CORE
    Windows.System.Threading.ThreadPool.RunAsync(workItem => SomeMethod());
#else
    System.Threading.ThreadPool.QueueUserWorkItem(workItem => SomeMethod());
#endif
}

安全

System.Security の一部。* 名前空間 (System.Security.Cryptography.X509Certificatesなど) は、UWP 用の Unity ゲームをビルドするときに使用できません。 このような場合は、Windows.Security を使用します。* API。同じ機能の多くをカバーします。

次の例では、指定した名前の証明書ストアから証明書を取得するだけです。

private async void GetCertificatesAsync(string certStoreName)
    {
#if NETFX_CORE
        IReadOnlyList<Certificate> certs = await CertificateStores.FindAllAsync();
        IEnumerable<Certificate> myCerts = 
            certs.Where((certificate) => certificate.StoreName == certStoreName);
#else
        X509Store store = new X509Store(certStoreName, StoreLocation.CurrentUser);
        store.Open(OpenFlags.OpenExistingOnly);
        X509Certificate2Collection certs = store.Certificates;
#endif
    }

WinRT セキュリティ API の使用方法の詳細については、「セキュリティ」を参照してください。

ネットワーキング

System.Net の一部。* 名前空間 (System.Net.Mailなど) は、UWP 用の Unity ゲームをビルドするときにも使用できません。 これらの API のほとんどは、対応する Windows.Networking を使用します。* と Windows.Web * WinRT API を使用して同様の機能を取得します。 詳細については、「ネットワークと Web サービスの」を参照してください。

System.Net.Mailの場合は、Windows.ApplicationModel.Email 名前空間を使用します。 詳細については、「メール を送信する」を参照してください。

こちらも参照ください