API .NET hilang di Unity dan UWP

Saat membangun game UWP menggunakan .NET, Anda mungkin menemukan bahwa beberapa API yang mungkin Anda gunakan di editor Unity atau untuk game PC mandiri tidak ada untuk UWP. Itu karena .NET untuk aplikasi UWP menyertakan subset jenis yang disediakan dalam .NET Framework lengkap untuk setiap namespace layanan.

Selain itu, beberapa mesin game menggunakan rasa yang berbeda dari .NET yang tidak sepenuhnya kompatibel dengan .NET untuk UWP, seperti Unity's Mono. Jadi ketika Anda menulis game, semuanya mungkin berfungsi dengan baik di editor, tetapi ketika Anda pergi untuk membangun untuk UWP, Anda mungkin mendapatkan kesalahan seperti ini: Jenis atau namespace 'Formatters' tidak ada di namespace 'System.Runtime.Serialization' (apakah Anda kehilangan referensi rakitan?)

Untungnya, Unity menyediakan beberapa API yang hilang ini sebagai metode ekstensi dan jenis penggantian, yang dijelaskan dalam Platform Windows Universal: Jenis .NET yang Hilang pada Backend Skrip .NET. Namun, jika fungsionalitas yang Anda butuhkan tidak ada di sini, .NET untuk gambaran umum aplikasi Windows 8.x membahas cara anda dapat mengonversi kode anda untuk menggunakan WinRT atau .NET untuk Windows Runtime API. (Ini membahas Windows 8, tetapi berlaku untuk aplikasi UWP Windows 10 juga.)

.NET Standar

Untuk memahami mengapa beberapa API mungkin tidak berfungsi, penting untuk memahami berbagai rasa .NET dan bagaimana UWP mengimplementasikan .NET. Standar .NET adalah spesifikasi formal dari API .NET yang dimaksudkan untuk menjadi lintas platform, dan menyatukan berbagai rasa .NET. Setiap implementasi .NET mendukung versi tertentu dari .NET Standard. Anda dapat melihat tabel standar dan implementasi di dukungan implementasi .NET.

Setiap versi UWP SDK sesuai dengan tingkat .NET Standard yang berbeda. Misalnya, SDK 16299 (Fall Creators Update) mendukung .NET Standard 2.0.

Jika Anda ingin tahu apakah .NET API tertentu didukung dalam versi UWP yang Anda targetkan, Anda dapat memeriksa Referensi API Standar .NET dan memilih versi .NET Standard yang didukung oleh versi UWP tersebut.

Membuat skrip konfigurasi backend

Hal pertama yang harus Anda lakukan jika Mengalami masalah saat membangun UWP adalah memeriksa Pengaturan Pemutar (Pengaturan Build File>, pilih Platform Windows Universal, lalu Pengaturan Pemutar). Di bawah Konfigurasi Pengaturan > Lain, tiga dropdown pertama (Versi Runtime Skrip, Backend Skrip, dan Tingkat Kompatibilitas Api) semuanya merupakan pengaturan penting yang perlu dipertimbangkan.

Versi Runtime Skrip adalah apa yang digunakan backend skrip Unity yang memungkinkan Anda mendapatkan versi dukungan .NET Framework yang setara (kira-kira) yang Anda pilih. Namun, perlu diingat bahwa tidak semua API dalam versi .NET Framework tersebut akan didukung, hanya yang ada dalam versi .NET Standard yang ditargetkan UWP Anda.

Sering kali dengan rilis .NET baru, lebih banyak API ditambahkan ke .NET Standard yang mungkin memungkinkan Anda menggunakan kode yang sama di seluruh mandiri dan UWP. Misalnya, namespace System.Runtime.Serialization.Json diperkenalkan di .NET Standard 2.0. Jika Anda mengatur Versi Runtime Skrip ke .NET 3.5 Setara (yang menargetkan versi .NET Standard yang lebih lama), Anda akan mendapatkan kesalahan saat mencoba menggunakan API; alihkan ke .NET 4.6 Equivalent (yang mendukung .NET Standard 2.0), dan API akan berfungsi.

Backend Scripting dapat berupa .NET atau IL2CPP. Untuk topik ini, kami berasumsi Anda telah memilih .NET, karena di situlah masalah yang dibahas di sini muncul. Lihat Membuat Skrip Backend untuk informasi selengkapnya.

Terakhir, Anda harus mengatur Tingkat Kompatibilitas Api ke versi .NET yang Anda inginkan untuk dijalankan game Anda. Ini harus cocok dengan Versi Runtime Skrip.

Secara umum, untuk Versi Runtime Skrip dan Tingkat Kompatibilitas Api, Anda harus memilih versi terbaru yang tersedia sehingga memiliki lebih banyak kompatibilitas dengan .NET Framework, dan dengan demikian memungkinkan Anda untuk menggunakan lebih banyak API .NET.

Konfigurasi: Membuat Skrip Versi Runtime; Membuat Skrip Backend; Tingkat Kompatibilitas Api

Kompilasi tergantung platform

Jika Anda membangun game Unity untuk beberapa platform, termasuk UWP, Anda harus menggunakan kompilasi tergantung platform untuk memastikan bahwa kode yang ditujukan untuk UWP hanya dijalankan ketika game dibangun sebagai UWP. Dengan cara ini, Anda dapat menggunakan .NET Framework penuh untuk desktop mandiri dan platform lain, dan API WinRT untuk UWP, tanpa mendapatkan kesalahan build.

Gunakan arahan berikut untuk hanya mengkompilasi kode saat berjalan sebagai aplikasi UWP:

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

Catatan

NETFX_CORE hanya dimaksudkan untuk memeriksa apakah Anda mengkompilasi kode C# terhadap backend skrip .NET. Jika Anda menggunakan backend skrip yang berbeda, seperti IL2CPP, gunakan ENABLE_WINMD_SUPPORT sebagai gantinya.

Masalah umum dan solusi

Skenario berikut menjelaskan masalah umum yang mungkin muncul di mana API .NET hilang dari subset UWP, dan cara untuk mengatasinya.

Serialisasi data menggunakan BinaryFormatter

Adalah umum bagi game untuk membuat serialisasi menyimpan data sehingga pemain tidak dapat dengan mudah memanipulasinya. Namun, BinaryFormatter, yang menserialisasikan objek ke dalam biner, tidak tersedia di versi .NET Standard yang lebih lama (sebelum 2.0). Pertimbangkan untuk menggunakan XmlSerializer atau DataContractJsonSerializer sebagai gantinya.

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();
}

Operasi I/O

Beberapa jenis di namespace System.IO , seperti FileStream, tidak tersedia di versi .NET Standard yang lebih lama. Namun, Unity menyediakan jenis Direktori, File, dan FileStream sehingga Anda dapat menggunakannya dalam permainan Anda.

Atau, Anda dapat menggunakan WINDOWS.Storage API, yang hanya tersedia untuk aplikasi UWP. Namun, API ini membatasi aplikasi untuk menulis ke penyimpanan spesifik mereka, dan tidak memberinya akses gratis ke seluruh sistem file. Lihat File, folder, dan pustaka untuk informasi selengkapnya.

Salah satu catatan penting adalah bahwa metode Tutup hanya tersedia di .NET Standard 2.0 dan yang lebih baru (meskipun Unity menyediakan metode ekstensi). Gunakan Buang sebagai gantinya.

Pengaluran

Beberapa jenis di namespace System.Threading , seperti ThreadPool, tidak tersedia di versi .NET Standard yang lebih lama. Dalam kasus ini, Anda dapat menggunakan namespace Windows.System.Threading sebagai gantinya.

Berikut adalah cara Anda dapat menangani utas dalam game Unity, menggunakan kompilasi yang bergantung pada platform untuk mempersiapkan platform UWP dan non-UWP:

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

Keamanan

Beberapa System.Security. * namespace layanan, seperti System.Security.Cryptography.X509Certificates, tidak tersedia saat Anda membangun game Unity untuk UWP. Dalam kasus ini, gunakan Windows.Security. * API, yang mencakup banyak fungsionalitas yang sama.

Contoh berikut hanya mendapatkan sertifikat dari penyimpanan sertifikat dengan nama yang diberikan:

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
    }

Lihat Keamanan untuk informasi selengkapnya tentang menggunakan API keamanan WinRT.

Jaringan

Beberapa System.Net. * namespace layanan, seperti System.Net.Mail, juga tidak tersedia saat membangun game Unity untuk UWP. Untuk sebagian besar API ini, gunakan Windows.Networking yang sesuai. * dan Windows.Web. * Api WinRT untuk mendapatkan fungsionalitas serupa. Lihat Jaringan dan layanan web untuk informasi selengkapnya.

Dalam kasus System.Net.Mail, gunakan namespace Windows.ApplicationModel.Email. Lihat Mengirim email untuk informasi selengkapnya.

Lihat juga