Aracılığıyla paylaş


Unity ve UWP'de eksik .NET API'leri

.NET kullanarak bir UWP oyunu oluştururken Unity düzenleyicisinde veya tek başına bir bilgisayar oyunu için kullanabileceğiniz bazı API'lerin UWP için mevcut olmadığını fark edebilirsiniz. Bunun nedeni, UWP uygulamaları için .NET'in her ad alanı için tam .NET Framework'te sağlanan türlerin bir alt kümesini içermesidir.

Buna ek olarak, bazı oyun motorları Unity Mono gibi UWP için .NET ile tam olarak uyumlu olmayan farklı .NET türleri kullanır. Bu nedenle, oyununuzu yazarken düzenleyicide her şey yolunda gidebilir; ancak UWP için derleme yaptığınızda şu hataları alabilirsiniz: 'System.Runtime.Serialization' ad alanında 'Formatters' türü veya ad alanı yok (derleme başvurusu eksik mi?)

Neyse ki Unity, Evrensel Windows Platformu: .NET Betik Arka Ucuüzerinde eksik .NET Türleri bölümünde açıklanan uzantı yöntemleri ve değiştirme türleri olarak bu eksik API'lerden bazılarını sağlar. Ancak, ihtiyacınız olan işlevsellik burada değilse, Windows 8.x uygulamaları için .NET'e genel bakış kodunuzu Windows Çalışma Zamanı API'leri için WinRT veya .NET kullanacak şekilde dönüştürme yöntemlerini açıklar. (Windows 8'i açıklar, ancak Windows 10 UWP uygulamaları için de geçerlidir.)

.NET Standard

Bazı API'lerin neden çalışmadığını anlamak için farklı .NET tatlarını ve UWP'nin .NET'i nasıl uyguladığını anlamak önemlidir. .NET Standard , platformlar arası olması ve farklı .NET çeşitlerini birleştirmesi amaçlı .NET API'lerinin resmi bir belirtimidir. .NET'in her uygulaması .NET Standard'ın belirli bir sürümünü destekler. 'da standartlar ve uygulamaların bir tablosunu, .NET uygulama desteği'de görebilirsiniz.

UWP SDK'sının her sürümü farklı bir .NET Standard düzeyine uygundur. Örneğin, 16299 SDK 'sı (Fall Creators Update) .NET Standard 2.0'ı destekler.

Hedeflediğiniz UWP sürümünde belirli bir .NET API'sinin desteklenip desteklenmediğini öğrenmek istiyorsanız .NET Standart API Başvurusu denetleyerek UWP'nin bu sürümü tarafından desteklenen .NET Standard sürümünü seçebilirsiniz.

Betik yürütme arka planı yapılandırması

UWP oluşturma konusunda sorun yaşıyorsanız yapmanız gereken ilk şey, Oynatıcı Ayarları ( Dosya Derleme AyarlarıEvrensel Windows Platformuseçin ve ardından Player Ayarları). Diğer Ayarlar > Yapılandırmaaltında, ilk üç açılan menü (Betik Çalışma Zamanı Sürümü, Betik Arka Uçve Api Uyumluluk Düzeyi) dikkate alınması gereken önemli ayarlardır.

Betik Çalışma Zamanı Sürümü, Unity betik arka ucu tarafından kullanılan ve seçtiğiniz .NET Framework desteğinin (kabaca) eşdeğer sürümünü almanıza olanak tanıyan yöntemdir. Ancak, .NET Framework'ün bu sürümündeki tüm API'lerin desteklenmeyeceğini, yalnızca UWP'nizin hedeflediği .NET Standard sürümündeki api'lerin desteklenmediğini unutmayın.

Yeni .NET sürümleriyle genellikle .NET Standard'a daha fazla API eklenir ve bu api tek başına ve UWP'de aynı kodu kullanmanıza olanak tanıyabilir. Örneğin, System.Runtime.Serialization.Json ad alanı .NET Standard 2.0'da kullanıma sunulmuştur. Betik Çalışma Zamanı Sürümü .NET 3.5 Eşdeğer olarak ayarlarsanız (.NET Standard'ın önceki bir sürümünü hedefler), API'yi kullanmaya çalışırken bir hata alırsınız; .NET 4.6 Eşdeğer (.NET Standard 2.0'ı destekleyen) geçiş yaptığınızda API çalışır.

Betik Arka Ucu .NET veya IL2CPPolabilir. Bu konu için, burada ele alınan sorunların ortaya çıktığı yer olduğu için .NET'i seçmiş olduğunuzu varsayıyoruz. Daha fazla bilgi için bkz. Betik Arka Uçları.

Son olarak, Api Uyumluluk Düzeyi oyununuzun çalışmasını istediğiniz .NET sürümüne ayarlamanız gerekir. Bu, Betik Çalışma Zamanı Sürümüile eşleşmelidir.

Genel olarak, Betik Çalışma Zamanı Sürümü ve Api Uyumluluk Düzeyiiçin . NET Framework ile daha fazla uyumluluk elde etmek için en son sürümü seçmeniz ve böylece daha fazla .NET API'sini kullanmanıza izin vermelisiniz.

Yapılandırması: Betik Çalışma Zamanı Sürümü; Betik Arka Planı; API Uyumluluk Düzeyi

Platforma bağımlı derleme

Unity oyununuzu UWP dahil olmak üzere birden çok platform için oluşturuyorsanız, UWP için tasarlanan kodun yalnızca oyun UWP olarak derlendiğinde çalıştırıldığından emin olmak için platforma bağımlı derlemeyi kullanmak istersiniz. Bu şekilde, derleme hataları almadan bağımsız çalışan masaüstü uygulamaları ve diğer platformlar için tüm .NET Framework'ü ve UWP için WinRT API'lerini kullanabilirsiniz.

Yalnızca UWP uygulaması olarak çalışırken kod derlemek için aşağıdaki yönergeleri kullanın:

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

Uyarı

NETFX_CORE yalnızca .NET betik arka ucuna karşı C# kodu derleyip derlemediğinizden denetlemek içindir. IL2CPP gibi farklı bir betik arka ucu kullanıyorsanız bunun yerine ENABLE_WINMD_SUPPORT kullanın.

Yaygın sorunlar ve geçici çözümler

Aşağıdaki senaryolarda, UWP alt kümesinde .NET API'lerinin eksik olmasıyla ilgili ortaya çıkabilecek yaygın sorunlar ve bunların arasında gezinme yolları açıklanmaktadır.

BinaryFormatter kullanarak veri serileştirme

Oyunların kaydetme verilerini, oyuncuların kolayca manipüle edememesi için serileştirmesi yaygındır. Ancak, bir nesneyi ikili olarak serileştiren BinaryFormatter, .NET Standard'ın önceki sürümlerinde (2.0'ın öncesinde) kullanılamaz. Bunun yerine XmlSerializer veya DataContractJsonSerializer kullanmayı göz önünde bulundurun.

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

G/Ç işlemleri

System.IO ad alanında FileStreamgibi bazı türler .NET Standard'ın önceki sürümlerinde kullanılamaz. Ancak Unity, Directory, Dosyave FileStream türlerini sağlar, böylece bunları oyununuzda kullanabilirsiniz.

Alternatif olarak, yalnızca UWP uygulamalarında kullanılabilen Windows.Storage API'lerini kullanabilirsiniz. Ancak, bu API'ler uygulamayı kendi depolama alanına yazmayla kısıtlar ve tüm dosya sistemine ücretsiz erişim vermez. Daha fazla bilgi için bkz. dosyalar, klasörler ve kitaplıklar .

Önemli bir not, Kapatma yönteminin yalnızca .NET Standard 2.0 ve sonraki sürümlerde kullanılabilir olduğudur (unity bir uzantı yöntemi sağlar). Bunun yerine Dispose kullanın.

İplilik

System.Threading ad alanları içindeki ThreadPoolgibi bazı türler .NET Standard'ın önceki sürümlerinde kullanılamaz. Bu durumlarda, bunun yerine Windows.System.Threading ad alanını kullanabilirsiniz.

Hem UWP hem de UWP olmayan platformlara hazırlanmak için platforma uygun derlemeyi kullanarak Unity oyununda iş parçacıklarını yönetmeyi şu şekilde işleyebilirsiniz:

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

Güvenlik

Bazı System.Security.* ad alanları, örneğin System.Security.Cryptography.X509Certificates, UWP için bir Unity oyunu oluşturduğunuzda kullanılamaz. Bu gibi durumlarda Windows.Security kullanın. aynı işlevlerin çoğunu kapsayan* API'ler.

Aşağıdaki örnek, belirtilen ada sahip bir sertifika deposundan sertifikaları alır.

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 güvenlik API'lerini kullanma hakkında daha fazla bilgi için bkz. Güvenlik.

Ağ Kurma

bazı ad alanları, System.Net.* System.Net.Mailgibi, UWP için Unity oyunu oluştururken de kullanılamaz. Bu API'lerin çoğu için, benzer işlevleri elde etmek amacıyla ilgili Windows.Networking.* ve Windows.Web.* WinRT API'lerini kullanın. Daha fazla bilgi için bkz. Ağ ve web hizmetleri.

System.Net.Maildurumunda Windows.ApplicationModel.Email ad alanını kullanın. Daha fazla bilgi için bakın. E-posta gönderme.

Ayrıca bakınız

  • Evrensel Windows Platformu': .NET Betik Arka Uç Üzerinde Eksik .NET Türleri
  • UWP uygulamaları için .NET'e genel bakış