Unity や UWP で不足している .NET APIMissing .NET APIs in Unity and UWP

.NET を使用して UWP ゲームを作成する場合、Unity エディターで使用できる一部の API やスタンドアロン PC ゲーム用の一部の API が UWP 用に存在しないことがあります。When building a UWP game using .NET, you may find that some APIs that you might use in the Unity editor or for a standalone PC game are not present for UWP. これは、UWP アプリ用 .NET には、名前空間ごとに、フル バージョンの .NET Framework で提供される型のサブセットが含まれるためです。That's because .NET for UWP apps includes a subset of the types provided in the full .NET Framework for each namespace.

さらに、Unity の Mono など一部のゲーム エンジンは、UWP 用の .NET とは完全な互換性のない別の種類の .NET を使用しています。Additionally, some game engines use different flavors of .NET that aren't fully compatible with .NET for UWP, such as Unity's Mono. したがって、ゲームを作成しているときにすべて正常に動作エディターが、UWP のビルドに移動するときにこのようなエラーが発生する可能性があります。型または名前空間する 'フォーマッタ' が 'System.Runtime.Serialization' 名前空間に存在しません (する、アセンブリ参照が存在しますか?)So when you're writing your game, everything might work fine in the editor, but when you go to build for UWP, you might get errors like this: The type or namespace 'Formatters' does not exist in the namespace 'System.Runtime.Serialization' (are you missing an assembly reference?)

さいわい、拡張メソッドとで説明されている置換型としての Unity はこれらの不足している Api の一部ユニバーサル Windows プラットフォーム.NET バックエンドをスクリプトで .NET の種類が見つからないします。Fortunately, Unity provides some of these missing APIs as extension methods and replacement types, which are described in Universal Windows Platform: Missing .NET Types on .NET Scripting Backend. ただし、必要な機能がここにない場合は、「Windows ストア アプリ用 .NET の概要」で説明している方法に従って、WinRT または UWP 用 .NET の API を使用するようにコードを変換できます However, if the functionality you need is not here, .NET for Windows 8.x apps overview discusses ways you can convert your code to use WinRT or .NET for UWP APIs. (このページでは、Windows 8 について説明していますが、Windows 10 の UWP アプリにも適用できます)。(It discusses Windows 8, but is applicable to Windows 10 UWP apps as well.)

.NET Standard.NET Standard

一部の API が動作しない理由を理解するには、.NET のさまざまな種類と、UWP での .NET の実装方法を理解しておく必要があります。To understand why some APIs might not be working, it's important to understand the different .NET flavors and how UWP implements .NET. .NET Standard は、クロスプラットフォームに対応し、さまざまな種類の .NET を統一することを目的とした、.NET API の正式な仕様です。The .NET Standard is a formal specification of .NET APIs that is meant to be cross-platform, and unify the different .NET flavors. .NET の各実装では、特定のバージョンの .NET Standard をサポートしています。Each implementation of .NET supports a certain version of the .NET Standard. 標準や実装の一覧表については、「.NET 実装のサポート」をご覧ください。You can see a table of standards and implementations at .NET implementation support.

UWP SDK の各バージョンは、.NET Standard のさまざまなレベルに準拠しています。Each version of the UWP SDK conforms to a different level of .NET Standard. たとえば、16299 SDK (Fall Creators Update) では、.NET Standard 2.0 をサポートしています。For example, the 16299 SDK (the Fall Creators Update) supports .NET Standard 2.0.

ターゲットにしている UWP バージョンで特定の .NET API がサポートされるかどうかを確認する場合は、.NET Standard API リファレンスを参照して、そのバージョンの UWP でサポートされている .NET Standard のバージョンを選択します。If you want to know if a certain .NET API is supported in the UWP version that you're targeting, you can check the .NET Standard API Reference and select the version of the .NET Standard that's supported by that version of UWP.

スクリプト バックエンドの構成Scripting backend configuration

UWP のビルドで問題が発生した場合に最初に行うことは、 [Player Settings] (プレーヤーの設定) ( [File] (ファイル) > [Build Settings] (ビルド設定)[Universal Windows Platform] (ユニバーサル Windows プラットフォーム)[Player Settings] (プレーヤーの設定) の順に選択) を確認することです。The first thing you should do if you're having trouble building for UWP is check the Player Settings (File > Build Settings, select Universal Windows Platform, and then Player Settings). [Other Settings] (その他の設定) > [Configuration] (構成) にある、最初の 3 つのドロップダウン リスト ( [Scripting Runtime Version] (スクリプト ランタイム バージョン)[Scripting Backend] (スクリプト バックエンド)[Api Compatibility Level] (API 互換性レベル) ) はいずれも考慮する必要がある重要な設定です。Under Other Settings > Configuration, the first three dropdowns (Scripting Runtime Version, Scripting Backend, and Api Compatibility Level) are all important settings to consider.

[Scripting Runtime Version] (スクリプト ランタイム バージョン) は、Unity スクリプト バックエンドが使用するもので、選択した .NET Framework サポートと (ほぼ) 同等のバージョンを取得できます。The Scripting Runtime Version is what the Unity scripting backend uses which allows you to get the (roughly) equivalent version of .NET Framework support that you choose. ただし、そのバージョンの .NET Framework のすべての API がサポートされるわけではない点に注意してください。UWP がターゲットにしている .NET Standard のバージョンでサポートされている API のみがサポートされます。However, keep in mind that not all APIs in that version of the .NET Framework will be supported, only those in the version of .NET Standard that your UWP is targeting.

新しい .NET リリースでは、通常、より多くの API が .NET Standard に追加され、スタンドアロンと UWP で同じコードを使用できるようになっている場合があります。Often with new .NET releases, more APIs are added to .NET Standard which might allow you to use the same code across standalone and UWP. たとえば、System.Runtime.Serialization.Json 名前空間は .NET Standard 2.0 で導入されました。For example, the System.Runtime.Serialization.Json namespace was introduced in .NET Standard 2.0. [Scripting Runtime Version] (スクリプト ランタイム バージョン)[.NET 3.5 Equivalent] (.NET 3.5 相当) (以前のバージョンの .NET Standard をターゲットにする) に設定した場合、API を使用しようとしたときにエラーが表示されます。 [.NET 4.6 Equivalent] (.NET 4.6 相当) (.NET Standard 2.0 をサポートする) に切り替えると、API は動作します。If you set the Scripting Runtime Version to .NET 3.5 Equivalent (which targets an earlier version of the .NET Standard), you will get an error when trying to use the API; switch it to .NET 4.6 Equivalent (which supports .NET Standard 2.0), and the API will work.

[Scripting Backend] (スクリプト バックエンド) は、 [.NET] または [IL2CPP] に設定できます。The Scripting Backend can be .NET or IL2CPP. このトピックでは、.NET で発生する問題について説明しているため、 [.NET] を選択していることを想定しています。For this topic, we assume you have chosen .NET, since that's where the problems discussed here arise. 詳細については、スクリプト バックエンドに関するページをご覧ください。See Scripting Backends for more information.

最後に、 [Api Compatibility Level] (API 互換性レベル) を、ゲームを実行する .NET のバージョンに設定します。Finally, you should set the Api Compatibility Level to the version of .NET that you want your game to run on. これは、 [Scripting Runtime Version] (スクリプト ランタイム バージョン) と一致している必要がありますThis should match the Scripting Runtime Version.

一般的に、 [Scripting Runtime Version] (スクリプト ランタイム バージョン)[Api Compatibility Level] (API 互換性レベル) については、.NET Framework との互換性を高め、より多くの .NET API を使用できるようにするために、利用可能な最新バージョンを選択してください。In general, for Scripting Runtime Version and Api Compatibility Level, you should select the latest version available so as to have more compatibility with the .NET Framework, and thus allow you to use more .NET APIs.

構成:スクリプトのランタイム バージョンです。スクリプトのバックエンドApi の互換性レベル

プラットフォーム依存のコンパイルPlatform-dependent compilation

UWP を含む複数のプラットフォーム用に Unity ゲームを作成する場合、ゲームが UWP として作成されたときにのみ、UWP 向けのコードが実行されるようにするために、プラットフォーム依存のコンパイルを使用できます。If you're building your Unity game for multiple platforms, including UWP, you'll want to use platform-dependent compilation to make sure that code intended for UWP is only run when the game is built as a UWP. これにより、スタンドアロンのデスクトップやその他のプラットフォーム用にフル バージョンの .NET Framework を、UWP 用に WinRT API を使用でき、ビルド エラーが発生することはありません。This way, you can use the full .NET Framework for standalone desktop and other platforms, and WinRT APIs for UWP, without getting build errors.

UWP アプリとして実行する場合にのみコードをコンパイルするには、次のディレクティブを使用します。Use the following directives to only compile code when running as a UWP app:

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

注意

NETFX_CORE コンパイルするかどうかにチェックだけを目的とC#.NET スクリプト バックエンドに対してコード。NETFX_CORE is only meant to check if you're compiling C# code against the .NET scripting backend. IL2CPP など、他のスクリプト バックエンドを使用している場合は、代わりに UNITY_WSA_10_0 を使用します。If you're using a different scripting backend, such as IL2CPP, use UNITY_WSA_10_0 instead.

プラットフォーム依存のコンパイル ディレクティブの一覧については、プラットフォーム依存のコンパイルに関するページをご覧ください。For the full list of platform-dependent compilation directives, see Platform dependent compilation.

一般的な問題と回避方法Common issues and workarounds

次のシナリオでは、UWP のサブセットに .NET API がない場合に発生する可能性がある一般的な問題と、それらを回避する方法について説明します。The following scenarios describe common issues that might arise where .NET APIs are missing from the UWP subset, and ways to get around them.

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

ゲームでは、プレイヤーが簡単に操作ができないように、セーブ データをシリアル化するのが一般的です。It is common for games to serialize save data so that players can't easily manipulate it. ただし、オブジェクトをバイナリにシリアル化する BinaryFormatter は、.NET Standard の以前のバージョン (2.0 よりも前) では使用できません。However, BinaryFormatter, which serializes an object into binary, is not available in earlier versions of the .NET Standard (prior to 2.0). 代わりに、XmlSerializer または DataContractJsonSerializer を使用することを検討してください。Consider using XmlSerializer or DataContractJsonSerializer instead.

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 操作I/O operations

System.IO 名前空間の一部の型 (FileStream など) は、以前のバージョンの .NET Standard では使用できません。Some types in the System.IO namespace, such as FileStream, are not available in earlier versions of the .NET Standard. ただし、Unity では、DirectoryFile、および FileStream 型を提供しているため、ゲームでこれらを使用できます。However, Unity does provide the Directory, File, and FileStream types so you can use them in your game.

また、UWP アプリでのみ利用できる Windows.Storage API を使用することもできます。Alternatively, you can use the Windows.Storage APIs, which are only available to UWP apps. ただし、これらの API では、アプリの書き込みは特定の記憶域に制限され、ファイル システム全体に自由にアクセスすることはできません。However, these APIs restrict the app to writing to their specific storage, and do not give it free access to the entire file system. 詳しくは、「ファイル、フォルダー、およびライブラリ」をご覧ください。See Files, folders, and libraries for more information.

重要な注意事項は、Close メソッドは、.NET Standard 2.0 以降でのみ利用できることです (ただし、Unity は拡張メソッドを提供しています)。One important note is that the Close method is only available in .NET Standard 2.0 and later (though Unity provides an extension method). 代わりに、Dispose を使用します。Use Dispose instead.

スレッドThreading

System.Threading 名前空間の一部の型 (ThreadPool など) は、以前のバージョンの .NET Standard では使用できません。Some types in the System.Threading namespaces, such as ThreadPool, are not available in earlier versions of the .NET Standard. このような場合は、代わりに Windows.System.Threading 名前空間を使用できます。In these cases, you can use the Windows.System.Threading namespace instead.

以下に、プラットフォーム依存のコンパイルを使用し、UWP と UWP 以外の両方のプラットフォーム用に準備して、Unity ゲームでスレッド化を処理する方法を示します。Here's how you could handle threading in a Unity game, using platform-dependent compilation to prepare for both UWP and non-UWP platforms:

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

セキュリティSecurity

System.Security. * 名前空間の一部 (System.Security.Cryptography.X509Certificates など) は、UWP 用に Unity ゲームを構築する場合は利用できません。Some of the System.Security.* namespaces, such as System.Security.Cryptography.X509Certificates, are not available when you build a Unity game for UWP. このような場合は、同じ機能の多くをカバーしている Windows.Security. * API を使用します。In these cases, use the Windows.Security.* APIs, which cover much of the same functionality.

次の例では、指定した名前の証明書ストアからの証明書だけを取得します。The following example simply gets the certificates from a certificate store with the given name:

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 の使用方法の詳細については、「セキュリティ」を参照してください。See Security for more information about using the WinRT security APIs.

ネットワークNetworking

System.Net. * 名前空間の一部 (System.Net.Mail など) も、UWP 用に Unity ゲームを構築する場合は利用できません。Some of the System.Net.* namespaces, such as System.Net.Mail, are also not available when building a Unity game for UWP. これらの API のほとんどについては、対応する Windows.Networking. * と Windows.Web. * WinRT API を使用して同様の機能を実現できます。For most of these APIs, use the corresponding Windows.Networking.* and Windows.Web.* WinRT APIs to get similar functionality. 詳細については、「ネットワークと Web サービス」を参照してください。See Networking and web services for more information.

System.Net.Mail の場合は、Windows.ApplicationModel.Email 名前空間を使用します。In the case of System.Net.Mail, use the Windows.ApplicationModel.Email namespace. 詳細については、「メールの送信」を参照してください。See Send email for more information.

関連項目See also