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 または Windows ランタイム API 用 .NET を使用するようにコードを変換できます (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 のビルドで問題が発生した場合に最初に行うことは、[Player Settings] (プレーヤーの設定) ([File] (ファイル) > [Build Settings] (ビルド設定)、[Universal Windows Platform] (ユニバーサル Windows プラットフォーム)、[Player Settings] (プレーヤーの設定) の順に選択) を確認することです。 [Other Settings] (その他の設定) > [Configuration] (構成) にある、最初の 3 つのドロップダウン リスト ([Scripting Runtime Version] (スクリプト ランタイム バージョン)、[Scripting Backend] (スクリプト バックエンド)、[Api Compatibility Level] (API 互換性レベル)) はいずれも考慮する必要がある重要な設定です。
Scripting ランタイム バージョンは、Unity スクリプト バックエンドで使用されるものです。これにより、選択した (ほぼ) 同等のバージョンの .NET Framework サポートを取得できます。 ただし、そのバージョンの .NET Framework のすべての API がサポートされるわけではありません。UWP が対象としている .NET Standard のバージョンの API のみであることに注意してください。
多くの場合、新しい .NET リリースでは、.NET Standard により多くの API が追加され、スタンドアロンと UWP で同じコードを使用できる場合があります。 たとえば、 System.Runtime.Serialization.Json 名前空間が .NET Standard 2.0 で導入されました。 Scripting Runtime Version を .NET 3.5 Equivalent (以前のバージョンの .NET Standard を対象とする) に設定すると、API を使用しようとするとエラーが発生し、それを .NET 4.6 Equivalent (.NET Standard 2.0 をサポート) に切り替えると、API が機能します。
Scripting Backend には、.NET または IL2CPP を指定できます。 このトピックでは、ここで説明する問題が発生するため、 .NET を選択していることを前提としています。 詳細については、「 Scripting Backends 」を参照してください。
最後に、 Api 互換性レベル ゲームを実行する .NET のバージョンを設定する必要があります。 これは、 Scripting ランタイム バージョンと一致する必要があります。
一般に、 Scripting Runtime Version および Api 互換性レベルでは、.NET Framework との互換性を高めるために使用可能な最新バージョンを選択し、より多くの .NET API を使用できるようにする必要があります。
プラットフォームに依存するコンパイル
UWP を含む複数のプラットフォーム向けに Unity ゲームをビルドする場合は、プラットフォームに依存するコンパイルを使用して、UWP 用のコードが UWP としてビルドされている場合にのみ実行されるようにする必要があります。 これにより、スタンドアロン デスクトップやその他のプラットフォーム用の完全な .NET Framework と、ビルド エラーを取得せずに UWP 用の WinRT API を使用できます。
UWP アプリとして実行する場合にのみコードをコンパイルするには、次のディレクティブを使用します。
#if NETFX_CORE
// Your UWP code here
#else
// Your standard code here
#endif
Note
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 では Directory、 File、および FileStream 型が提供されるため、ゲームで使用できます。
または、UWP アプリでのみ使用できる Windows.Storage API を使用することもできます。 ただし、これらの API は、アプリが特定のストレージに書き込むのを制限し、ファイル システム全体への無料アクセスを提供しません。 詳細については、「 Files、フォルダー、およびライブラリ を参照してください。
重要な注意事項の 1 つは、 Close メソッドは .NET Standard 2.0 以降でのみ使用できるということです (ただし、Unity には拡張メソッドが用意されています)。 代わりに Dispose を使用してください。
スレッド化
System.Threading 名前空間の一部の型 (ThreadPool など) は、以前のバージョンの .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 の使用方法の詳細については、「 Security 」を参照してください。
ネットワーク
System.Net.* 名前空間の一部 (System.Net.Mail など) も、UWP 用に Unity ゲームを構築する場合は利用できません。 これらの API のほとんどは、対応する Windows.Networking. を使用します* および Windows.Web.* 同様の機能を取得するための WinRT API。 詳細については、「 Networking と Web サービス を参照してください。
System.Net.Mail の場合は、Windows.ApplicationModel.Email名前空間を使用します。 詳細については、「 メールの送信 」を参照してください。