HoloLens (1. nesil) ve Azure 308: Cihazlar arası bildirimler
Not
Karma Gerçeklik Academy öğreticileri HoloLens (1. nesil) ve Karma Gerçeklik Immersive Headsets düşünülerek tasarlanmıştır. Bu nedenle, bu cihazlar için geliştirme konusunda hala rehberlik arayan geliştiriciler için bu öğreticileri yerinde bırakmanın önemli olduğunu hissediyoruz. Bu öğreticiler, HoloLens 2 için kullanılan en son araç kümeleri veya etkileşimlerle güncelleştirilmez. Desteklenen cihazlarda çalışmaya devam etmek için bakımları yapılacaktır. Gelecekte HoloLens 2 için nasıl geliştirileceğini gösteren yeni bir öğretici serisi sunulacaktır. Bu bildirim, bu öğreticiler gönderildiğinde bu öğreticilerin bağlantısıyla güncelleştirilir.
Bu kursta Azure Notification Hubs, Azure Tabloları ve Azure İşlevleri kullanarak karma gerçeklik uygulamasına Notification Hubs özellikleri eklemeyi öğreneceksiniz.
Azure Notification Hubs , geliştiricilerin tüm platformlara hedeflenen ve kişiselleştirilmiş anında iletme bildirimleri göndermesine olanak tanıyan ve tümü bulut içinde çalışan bir Microsoft hizmetidir. Bu, geliştiricilerin senaryoya bağlı olarak son kullanıcılarla ve hatta çeşitli uygulamalar arasında iletişim kurmasına etkili bir şekilde olanak sağlayabilir. Daha fazla bilgi için Azure Notification Hubssayfasını ziyaret edin.
Azure İşlevleri, geliştiricilerin Azure'da 'işlevler' adlı küçük kod parçalarını çalıştırmasına olanak tanıyan bir Microsoft hizmetidir. Bu, birçok avantajı olabilecek yerel uygulamanız yerine çalışmayı buluta devretmek için bir yol sağlar. Azure İşlevleri C#, F#, Node.js, Java ve PHP gibi çeşitli geliştirme dillerini destekler. Daha fazla bilgi için Azure İşlevlerisayfasını ziyaret edin.
Azure Tabloları , geliştiricilerin yapılandırılmış SQL olmayan verileri bulutta depolamasına olanak tanıyan ve her yerden kolayca erişilebilir olmasını sağlayan bir Microsoft bulut hizmetidir. Hizmet, tabloların gerektiğinde evrimini sağlayan şemasız bir tasarıma sahiptir ve bu nedenle çok esnektir. Daha fazla bilgi için Azure Tablolarısayfasını ziyaret edin
Bu kursu tamamladıktan sonra bir karma gerçeklik çevreleyici başlık uygulamasına ve aşağıdakileri yapabilecek bir Masaüstü bilgisayar uygulamasına sahip olacaksınız:
Masaüstü bilgisayar uygulaması, kullanıcının fareyi kullanarak bir nesneyi 2B alanda (X ve Y) taşımasına olanak tanır.
Nesnelerin bilgisayar uygulaması içindeki hareketi, nesne kimliği, tür ve dönüştürme bilgilerini (X ve Y koordinatları) içeren bir dize biçiminde olacak JSON kullanılarak buluta gönderilir.
Masaüstü uygulamasıyla aynı görünüme sahip olan karma gerçeklik uygulaması, Notification Hubs hizmetinden (Desktop PC uygulaması tarafından yeni güncelleştirilmiş olan) nesne hareketiyle ilgili bildirimler alır.
Nesne kimliği, tür ve dönüştürme bilgilerini içeren bir bildirim aldıktan sonra, karma gerçeklik uygulaması alınan bilgileri kendi sahnesine uygular.
Uygulamanızda, sonuçları tasarımınızla nasıl tümleştireceğiniz size bağlı. Bu kurs, bir Azure Hizmetini Unity Projenizle tümleştirmeyi öğretmek için tasarlanmıştır. Karma gerçeklik uygulamanızı geliştirmek için bu kurstan edindiğiniz bilgileri kullanmak sizin işinizdir. Bu kurs, diğer Karma Gerçeklik Laboratuvarlarını doğrudan içermeyen bağımsız bir öğreticidir.
Cihaz desteği
Kurs | HoloLens | Çevreleyici kulaklıklar |
---|---|---|
MR ve Azure 308: Cihazlar arası bildirimler | ✔️ | ✔️ |
Not
Bu kurs öncelikli olarak Windows Mixed Reality çevreleyici (VR) kulaklıklara odaklansa da, bu kursta öğrendiklerini Microsoft HoloLens uygulayabilirsiniz. Kursu takip ettikçe HoloLens'i desteklemek için kullanmanız gerekebilecek değişikliklerle ilgili notlar görürsünüz. HoloLens'i kullanırken ses yakalama sırasında biraz yankı olduğunu fark edebilirsiniz.
Önkoşullar
Not
Bu öğretici, Unity ve C# ile ilgili temel deneyime sahip geliştiriciler için tasarlanmıştır. Ayrıca, bu belgedeki önkoşulların ve yazılı yönergelerin, yazma sırasında (Mayıs 2018) test edilip doğrulananları temsil ettiğini de unutmayın. Araçları yükleme makalesinde listelendiği gibi en son yazılımı kullanabilirsiniz, ancak bu kurstaki bilgilerin aşağıda listelenenlerden daha yeni yazılımlarda bulacağınız bilgilerle mükemmel bir şekilde eşleşeceği varsayılmamalıdır.
Bu kurs için aşağıdaki donanım ve yazılımları öneririz:
- Çevreleyici (VR) mikrofonlu kulaklık geliştirme için Windows Mixed Reality uyumlu bir geliştirme bilgisayarı
- Geliştirici modu etkin Windows 10 Fall Creators Update (veya üzeri)
- En son Windows 10 SDK
- Unity 2017.4
- Visual Studio 2017
- Geliştirici modu etkinleştirilmiş Windows Mixed Reality çevreleyici (VR) kulaklık veya Microsoft HoloLens
- Azure kurulumu ve Notification Hubs'a erişmek için İnternet erişimi
Başlamadan önce
- Bu projeyi oluştururken sorunlarla karşılaşmamak için, bu öğreticide bahsedilen projeyi kök veya köke yakın bir klasörde oluşturmanız önemle önerilir (uzun klasör yolları derleme zamanında sorunlara neden olabilir).
- Microsoft Geliştirici Portalınızın ve Uygulama Kayıt Portalınızın sahibi olmanız gerekir, aksi takdirde 2. Bölümde uygulamaya erişim izniniz olmaz.
1. Bölüm - Microsoft Geliştirici Portalı'nda uygulama oluşturma
Azure Notification Hubs Hizmeti'ni kullanmak için Microsoft Geliştirici Portalı'nda bir Uygulama oluşturmanız gerekir. Uygulamanızın kaydedilerek bildirim gönderip alabilmesi gerekir.
Microsoft Geliştirici Portalı'nda oturum açın.
Microsoft Hesabınızda oturum açmanız gerekir.
Pano'dan Yeni uygulama oluştur'a tıklayın.
Yeni uygulamanız için bir ad ayırmanız gereken bir açılır pencere görüntülenir. Metin kutusuna uygun bir ad ekleyin; seçilen ad kullanılabilir durumdaysa, metin kutusunun sağ kısmında bir onay işareti görünür. Kullanılabilir bir ad ekledikten sonra, açılan pencerenin sol alt kısmındaki Ürün adını ayır düğmesine tıklayın.
Uygulama oluşturulduktan sonra bir sonraki Bölüme geçmeye hazırsınız.
2. Bölüm - Yeni uygulama kimlik bilgilerinizi alma
Yeni uygulamanızın listelendiği Uygulama Kaydı Portalında oturum açın ve Azure Portal'daNotification Hubs Hizmeti'ni ayarlamak için kullanılacak kimlik bilgilerini alın.
Uygulama Kayıt Portalı'na gidin.
Uyarı
Oturum açmak için Microsoft Hesabınızı kullanmanız gerekir.
Bu, Windows Mağazası Geliştirici portalı ile önceki Bölümde kullandığınız Microsoft Hesabı olmalıdır.Uygulamanızı Uygulamalarım bölümünde bulabilirsiniz. Uygulamayı buldukta üzerine tıkladığınızda uygulama adı ve Kayıt içeren yeni bir sayfaya yönlendirilirsiniz.
Uygulama Gizli Dizileri bölümünü ve uygulamanızın Paket SID'sini bulmak için kayıt sayfasını aşağı kaydırın. Sonraki Bölümde Azure Notification Hubs Hizmeti'ni ayarlarken kullanmak üzere her ikisini de kopyalayın.
3. Bölüm - Azure Portal kurulumu: Notification Hubs Hizmeti oluşturma
Uygulama kimlik bilgileriniz alındığında Azure Portal'a gitmeniz gerekir ve burada bir Azure Notification Hubs Hizmeti oluşturursunuz.
Azure Portal'da oturum açın.
Not
Henüz bir Azure hesabınız yoksa bir hesap oluşturmanız gerekir. Bu öğreticiyi bir sınıfta veya laboratuvar durumunda takip ediyorsanız eğitmeninize veya yardımcılardan birine yeni hesabınızı ayarlama hakkında yardım isteyin.
Oturum açtıktan sonra sol üst köşedeki Yeni'ye tıklayın, Notification Hub'ı arayın ve Enter tuşuna basın.
Not
Yeni sözcüğü, daha yeni portallarda Kaynak oluştur ile değiştirilmiş olabilir.
Yeni sayfada Notification Hubs hizmetinin açıklaması sağlanacaktır. Bu komut isteminin sol alt kısmında Oluştur düğmesini seçerek bu hizmetle bir ilişki oluşturun.
Oluştur'a tıkladığınızda:
Bu hizmet örneği için istediğiniz adı ekleyin.
Bu uygulamayla ilişkilendirebileceğiniz bir ad alanı sağlayın.
Bir Konum seçin.
Bir Kaynak Grubu seçin veya yeni bir grup oluşturun. Kaynak grubu, Azure varlıklarından oluşan bir koleksiyon için faturalamayı izlemek, denetlemek, sağlamak ve yönetmek için bir yol sağlar. Tek bir projeyle ilişkili tüm Azure hizmetlerinin (örneğin, bu laboratuvarlar gibi) ortak bir kaynak grubu altında tutulması önerilir.
Azure Kaynak Grupları hakkında daha fazla bilgi edinmek istiyorsanız lütfen Kaynak Grubunu yönetme ile ilgili bu bağlantıyı izleyin.
Uygun bir Abonelik seçin.
Ayrıca bu Hizmete uygulanan Hüküm ve Koşulları anladığınızdan emin olmanız gerekir.
Oluştur’u seçin.
Oluştur'a tıkladığınızda hizmetin oluşturulmasını beklemeniz gerekir. Bu işlem bir dakika sürebilir.
Hizmet örneği oluşturulduktan sonra portalda bir bildirim görüntülenir.
Yeni Hizmet örneğinizi keşfetmek için bildirimdeki Kaynağa git düğmesine tıklayın. Yeni Notification Hub hizmet örneğine yönlendirilirsiniz.
Genel bakış sayfasında, sayfanın ortasında Windows (WNS) seçeneğine tıklayın. Sağdaki panel, daha önce ayarladığınız uygulamadan Paket SID'nizi ve Güvenlik Anahtarınızı gerektiren iki metin alanını gösterecek şekilde değişir.
Ayrıntıları doğru alanlara kopyaladıktan sonra Kaydet'e tıklayın; Bildirim Hub'ı başarıyla güncelleştirildiğinde bir bildirim alırsınız.
4. Bölüm - Azure Portal kurulumu: Tablo Hizmeti oluşturma
Notification Hubs Hizmeti örneğinizi oluşturduktan sonra Azure Portal'ınıza geri dönün. Burada bir Depolama Kaynağı oluşturarak Azure Tablolar Hizmeti oluşturacaksınız.
Henüz oturum açmadıysanız Azure Portal'da oturum açın.
Oturum açtıktan sonra sol üst köşedeki Yeni'ye tıklayın, Depolama hesabı'nı arayın ve Enter tuşuna basın.
Not
Yeni sözcüğü, daha yeni portallarda Kaynak oluştur ile değiştirilmiş olabilir.
Listeden Depolama hesabı - blob, dosya, tablo, kuyruk'u seçin.
Yeni sayfada Depolama hesabı hizmetinin açıklaması sağlanır. Bu istemin sol alt kısmında Oluştur düğmesini seçerek bu hizmetin bir örneğini oluşturun.
Oluştur'a tıkladığınızda bir panel görüntülenir:
Bu hizmet örneği için istediğiniz Adı ekleyin (tümü küçük harf olmalıdır).
Dağıtım modeli için Kaynak yöneticisi'ne tıklayın.
Hesap türü için açılan menüyü kullanarak Depolama (genel amaçlı v1) seçeneğini belirleyin.
Uygun bir Konum seçin.
Çoğaltma açılan menüsü için Okuma erişimli-coğrafi olarak yedekli depolama (RA-GRS) seçeneğini belirleyin.
Performans için Standart'a tıklayın.
Güvenli aktarım gerekli bölümünde Devre Dışı'nı seçin.
Abonelik açılan menüsünden uygun bir abonelik seçin.
Bir Kaynak Grubu seçin veya yeni bir grup oluşturun. Kaynak grubu, Azure varlıklarından oluşan bir koleksiyon için faturalamayı izlemek, denetlemek, sağlamak ve yönetmek için bir yol sağlar. Tek bir projeyle ilişkili tüm Azure hizmetlerinin (örneğin, bu laboratuvarlar gibi) ortak bir kaynak grubu altında tutulması önerilir.
Azure Kaynak Grupları hakkında daha fazla bilgi edinmek istiyorsanız lütfen Kaynak Grubunu yönetme ile ilgili bu bağlantıyı izleyin.
Bu sizin için bir seçenekse Sanal ağlar seçeneğini Devre Dışı olarak bırakın.
Oluştur’a tıklayın.
Oluştur'a tıkladığınızda hizmetin oluşturulmasını beklemeniz gerekir. Bu işlem bir dakika sürebilir.
Hizmet örneği oluşturulduktan sonra portalda bir bildirim görüntülenir. Yeni Hizmet örneğinizi keşfetmek için bildirimlere tıklayın.
Yeni Hizmet örneğinizi keşfetmek için bildirimdeki Kaynağa git düğmesine tıklayın. Yeni Depolama Hizmeti örneğine genel bakış sayfanıza yönlendirilirsiniz.
Genel bakış sayfasında sağ taraftaki Tablolar'a tıklayın.
Sağdaki panel, yeni tablo eklemeniz gereken Tablo hizmeti bilgilerini gösterecek şekilde değişir. Bunu yapmak için sol üst köşedeki +Tablo düğmesine tıklayın.
Tablo adı girmeniz gereken yeni bir sayfa gösterilir. Bu, sonraki Bölümlerde uygulamanızdaki verilere başvurmak için kullanacağınız addır. Uygun bir ad ekleyin ve Tamam'a tıklayın.
Yeni tablo oluşturulduktan sonra Tablo hizmeti sayfasında (en altta) görebilirsiniz.
5. Bölüm - Visual Studio'da Azure Tablosunu Tamamlama
Tablo hizmeti depolama hesabınız ayarlandıysa, artık bilgileri depolamak ve almak için kullanılacak olan verilere veri eklemenin zamanı gelmiştir. Tablolarınızı düzenleme işlemi Visual Studio aracılığıyla gerçekleştirilebilir.
Visual Studio'yu açın.
MenüdenBulut GezgininiGörüntüle'ye> tıklayın.
Bulut Gezgini yerleşik bir öğe olarak açılır (yükleme zaman alabileceği için sabırlı olun).
Not
Depolama Hesaplarınızı oluşturmak için kullandığınız Abonelik görünmüyorsa aşağıdakilere sahip olduğunuzdan emin olun:
Azure Portal için kullandığınız hesapla aynı hesapta oturum açtınız.
Hesap Yönetimi Sayfasından Aboneliğinizi seçtiniz (hesap ayarlarınızdan bir filtre uygulamanız gerekebilir):
Azure bulut hizmetleriniz gösterilir. Depolama Hesapları'nı bulun ve hesaplarınızı genişletmek için bunun solundaki oka tıklayın.
Genişletildikten sonra yeni oluşturduğunuz Depolama hesabınızın kullanılabilir olması gerekir. Depolama alanınızın solundaki oka tıklayın ve genişletildikten sonra Tablolar'ı bulun ve bunun yanındaki oka tıklayarak son Bölümde oluşturduğunuz Tabloyu görüntüleyin. Tablonuza çift tıklayın.
Tablonuz Visual Studio pencerenizin ortasında açılır. Üzerinde (artı) bulunan + tablo simgesine tıklayın.
Varlık Eklemenizi isteyen bir pencere görüntülenir. Toplamda her biri birkaç özelliğe sahip üç varlık oluşturacaksınız. Bunlar tablo tarafından verilerinizi bulmak için kullanıldığından PartitionKey ve RowKey değerlerinin zaten sağlandığını fark edeceksiniz.
PartitionKey ve RowKeydeğerlerini aşağıdaki gibi güncelleştirin (eklediğiniz her satır özelliği için bunu yapmayı unutmayın, ancak RowKey değerini her seferinde artırmayı unutmayın):
Ek veri satırları eklemek için Özellik ekle'ye tıklayın. İlk boş tablonuzun aşağıdaki tabloyla eşleşmesini sağlayın.
İşiniz bittiğinde Tamam'a tıklayın.
Uyarı
X, Y ve Zgirişlerinin TürünüÇift olarak değiştirdiğinizden emin olun.
Tablonuzda artık bir veri satırı olduğunu fark edeceksiniz. + Başka bir varlık eklemek için (artı) simgesine yeniden tıklayın.
Ek bir özellik oluşturun ve ardından yeni varlığın değerlerini aşağıda gösterilenlerle eşleşecek şekilde ayarlayın.
Başka bir varlık eklemek için son adımı yineleyin. Bu varlığın değerlerini aşağıda gösterilen değerlerle ayarlayın.
Tablonuz şimdi aşağıdaki gibi görünmelidir.
Bu Bölümü tamamladınız. Kaydetmeyi unutmayın.
6. Bölüm - Azure İşlev Uygulaması oluşturma
Tablo hizmetini güncelleştirmek ve Notification Hub aracılığıyla bildirim göndermek için Masaüstü uygulaması tarafından çağrılan bir Azure İşlev Uygulaması oluşturun.
İlk olarak, Azure İşlevinizin ihtiyacınız olan kitaplıkları yüklemesini sağlayacak bir dosya oluşturmanız gerekir.
Not Defteri'nü açın (Windows Tuşu'ya basın ve not defteri yazın).
Not Defteri açıkken, altına JSON yapısını ekleyin. Bunu yaptıktan sonra masaüstünüzde project.json olarak kaydedin. Adlandırmanın doğru olması önemlidir: .txtdosya uzantısına sahip OLMADıĞıNDAN emin olun. Bu dosya işlevinizin kullanacağı kitaplıkları tanımlar; NuGet kullandıysanız tanıdık görünür.
{ "frameworks": { "net46":{ "dependencies": { "WindowsAzure.Storage": "7.0.0", "Microsoft.Azure.NotificationHubs" : "1.0.9", "Microsoft.Azure.WebJobs.Extensions.NotificationHubs" :"1.1.0" } } } }
Azure Portal'da oturum açın.
Oturum açtıktan sonra sol üst köşedeki Yeni'ye tıklayın ve İşlev Uygulaması'nı arayın ve Enter tuşuna basın.
Not
Yeni sözcüğü, daha yeni portallarda Kaynak oluştur ile değiştirilmiş olabilir.
Yeni sayfada İşlev Uygulaması hizmetinin açıklaması sağlanır. Bu komut isteminin sol alt kısmında Oluştur düğmesini seçerek bu hizmetle bir ilişki oluşturun.
Oluştur'a tıkladıktan sonra aşağıdakileri doldurun:
Uygulama adı alanına bu hizmet örneği için istediğiniz adı ekleyin.
Bir Abonelik seçin.
sizin için uygun fiyatlandırma katmanını seçin. İlk kez bir İşlev App Service oluşturuyorsanız ücretsiz bir katmanın kullanımınıza sunulması gerekir.
Bir Kaynak Grubu seçin veya yeni bir grup oluşturun. Kaynak grubu, Azure varlıklarından oluşan bir koleksiyon için faturalamayı izlemek, denetlemek, sağlamak ve yönetmek için bir yol sağlar. Tek bir projeyle ilişkili tüm Azure hizmetlerinin (örneğin, bu laboratuvarlar gibi) ortak bir kaynak grubu altında tutulması önerilir.
Azure Kaynak Grupları hakkında daha fazla bilgi edinmek istiyorsanız lütfen Kaynak Grubunu yönetme ile ilgili bu bağlantıyı izleyin.
İşletim sistemi için, hedeflenen platform olduğu için Windows'a tıklayın.
Bir Barındırma Planı seçin (bu öğreticide Tüketim Planı kullanılır.
Konum seçin (önceki adımda oluşturduğunuz depolama alanıyla aynı konumu seçin)
Depolama bölümünde, önceki adımda oluşturduğunuz Depolama Hizmeti'ni seçmeniz gerekir.
Bu uygulamada Application Insights'a ihtiyacınız olmayacak, bu nedenle kapalı bırakmaktan çekinmeyin.
Oluştur’a tıklayın.
Oluştur'a tıkladığınızda hizmetin oluşturulmasını beklemeniz gerekir, bu işlem bir dakika sürebilir.
Hizmet örneği oluşturulduktan sonra portalda bir bildirim görüntülenir.
Yeni Hizmet örneğinizi keşfetmek için bildirimlere tıklayın.
Yeni Hizmet örneğinizi keşfetmek için bildirimdeki Kaynağa git düğmesine tıklayın.
İşlevler'in+ yanındaki (artı) simgesine tıklayarak Yeni oluştur'a tıklayın.
Merkezi panelde İşlev oluşturma penceresi görüntülenir. Panelin üst yarısındaki bilgileri yoksayın ve alt kısımda (aşağıda olduğu gibi mavi alanda) bulunan Özel işlev'e tıklayın.
Penceredeki yeni sayfada çeşitli işlev türleri gösterilir. Mor türleri görüntülemek için aşağı kaydırın ve HTTP PUT öğesi'ne tıklayın.
Önemli
Sayfayı daha aşağı kaydırmanız gerekebilir (ve Azure Portal güncelleştirmeleri gerçekleştiyse bu görüntü tam olarak aynı görünmeyebilir), ancak HTTP PUT adlı bir öğe arıyorsunuz.
İşlevi yapılandırmanız gereken HTTP PUT penceresi görüntülenir (görüntü için aşağıya bakın).
Dil için açılan menüyü kullanarak C# öğesini seçin.
Ad alanına uygun bir ad girin.
Kimlik doğrulama düzeyi açılan menüsünde İşlev'i seçin.
Tablo adı bölümünde, daha önce Tablo hizmetinizi oluşturmak için kullandığınız tam adı kullanmanız gerekir (aynı harf örneği dahil).
Depolama hesabı bağlantısı bölümünde açılan menüyü kullanın ve oradan depolama hesabınızı seçin. Orada değilse, depolama hesabınızın listelenmesi gereken başka bir paneli göstermek için bölüm başlığının yanındaki Yeni köprüsüne tıklayın.
Oluştur'a tıkladığınızda ayarlarınızın başarıyla güncelleştirildiğini belirten bir bildirim alırsınız.
Oluştur'a tıkladıktan sonra işlev düzenleyicisine yönlendirilirsiniz.
aşağıdaki kodu işlev düzenleyicisine ekleyin (işlevdeki kodu değiştirerek):
#r "Microsoft.WindowsAzure.Storage" using System; using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Table; using Microsoft.Azure.NotificationHubs; using Newtonsoft.Json; public static async Task Run(UnityGameObject gameObj, CloudTable table, IAsyncCollector<Notification> notification, TraceWriter log) { //RowKey of the table object to be changed string rowKey = gameObj.RowKey; //Retrieve the table object by its RowKey TableOperation operation = TableOperation.Retrieve<UnityGameObject>("UnityPartitionKey", rowKey); TableResult result = table.Execute(operation); //Create a UnityGameObject so to set its parameters UnityGameObject existingGameObj = (UnityGameObject)result.Result; existingGameObj.RowKey = rowKey; existingGameObj.X = gameObj.X; existingGameObj.Y = gameObj.Y; existingGameObj.Z = gameObj.Z; //Replace the table appropriate table Entity with the value of the UnityGameObject operation = TableOperation.Replace(existingGameObj); table.Execute(operation); log.Verbose($"Updated object position"); //Serialize the UnityGameObject string wnsNotificationPayload = JsonConvert.SerializeObject(existingGameObj); log.Info($"{wnsNotificationPayload}"); var headers = new Dictionary<string, string>(); headers["X-WNS-Type"] = @"wns/raw"; //Send the raw notification to subscribed devices await notification.AddAsync(new WindowsNotification(wnsNotificationPayload, headers)); log.Verbose($"Sent notification"); } // This UnityGameObject represent a Table Entity public class UnityGameObject : TableEntity { public string Type { get; set; } public double X { get; set; } public double Y { get; set; } public double Z { get; set; } public string RowKey { get; set; } }
Not
İşlev, dahil edilen kitaplıkları kullanarak Unity sahnesinde taşınan nesnenin adını ve konumunu alır ( UnityGameObject adlı bir C# nesnesi olarak). Bu nesne daha sonra oluşturulan tablo içindeki nesne parametrelerini güncelleştirmek için kullanılır. Bunun ardından işlev, oluşturulan Notification Hub hizmetinize bir çağrı yapar ve bu çağrı abone olunan tüm uygulamaları bilgilendirir.
Kod yerine yerleştirildikten sonra Kaydet'e tıklayın.
Ardından, sayfanın sağ tarafındaki (ok) simgesine tıklayın < .
Sağdan bir panel içeri kaydırılır. Bu panelde Karşıya Yükle'ye tıklayın; bir Dosya Tarayıcısı görüntülenir.
Daha önce Not Defteri'nde oluşturduğunuz project.json dosyasına gidin ve tıklayın ve ardından Aç düğmesine tıklayın. Bu dosya işlevinizin kullanacağı kitaplıkları tanımlar.
Dosya karşıya yüklendiğinde, sağ taraftaki panelde görünür. Tıklanırken İşlev düzenleyicisinde açılır. Sonraki görüntüyle tam olarak aynı görünmelidir (23. adımın altında).
Ardından, soldaki panelde, İşlevler'in altında Tümleştir bağlantısına tıklayın.
Sonraki sayfada, sağ üst köşede Gelişmiş düzenleyici'ye tıklayın (aşağıda olduğu gibi).
Orta panelde bir function.json dosyası açılır ve bu dosyanın aşağıdaki kod parçacığıyla değiştirilmesi gerekir. Bu, oluşturduğunuz işlevi ve işleve geçirilen parametreleri tanımlar.
{ "bindings": [ { "authLevel": "function", "type": "httpTrigger", "methods": [ "get", "post" ], "name": "gameObj", "direction": "in" }, { "type": "table", "name": "table", "tableName": "SceneObjectsTable", "connection": "mrnothubstorage_STORAGE", "direction": "in" }, { "type": "notificationHub", "direction": "out", "name": "notification", "hubName": "MR_NotHub_ServiceInstance", "connection": "MRNotHubNS_DefaultFullSharedAccessSignature_NH", "platform": "wns" } ] }
Düzenleyiciniz şimdi aşağıdaki görüntüye benzemelidir:
Yeni eklediğiniz giriş parametrelerinin tablonuzla ve depolama ayrıntılarınızla eşleşmediğini ve bu nedenle bilgilerinizle güncelleştirilmesi gerektiğini fark edebilirsiniz. Bunu burada yapmayın, daha sonra ele alınmıştır. Geri dönmek için sayfanın sağ üst köşesindeki Standart düzenleyici bağlantısına tıklamanız yeterlidir.
Standart düzenleyiciye geri dönüp Girişler'in altındaki Azure Tablo Depolama (tablo) öğesine tıklayın.
Farklı olabilecekleri için aşağıdaki bilgilerin bilgilerinizle eşleştiğinden emin olun (aşağıdaki adımların altında bir görüntü vardır):
Tablo adı: Azure Depolama, Tablolar hizmetinizde oluşturduğunuz tablonun adı.
Depolama hesabı bağlantısı: Açılan menünün yanında görünen Yeni'ye tıklayın; pencerenin sağ tarafında bir panel görüntülenir.
İşlev Uygulamalarını barındırmak için daha önce oluşturduğunuz Depolama Hesabınızı seçin.
Depolama Hesabı bağlantı değerinin oluşturulduğunu fark edeceksiniz.
İşiniz bittiğinde Kaydet'e bastığınızdan emin olun.
Girişler sayfası artık bilgilerinizi gösteren aşağıdakiyle eşleşmelidir.
Ardından, Çıkışlar'ın altında Azure Notification Hub (bildirim) seçeneğine tıklayın. Farklı olabileceğinden aşağıdakilerin bilgilerinizle eşleştiğinden emin olun (aşağıdaki adımların altında bir görüntü vardır):
Bildirim Hub'ı Adı: Bu, daha önce oluşturduğunuz Notification Hub hizmet örneğinizin adıdır.
Notification Hubs ad alanı bağlantısı: Açılan menüyle birlikte görüntülenen Yeni'ye tıklayın.
Daha önce ayarladığınız Bildirim Hub'ınınAd Alanını seçmeniz gereken Bağlantı açılır penceresi görüntülenir (aşağıdaki resme bakın).
Ortadaki açılan menüden Bildirim Hub'ınızın adını seçin.
İlke açılan menüsünü DefaultFullSharedAccessSignature olarak ayarlayın.
Geri dönmek için Seç düğmesine tıklayın.
Çıkışlar sayfası artık aşağıdakiyle eşleşmelidir, ancak bunun yerine sizin bilgilerinizle eşleşmelidir. Kaydet'e bastığınizden emin olun.
Uyarı
Bildirim Hub'ı adını doğrudan düzenlemeyin (önceki adımları doğru izlemiş olmanız koşuluyla tüm bunlar Gelişmiş Düzenleyici kullanılarak yapılmalıdır.
Bu noktada, çalıştığından emin olmak için işlevi test etmelisiniz. Bunu yapmak için:
İşlev sayfasına bir kez daha gidin:
İşlev sayfasına dönün, sayfanın sağ ucundaki Test sekmesine tıklayarak Test dikey penceresini açın:
Dikey penceredeki İstek gövdesi metin kutusuna aşağıdaki kodu yapıştırın:
{ "Type":null, "X":3, "Y":0, "Z":1, "PartitionKey":null, "RowKey":"Obj2", "Timestamp":"0001-01-01T00:00:00+00:00", "ETag":null }
Test kodu yerindeyse, sağ alt kısımdaki Çalıştır düğmesine tıkladığınızda test çalıştırılır. Testin çıkış günlükleri, işlev kodunuzun altındaki konsol alanında görünür.
Uyarı
Yukarıdaki test başarısız olursa, özellikle tümleştirme panelindeki ayarlar olmak üzere yukarıdaki adımları tam olarak izlemiş olup olmadığınızı bir kez daha denetlemeniz gerekir.
7. Bölüm - Desktop Unity Projesi'ni ayarlama
Önemli
Şimdi oluşturduğunuz Masaüstü uygulaması Unity Düzenleyicisi'nde çalışmaz . Visual Studio (veya dağıtılan uygulama) kullanılarak uygulamanın Derlemesi'nin ardından Düzenleyici dışında çalıştırılması gerekir.
Aşağıda Unity ve karma gerçeklik ile geliştirmeye yönelik tipik bir kurulum verilmiştir ve bu nedenle diğer projeler için iyi bir şablondur.
Karma gerçeklik çevreleyici başlığınızı ayarlayın ve test edin.
Not
Bu kurs için Hareket Denetleyicilerine ihtiyacınız olmayacaktır . Çevreleyici mikrofonlu kulaklığı ayarlama konusunda desteğe ihtiyacınız varsa lütfen Windows Mixed Reality ayarlama ile ilgili bu bağlantıyı izleyin.
Unity'yi açın ve Yeni'ye tıklayın.
Unity Projesi adı sağlamanız, UnityDesktopNotifHub eklemeniz gerekir. Proje türünün 3B olarak ayarlandığından emin olun. Konum'u sizin için uygun bir yere ayarlayın (kök dizinlere daha yakın olanın daha iyi olduğunu unutmayın). Ardından Proje oluştur'a tıklayın.
Unity açıkken, varsayılan Betik Düzenleyicisi'ninVisual Studio olarak ayarlandığını denetlemeye değer. TercihleriDüzenle'ye> gidin ve yeni pencerede Dış Araçlar'a gidin. Dış Betik Düzenleyicisi'niVisual Studio 2017 olarak değiştirin. Tercihler penceresini kapatın.
Ardından Dosya>Derleme Ayarları'na gidin ve Evrensel Windows Platformu seçin, ardından seçiminizi uygulamak için Platform Değiştir düğmesine tıklayın.
Dosya>Derleme Ayarları'ndayken şunları yaptığınızdan emin olun:
Hedef CihazHerhangi Bir Cihaz olarak ayarlanır
Bu Uygulama masaüstünüz için olacaktır, bu nedenle Herhangi Bir Cihaz olmalıdır
Derleme TürüD3D olarak ayarlandı
SDK, En son yüklenen olarak ayarlandı
Visual Studio SürümüEn son yüklenen olarak ayarlandı
Derleme ve Çalıştırma, Yerel Makine olarak ayarlanır
Buradayken, sahneyi kaydetmeye ve derlemeye eklemeye değer.
Bunu yapmak için Açık Sahne Ekle'yi seçin. Bir kaydetme penceresi görüntülenir.
Bunun için yeni bir klasör oluşturun ve gelecekte herhangi bir sahne oluşturun, ardından Yeni klasör düğmesini seçerek yeni bir klasör oluşturun ve bunu Sahneler olarak adlandırın.
Yeni oluşturulan Sahneler klasörünüzü açın ve Dosya adı: metin alanına NH_Desktop_Scene yazın ve Kaydet'e basın.
Derleme Ayarları'nda kalan ayarlar şimdilik varsayılan olarak bırakılmalıdır.
Aynı pencerede Yürütücü Ayarları düğmesine tıkladığınızda, denetçinin bulunduğu alanda ilgili panel açılır.
Bu panelde birkaç ayarın doğrulanması gerekir:
Diğer Ayarlar sekmesinde:
Betik Çalışma Zamanı SürümüDeneysel olmalıdır (.NET 4.6 Eşdeğeri)
Betik Arka Ucu.NET olmalıdır
API Uyumluluk Düzeyi.NET 4.6 olmalıdır
Yayımlama Ayarları sekmesindeki Özellikler'in altında şunları denetleyin:
InternetClient
Derleme AyarlarıUnity C# Projeleri artık gri değil; bunun yanındaki onay kutusunu işaretleyin.
Derleme Ayarları penceresini kapatın.
Sahnenizi ve Proje Dosyası>Kaydetme Sahnenizi / Dosya>Kaydetme Projenizi kaydedin.
Önemli
Bu proje (Masaüstü Uygulaması) için Unity Kurulum bileşenini atlamak ve doğrudan koda devam etmek istiyorsanız , bu .unitypackage'ı indirebilir, özel paket olarak projenize aktarıp 9. Bölümden devam edebilirsiniz. Yine de betik bileşenlerini eklemeniz gerekir.
8. Bölüm - Unity'de DLL'leri içeri aktarma
Unity için Azure Depolama'yı (Azure için .Net SDK'sını kullanır) kullanacaksınız. Daha fazla bilgi için Unity için Azure Depolama hakkındaki bu bağlantıyı izleyin.
Şu anda Unity'de içeri aktarma işleminden sonra eklentilerin yeniden yapılandırılmasını gerektiren bilinen bir sorun vardır. Hata çözüldükten sonra bu adımlar (bu bölümde 4 - 7) artık gerekli olmayacaktır.
SDK'yı kendi projenize aktarmak için GitHub'dan en son .unitypackage dosyasını indirdiğinizden emin olun. Ardından aşağıdakileri yapın:
Varlıkları > İçeri Aktar Paketi Özel Paket > menü seçeneğini kullanarak .unitypackage öğesini Unity'ye ekleyin.
Açılan Unity Paketini İçeri Aktar kutusunda Eklenti>Depolama'nın altındaki her şeyi seçebilirsiniz. Bu kurs için gerekli olmadığından, diğer her şeyin işaretini kaldırın.
Öğeleri projenize eklemek için İçeri Aktar düğmesine tıklayın.
Proje görünümünde Eklentiler'in altındaki Depolama klasörüne gidin ve yalnızca aşağıdaki eklentileri seçin:
- Microsoft.Data.Edm
- Microsoft.Data.OData
- Microsoft.WindowsAzure.Storage
- Newtonsoft.Json
- System.Spatial
Bu belirli eklentiler seçiliyken Herhangi birPlatform'un işaretini kaldırın ve WSAPlayer'ınişaretini kaldırın ve Uygula'ya tıklayın.
Not
Bu belirli eklentileri yalnızca Unity Düzenleyicisi'nde kullanılacak şekilde işaretledik. Bunun nedeni, proje Unity'den dışarı aktarıldıktan sonra kullanılacak WSA klasöründe aynı eklentilerin farklı sürümleri olmasıdır.
Depolama eklentisi klasöründe yalnızca şunları seçin:
Microsoft.Data.Services.Client
Platform Ayarları'nın altındaki İşlem Yapma kutusunu işaretleyin ve Uygula'ya tıklayın.
Not
Unity derleme yama aracının bu eklentiyi işlemekte zorlandığı için bu eklentiyi "İşleme" olarak işaretledik. Eklenti işlenmese bile çalışmaya devam eder.
9. Bölüm - Desktop Unity projesinde TableToScene sınıfını oluşturma
Şimdi bu uygulamayı çalıştırmak için kodu içeren betikleri oluşturmanız gerekir.
Oluşturmanız gereken ilk betik, aşağıdakilerden sorumlu olan TableToScene betiğidir:
- Azure Tablosu içindeki varlıkları okuma.
- Tablo verilerini kullanarak, hangi nesnelerin hangi konumda yerleneceğini belirleyin.
Oluşturmanız gereken ikinci betik, aşağıdakilerden sorumlu olan CloudScene betiğidir:
- Kullanıcının nesneleri sahnenin çevresine sürüklemesine izin vermek için sol tıklama olayını kaydetme.
- Bu Unity sahnesinden nesne verilerini seri hale getirme ve Azure İşlev Uygulaması'na gönderme.
Bu sınıfı oluşturmak için:
Proje Paneli,KlasörOluştur'da> bulunan Varlık Klasörü'ne sağ tıklayın. Klasöre Betikler adını verin.
Yeni oluşturulan klasöre çift tıklayarak açın.
Betikler klasörünün içine sağ tıklayın,C# BetiğiOluştur'a> tıklayın. Betiği TableToScene olarak adlandırın.
Betiği çift tıklayarak Visual Studio 2017'de açın.
Aşağıdaki ad alanlarını ekleyin:
using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Auth; using Microsoft.WindowsAzure.Storage.Table; using UnityEngine;
sınıfının içine aşağıdaki değişkenleri ekleyin:
/// <summary> /// allows this class to behave like a singleton /// </summary> public static TableToScene instance; /// <summary> /// Insert here you Azure Storage name /// </summary> private string accountName = " -- Insert your Azure Storage name -- "; /// <summary> /// Insert here you Azure Storage key /// </summary> private string accountKey = " -- Insert your Azure Storage key -- ";
Not
accountName değerini Azure Depolama Hizmeti adınızla ve accountKey değeriyle, Azure Portal'daki Azure Depolama Hizmeti'nde bulunan anahtar değeriyle değiştirin (aşağıdaki görüntüye bakın).
Şimdi sınıfı başlatmak için Start() ve Awake() yöntemlerini ekleyin.
/// <summary> /// Triggers before initialization /// </summary> void Awake() { // static instance of this class instance = this; } /// <summary> /// Use this for initialization /// </summary> void Start() { // Call method to populate the scene with new objects as // pecified in the Azure Table PopulateSceneFromTableAsync(); }
TableToScene sınıfı içinde, Azure Tablosundan değerleri alacak yöntemi ekleyin ve bunları kullanarak sahnede uygun ilkelleri oluşturun.
/// <summary> /// Populate the scene with new objects as specified in the Azure Table /// </summary> private async void PopulateSceneFromTableAsync() { // Obtain credentials for the Azure Storage StorageCredentials creds = new StorageCredentials(accountName, accountKey); // Storage account CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true); // Storage client CloudTableClient client = account.CreateCloudTableClient(); // Table reference CloudTable table = client.GetTableReference("SceneObjectsTable"); TableContinuationToken token = null; // Query the table for every existing Entity do { // Queries the whole table by breaking it into segments // (would happen only if the table had huge number of Entities) TableQuerySegment<AzureTableEntity> queryResult = await table.ExecuteQuerySegmentedAsync(new TableQuery<AzureTableEntity>(), token); foreach (AzureTableEntity entity in queryResult.Results) { GameObject newSceneGameObject = null; Color newColor; // check for the Entity Type and spawn in the scene the appropriate Primitive switch (entity.Type) { case "Cube": // Create a Cube in the scene newSceneGameObject = GameObject.CreatePrimitive(PrimitiveType.Cube); newColor = Color.blue; break; case "Sphere": // Create a Sphere in the scene newSceneGameObject = GameObject.CreatePrimitive(PrimitiveType.Sphere); newColor = Color.red; break; case "Cylinder": // Create a Cylinder in the scene newSceneGameObject = GameObject.CreatePrimitive(PrimitiveType.Cylinder); newColor = Color.yellow; break; default: newColor = Color.white; break; } newSceneGameObject.name = entity.RowKey; newSceneGameObject.GetComponent<MeshRenderer>().material = new Material(Shader.Find("Diffuse")) { color = newColor }; //check for the Entity X,Y,Z and move the Primitive at those coordinates newSceneGameObject.transform.position = new Vector3((float)entity.X, (float)entity.Y, (float)entity.Z); } // if the token is null, it means there are no more segments left to query token = queryResult.ContinuationToken; } while (token != null); }
TableToScene sınıfının dışında, Tablo Varlıklarını seri hale getirmek ve seri durumdan çıkarabilmek için uygulama tarafından kullanılan sınıfı tanımlamanız gerekir.
/// <summary> /// This objects is used to serialize and deserialize the Azure Table Entity /// </summary> [System.Serializable] public class AzureTableEntity : TableEntity { public AzureTableEntity(string partitionKey, string rowKey) : base(partitionKey, rowKey) { } public AzureTableEntity() { } public string Type { get; set; } public double X { get; set; } public double Y { get; set; } public double Z { get; set; } }
Unity Düzenleyicisi'ne dönmeden önce Kaydet'i seçtiğinizden emin olun.
Hiyerarşipanelinden Ana Kamera'ya tıklayın, böylece özellikleri Denetçi'de görünür.
Betikler klasörü açıkken TableToScene dosyasını seçin ve ana kameraya sürükleyin. Sonuç aşağıdaki gibi olmalıdır:
10. Bölüm - Desktop Unity Projesinde CloudScene sınıfını oluşturma
Oluşturmanız gereken ikinci betik, aşağıdakilerden sorumlu olan CloudScene betiğidir:
Kullanıcının nesneleri sahnenin çevresine sürüklemesine izin vermek için sol tıklama olayını kaydetme.
Bu Unity sahnesinden nesne verilerini seri hale getirme ve Azure İşlev Uygulaması'na gönderme.
İkinci betiği oluşturmak için:
Betikler klasörünün içine sağ tıklayın, Oluştur, C# Betiği'ne tıklayın. Betiği CloudScene olarak adlandırın
Aşağıdaki ad alanlarını ekleyin:
using Newtonsoft.Json; using System.Collections; using System.Text; using System.Threading.Tasks; using UnityEngine; using UnityEngine.Networking;
Aşağıdaki değişkenleri ekleyin:
/// <summary> /// Allows this class to behave like a singleton /// </summary> public static CloudScene instance; /// <summary> /// Insert here you Azure Function Url /// </summary> private string azureFunctionEndpoint = "--Insert here you Azure Function Endpoint--"; /// <summary> /// Flag for object being moved /// </summary> private bool gameObjHasMoved; /// <summary> /// Transform of the object being dragged by the mouse /// </summary> private Transform gameObjHeld; /// <summary> /// Class hosted in the TableToScene script /// </summary> private AzureTableEntity azureTableEntity;
aşağıdaki görüntüde gösterildiği gibi azureFunctionEndpoint değerini Azure İşlevi App Service Azure Portalı'nda bulunan Azure İşlev Uygulaması URL'nizle değiştirin:
Şimdi sınıfı başlatmak için Start() ve Awake() yöntemlerini ekleyin.
/// <summary> /// Triggers before initialization /// </summary> void Awake() { // static instance of this class instance = this; } /// <summary> /// Use this for initialization /// </summary> void Start() { // initialise an AzureTableEntity azureTableEntity = new AzureTableEntity(); }
Update() yönteminde, fare girişini algılayacak ve sürükleyecek aşağıdaki kodu ekleyin. Bu kod, GameObjects'i sahne içinde taşıyacaktır. Kullanıcı bir nesneyi sürükleyip bıraktıysa, nesnenin adını ve koordinatlarını UpdateCloudScene() yöntemine geçirir. Bu yöntem, Azure tablosunu güncelleştirecek ve bildirimi tetikleyecek olan Azure İşlev Uygulaması hizmetini çağıracaktır.
/// <summary> /// Update is called once per frame /// </summary> void Update() { //Enable Drag if button is held down if (Input.GetMouseButton(0)) { // Get the mouse position Vector3 mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10); Vector3 objPos = Camera.main.ScreenToWorldPoint(mousePosition); Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; // Raycast from the current mouse position to the object overlapped by the mouse if (Physics.Raycast(ray, out hit)) { // update the position of the object "hit" by the mouse hit.transform.position = objPos; gameObjHasMoved = true; gameObjHeld = hit.transform; } } // check if the left button mouse is released while holding an object if (Input.GetMouseButtonUp(0) && gameObjHasMoved) { gameObjHasMoved = false; // Call the Azure Function that will update the appropriate Entity in the Azure Table // and send a Notification to all subscribed Apps Debug.Log("Calling Azure Function"); StartCoroutine(UpdateCloudScene(gameObjHeld.name, gameObjHeld.position.x, gameObjHeld.position.y, gameObjHeld.position.z)); } }
Şimdi UpdateCloudScene() yöntemini aşağıdaki gibi ekleyin:
private IEnumerator UpdateCloudScene(string objName, double xPos, double yPos, double zPos) { WWWForm form = new WWWForm(); // set the properties of the AzureTableEntity azureTableEntity.RowKey = objName; azureTableEntity.X = xPos; azureTableEntity.Y = yPos; azureTableEntity.Z = zPos; // Serialize the AzureTableEntity object to be sent to Azure string jsonObject = JsonConvert.SerializeObject(azureTableEntity); using (UnityWebRequest www = UnityWebRequest.Post(azureFunctionEndpoint, jsonObject)) { byte[] jsonToSend = new System.Text.UTF8Encoding().GetBytes(jsonObject); www.uploadHandler = new UploadHandlerRaw(jsonToSend); www.uploadHandler.contentType = "application/json"; www.downloadHandler = new DownloadHandlerBuffer(); www.SetRequestHeader("Content-Type", "application/json"); yield return www.SendWebRequest(); string response = www.responseCode.ToString(); } }
Kodu kaydedin ve Unity'ye dönün
CloudScene betiğini Ana Kamera'ya sürükleyin.
Hiyerarşipanelinden Ana Kamera'ya tıklayın, böylece özellikleri Denetçi'de görünür.
Betikler klasörü açıkken CloudScene betiğini seçin ve Ana Kamera'ya sürükleyin. Sonuç aşağıdaki gibi olmalıdır:
11. Bölüm - Masaüstü Projesini UWP'ye Derleme
Bu projenin Unity bölümü için gereken her şey tamamlandı.
Derleme Ayarları'na (Dosya>Derleme Ayarları) gidin.
Derleme Ayarları penceresinde Derle'ye tıklayın.
Bir Dosya Gezgini penceresi açılır ve Sizden Derleme konumu girmeniz istenir. Yeni bir klasör oluşturun (sol üst köşedeki Yeni Klasör'e tıklayarak) ve buildS olarak adlandırın.
Yeni BUILDS klasörünü açın ve başka bir klasör oluşturun ( Yeni Klasör'i bir kez daha kullanarak) ve NH_Desktop_App olarak adlandırın.
NH_Desktop_App seçili durumdayken. Klasör Seç'e tıklayın. Projenin oluşturulması bir dakika kadar sürer.
Derlemenin ardından, yeni projenizin konumunu gösteren Dosya Gezgini görüntülenir. Ancak, sonraki birkaç Bölümde önce diğer Unity projesini oluşturmanız gerektiğinden, bu projeyi açmanız gerekmez.
12. Bölüm - Unity Projesi Karma Gerçeklik Ayarlama
Aşağıda karma gerçeklikle geliştirmeye yönelik tipik bir kurulum verilmiştir ve bu nedenle diğer projeler için iyi bir şablondur.
Unity'yi açın ve Yeni'ye tıklayın.
Şimdi bir Unity Projesi adı sağlamanız ve UnityMRNotifHub eklemeniz gerekir. Proje türünün 3B olarak ayarlandığından emin olun. Konum değerini sizin için uygun bir konuma ayarlayın (kök dizinlere daha yakın olmak daha iyidir). Ardından Proje oluştur'a tıklayın.
Unity açıkken, varsayılan Betik Düzenleyicisi'ninVisual Studio olarak ayarlandığını denetlemeye değer. TercihleriDüzenle'ye> gidin ve yeni pencerede Dış Araçlar'a gidin. Dış Betik Düzenleyicisi'niVisual Studio 2017 olarak değiştirin. Tercihler penceresini kapatın.
Ardından Dosya>Derleme Ayarları'na gidin ve Platformu Değiştir düğmesine tıklayarak platformu Evrensel Windows Platformu olarak değiştirin.
Dosya>Derleme Ayarları'na gidin ve şunları yaptığınızdan emin olun:
Hedef CihazHerhangi Bir Cihaz olarak ayarlanır
Microsoft HoloLens için Hedef Cihaz'ıHoloLens olarak ayarlayın.
Derleme TürüD3D olarak ayarlandı
SDK en son yüklü olarak ayarlandı
Visual Studio SürümüEn son yüklü olarak ayarlandı
Derleme ve Çalıştırma, Yerel Makine olarak ayarlanır
Buradayken, sahneyi kaydetmeye ve derlemeye eklemeye değer.
Bunu yapmak için Açık Sahne Ekle'yi seçin. Bir kaydetme penceresi görüntülenir.
Bunun için yeni bir klasör oluşturun ve gelecekteki herhangi bir sahneyi oluşturun, ardından Yeni klasör düğmesini seçerek yeni bir klasör oluşturun ve bu klasörü Sahneler olarak adlandırın.
Yeni oluşturduğunuz Sahneler klasörünüzü açın ve Dosya adı: metin alanına NH_MR_Scene yazın ve Kaydet'e basın.
Derleme Ayarları'nda kalan ayarlar şimdilik varsayılan olarak bırakılmalıdır.
Aynı pencerede Oynatıcı Ayarları düğmesine tıkladığınızda, denetçinin bulunduğu alanda ilgili panel açılır.
Bu panelde birkaç ayarın doğrulanması gerekir:
Diğer Ayarlar sekmesinde:
Betik Çalışma Zamanı SürümüDeneysel Olmalıdır (.NET 4.6 Eşdeğeri)
Betik Arka Ucu.NET olmalıdır
API Uyumluluk Düzeyi.NET 4.6 olmalıdır
Panelin ilerisinde, XR Ayarları'nda (Yayımlama Ayarları'nın altında bulunur), Sanal Gerçeklik Desteği'ni işaretleyin, Windows Mixed Reality SDK'sının eklendiğinden emin olun
Yayımlama Ayarları sekmesindeki Özellikler'in altında şunları denetleyin:
InternetClient
Derleme Ayarları'na döndüğünüzde Unity C# Projeleri artık gri değil: Bunun yanındaki onay kutusunu işaretleyin.
Bu değişiklikler yapıldıktan sonra Derleme Ayarları penceresini kapatın.
Sahnenizi ve Proje DosyaNızı>Kaydetme Sahnenizi / Dosya>Kaydetme Projenizi kaydedin.
Önemli
Bu projenin Unity Set up bileşenini (karma gerçeklik Uygulaması) atlamak ve doğrudan koda geçmek istiyorsanız , bu .unitypackage'ı indirebilir, Özel Paket olarak projenize aktarıp 14. Bölümden devam edebilirsiniz. Yine de betik bileşenlerini eklemeniz gerekir.
13. Bölüm - Karma Gerçeklik Unity Projesindeki DLL'leri İçeri Aktarma
Unity için Azure Depolama kitaplığını (Azure için .Net SDK'sını kullanır) kullanacaksınız. Unity ile Azure Depolama'yı kullanma konusunda lütfen bu bağlantıyı izleyin. Şu anda Unity'de eklentilerin içeri aktarma işleminden sonra yeniden yapılandırılmasını gerektiren bilinen bir sorun vardır. Hata çözüldükten sonra bu adımlar (bu bölümdeki 4 - 7) artık gerekli olmayacaktır.
SDK'yı kendi projenize aktarmak için en son .unitypackage dosyasını indirdiğinizden emin olun. Ardından aşağıdakileri yapın:
Yukarıdanindirdiğiniz .unitypackage öğesini Varlıklar > İçeriAktarma Paketi>Özel Paket menü seçeneğini kullanarak Unity'ye ekleyin.
Açılan Unity Paketini İçeri Aktar kutusunda Eklenti>Depolama altında her şeyi seçebilirsiniz.
Öğeleri projenize eklemek için İçeri Aktar düğmesine tıklayın.
Proje görünümünde Eklentiler'in altındaki Depolama klasörüne gidin ve yalnızca aşağıdaki eklentileri seçin:
- Microsoft.Data.Edm
- Microsoft.Data.OData
- Microsoft.WindowsAzure.Storage
- Newtonsoft.Json
- System.Spatial
Bu belirli eklentiler seçiliyken Herhangi birPlatform'un işaretini kaldırın ve WSAPlayer'ınişaretini kaldırın ve Uygula'ya tıklayın.
Not
Bu belirli eklentileri yalnızca Unity Düzenleyicisi'nde kullanılacak şekilde işaretlisiniz. Bunun nedeni, proje Unity'den dışarı aktarıldıktan sonra kullanılacak WSA klasöründe aynı eklentilerin farklı sürümleri olmasıdır.
Depolama eklentisi klasöründe yalnızca şunları seçin:
Microsoft.Data.Services.Client
Platform Ayarları'nın altındaki İşlem Yapma kutusunu işaretleyin ve Uygula'ya tıklayın.
Not
Unity derleme patcher bu eklentiyi işlemekte zorlandığı için bu eklentiyi "İşleme" olarak işaretlisiniz. Eklenti işlenmese bile çalışmaya devam eder.
14. Bölüm - Karma gerçeklik Unity projesinde TableToScene sınıfını oluşturma
TableToScene sınıfı, 9. Bölümde açıklanan sınıfla aynıdır. 9. Bölümde açıklanan yordamı izleyerek karma gerçeklik Unity Projesi'nde aynı sınıfı oluşturun.
Bu Bölümü tamamladıktan sonra , Unity Projelerinizin her ikisi de ana kamerada bu sınıfı ayarlar.
15. Bölüm - Karma Gerçeklik Unity Projesinde NotificationReceiver sınıfını oluşturma
Oluşturmanız gereken ikinci betik, aşağıdakiler için sorumlu olan NotificationReceiver betiğidir:
- Uygulamayı başlatma sırasında Bildirim Hub'ına kaydetme.
- Bildirim Hub'ından gelen bildirimleri dinleme.
- Alınan bildirimlerden nesne verilerinin seri durumdan çıkarılması.
- Seri durumdan çıkarılmış verilere göre sahnedeki GameObjects'i taşıyın.
NotificationReceiver betiğini oluşturmak için:
Betikler klasörünün içine sağ tıklayın, Oluştur, C# Betiği'ne tıklayın. Betiği NotificationReceiver olarak adlandırın.
Betiği çift tıklayarak açın.
Aşağıdaki ad alanlarını ekleyin:
//using Microsoft.WindowsAzure.Messaging; using Newtonsoft.Json; using System; using System.Collections; using UnityEngine; #if UNITY_WSA_10_0 && !UNITY_EDITOR using Windows.Networking.PushNotifications; #endif
Aşağıdaki değişkenleri ekleyin:
/// <summary> /// allows this class to behave like a singleton /// </summary> public static NotificationReceiver instance; /// <summary> /// Value set by the notification, new object position /// </summary> Vector3 newObjPosition; /// <summary> /// Value set by the notification, object name /// </summary> string gameObjectName; /// <summary> /// Value set by the notification, new object position /// </summary> bool notifReceived; /// <summary> /// Insert here your Notification Hub Service name /// </summary> private string hubName = " -- Insert the name of your service -- "; /// <summary> /// Insert here your Notification Hub Service "Listen endpoint" /// </summary> private string hubListenEndpoint = "-Insert your Notification Hub Service Listen endpoint-";
hubName değerini Notification Hub Hizmeti adınızla, hubListenEndpoint değerini ise Azure Portal'daki Erişim İlkeleri sekmesinde, Azure Notification Hub Hizmeti'nde bulunan uç nokta değeriyle değiştirin (aşağıdaki resme bakın).
Şimdi sınıfı başlatmak için Start() ve Awake() yöntemlerini ekleyin.
/// <summary> /// Triggers before initialization /// </summary> void Awake() { // static instance of this class instance = this; } /// <summary> /// Use this for initialization /// </summary> void Start() { // Register the App at launch InitNotificationsAsync(); // Begin listening for notifications StartCoroutine(WaitForNotification()); }
Uygulamanın Notification Hub Kitaplığı'ndan Ana İş Parçacığı ile çakışmadan bildirim almasına izin vermek için WaitForNotification yöntemini ekleyin:
/// <summary> /// This notification listener is necessary to avoid clashes /// between the notification hub and the main thread /// </summary> private IEnumerator WaitForNotification() { while (true) { // Checks for notifications each second yield return new WaitForSeconds(1f); if (notifReceived) { // If a notification is arrived, moved the appropriate object to the new position GameObject.Find(gameObjectName).transform.position = newObjPosition; // Reset the flag notifReceived = false; } } }
Aşağıdaki yöntem olan InitNotificationAsync(), başlatma sırasında uygulamayı Hub Hizmeti bildirimine kaydeder. Unity projeyi oluşturamayacağından koda açıklama eklenir. Visual Studio'da Azure Messaging Nuget paketini içeri aktardığınızda açıklamaları kaldıracaksınız.
/// <summary> /// Register this application to the Notification Hub Service /// </summary> private async void InitNotificationsAsync() { // PushNotificationChannel channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync(); // NotificationHub hub = new NotificationHub(hubName, hubListenEndpoint); // Registration result = await hub.RegisterNativeAsync(channel.Uri); // If registration was successful, subscribe to Push Notifications // if (result.RegistrationId != null) // { // Debug.Log($"Registration Successful: {result.RegistrationId}"); // channel.PushNotificationReceived += Channel_PushNotificationReceived; // } }
Aşağıdaki Channel_PushNotificationReceived() işleyicisi her bildirim alındığında tetiklenir. Masaüstü Uygulamasında taşınan Azure Tablo Varlığı olan bildirimi seri durumdan çıkartır ve ardından MR sahnesindeki ilgili GameObject'i aynı konuma taşır.
Önemli
Kod, Visual Studio'da Nuget Paket Yöneticisi'ni kullanarak Unity projesini derledikten sonra ekleyeceğiniz Azure Mesajlaşma kitaplığına başvuracağından kod açıklama satırı yapılır. Bu nedenle, Unity projesi açıklama satırı yapılmadığı sürece derlenemez. Projenizi derleyip Unity'ye dönmek istediğinizde bu kodu yeniden açıklamanız gerektiğini unutmayın.
///// <summary> ///// Handler called when a Push Notification is received ///// </summary> //private void Channel_PushNotificationReceived(PushNotificationChannel sender, PushNotificationReceivedEventArgs args) //{ // Debug.Log("New Push Notification Received"); // // if (args.NotificationType == PushNotificationType.Raw) // { // // Raw content of the Notification // string jsonContent = args.RawNotification.Content; // // // Deserialise the Raw content into an AzureTableEntity object // AzureTableEntity ate = JsonConvert.DeserializeObject<AzureTableEntity>(jsonContent); // // // The name of the Game Object to be moved // gameObjectName = ate.RowKey; // // // The position where the Game Object has to be moved // newObjPosition = new Vector3((float)ate.X, (float)ate.Y, (float)ate.Z); // // // Flag thats a notification has been received // notifReceived = true; // } //}
Unity Düzenleyicisi'ne dönmeden önce değişikliklerinizi kaydetmeyi unutmayın.
Hiyerarşipanelinden Ana Kamera'ya tıklayın, böylece özellikleri Denetçi'de görünür.
Betikler klasörü açıkken NotificationReceiver betiğini seçin ve Ana Kamera'ya sürükleyin. Sonuç aşağıdaki gibi olmalıdır:
Not
Bunu Microsoft HoloLens için geliştiriyorsanız Ana Kameranın Kamera bileşenini güncelleştirmeniz gerekir, böylece:
- Bayrakları Temizle: Düz Renk
- Arka Plan: Siyah
16. Bölüm - UWP'ye Karma Gerçeklik Projesi Oluşturma
Bu Bölüm, önceki proje için derleme işlemiyle aynıdır. Bu projenin Unity bölümü için gereken her şey artık tamamlandı, bu nedenle Unity'den derleme zamanı geldi.
Derleme Ayarları 'na gidin ( Dosya>Derleme Ayarları ).
Derleme Ayarları menüsünde Unity C# Projeleri* seçeneğinin işaretli olduğundan emin olun (derlemeden sonra bu projedeki betikleri düzenlemenize olanak tanır).
Bu işlem tamamlandıktan sonra Oluştur'a tıklayın.
Bir Dosya Gezgini penceresi açılır ve oluştur'a bir konum girmeniz istenir. Yeni bir klasör oluşturun (sol üst köşedeki Yeni Klasör'e tıklayarak) ve bunu BUILDS olarak adlandırın.
Yeni BUILDS klasörünü açın ve başka bir klasör oluşturun ( Yeni Klasör'i bir kez daha kullanarak) ve NH_MR_App olarak adlandırın.
NH_MR_App seçili durumda. Klasör Seç'e tıklayın. Projenin oluşturulması bir dakika kadar sürer.
Derlemenin ardından, yeni projenizin konumunda bir Dosya Gezgini penceresi açılır.
17. Bölüm - UnityMRNotifHub Çözümüne NuGet paketleri ekleme
Uyarı
Aşağıdaki NuGet Paketlerini eklediğinizde (ve bir sonraki Bölümde kodun açıklamasını kaldırdığınızda), Unity Projesi içinde yeniden açıldığında Kod'un hatalar göstereceğini unutmayın. Unity Düzenleyicisi'nde geri dönüp düzenlemeye devam etmek isterseniz, bu yorucu kodu açıklama satırı yapmanız ve daha sonra Visual Studio'ya geri döndüğünüzde açıklamayı yeniden kaldırmanız gerekir.
Karma gerçeklik derlemesi tamamlandıktan sonra, oluşturduğunuz karma gerçeklik projesine gidin ve bu klasördeki çözüm (.sln) dosyasına çift tıklayarak çözümünüzü Visual Studio 2017 ile açın. Şimdi WindowsAzure.Messaging.managed NuGet paketini eklemeniz gerekir; Bu, Bildirim Hub'ından Bildirim almak için kullanılan bir kitaplıktır.
NuGet paketini içeri aktarmak için:
Çözüm Gezgini, Çözümünüz'e sağ tıklayın
NuGet Paketlerini Yönet'e tıklayın.
Gözat sekmesini seçin ve WindowsAzure.Messaging.managed araması yapın.
Sonucu seçin (aşağıda gösterildiği gibi) ve sağdaki pencerede Project'in yanındaki onay kutusunu seçin. Bu işlem, Assembly-CSharp ve UnityMRNotifHub projesinin yanındaki onay kutusunun yanı sıra Project'in yanındaki onay kutusuna bir onay işareti yerleştirir.
Başlangıçta sağlanan sürüm bu projeyle uyumlu olmayabilir . Bu nedenle, Sürüm'un yanındaki açılan menüye tıklayın ve Sürüm 0.1.7.9'a ve ardından Yükle'ye tıklayın.
NuGet paketini yüklemeyi tamamladınız. NotificationReceiver sınıfına girdiğiniz açıklamalı kodu bulun ve açıklamaları kaldırın...
Bölüm 18 - UnityMRNotifHub uygulamasını düzenleme, NotificationReceiver sınıfı
NuGet Paketlerini ekledikten sonra NotificationReceiver sınıfındaki bazı kodun açıklamasını kaldırmanız gerekir.
Buna aşağıdakiler dahildir:
En üstteki ad alanı:
using Microsoft.WindowsAzure.Messaging;
InitNotificationsAsync() yöntemindeki tüm kod:
/// <summary> /// Register this application to the Notification Hub Service /// </summary> private async void InitNotificationsAsync() { PushNotificationChannel channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync(); NotificationHub hub = new NotificationHub(hubName, hubListenEndpoint); Registration result = await hub.RegisterNativeAsync(channel.Uri); // If registration was successful, subscribe to Push Notifications if (result.RegistrationId != null) { Debug.Log($"Registration Successful: {result.RegistrationId}"); channel.PushNotificationReceived += Channel_PushNotificationReceived; } }
Uyarı
Yukarıdaki kodun içinde bir açıklama vardır: Bu açıklamayı yanlışlıkla açıklamadan kaldırmadığınızdan emin olun (kodunuz varsa kod derlenmeyeceği için!).
Son olarak , Channel_PushNotificationReceived olayı:
/// <summary> /// Handler called when a Push Notification is received /// </summary> private void Channel_PushNotificationReceived(PushNotificationChannel sender, PushNotificationReceivedEventArgs args) { Debug.Log("New Push Notification Received"); if (args.NotificationType == PushNotificationType.Raw) { // Raw content of the Notification string jsonContent = args.RawNotification.Content; // Deserialize the Raw content into an AzureTableEntity object AzureTableEntity ate = JsonConvert.DeserializeObject<AzureTableEntity>(jsonContent); // The name of the Game Object to be moved gameObjectName = ate.RowKey; // The position where the Game Object has to be moved newObjPosition = new Vector3((float)ate.X, (float)ate.Y, (float)ate.Z); // Flag thats a notification has been received notifReceived = true; } }
Bunlar açıklamalı olarak kaydedildiğinden emin olun ve sonraki Bölüme geçin.
19. Bölüm - Karma gerçeklik projesini Mağaza uygulamasıyla ilişkilendirme
Şimdi karma gerçeklik projesini laboratuvarın başında oluşturduğunuz Mağaza Uygulaması ile ilişkilendirmeniz gerekir.
Çözümü açın.
Çözüm Gezgini panelinde UWP uygulaması Projesi'ne sağ tıklayın, Mağaza'ya gidin ve Uygulamayı Mağaza ile ilişkilendirin....
Uygulamanızı Windows Mağazası ile İlişkilendirin adlı yeni bir pencere görüntülenir. İleri’ye tıklayın.
Oturum açtığınız Hesapla ilişkili tüm Uygulamaları yükler. Hesabınızda oturum açmadıysanız bu sayfada Oturum Açabilirsiniz .
Bu öğreticinin başında oluşturduğunuz Mağaza Uygulaması adını bulun ve seçin. Ardından İleri'ye tıklayın.
İlişkilendir’e tıklayın.
Uygulamanız artık Mağaza Uygulaması ile İlişkili . Bu, Bildirimleri etkinleştirmek için gereklidir.
20. Bölüm - UnityMRNotifHub ve UnityDesktopNotifHub uygulamalarını dağıtma
Bu Bölüm iki kişi için daha kolay olabilir, sonuçta biri masaüstü bilgisayarınızda çalışan uygulamalar, diğeri de çevreleyici başlığınızda çalışan uygulamalar yer alır.
Çevreleyici başlık uygulaması, sahnedeki değişiklikleri (yerel GameObjects konum değişiklikleri) almayı bekliyor ve Masaüstü uygulaması, MR uygulamasıyla paylaşılacak olan yerel sahnelerinde (konum değişiklikleri) değişiklikler yapıyor olacak. Alıcının dinlemeye başlayabilmesi için önce MR uygulamasını, ardından Masaüstü uygulamasını dağıtmak mantıklıdır.
UnityMRNotifHub uygulamasını Yerel Makinenizde dağıtmak için:
UnityMRNotifHub uygulamanızın çözüm dosyasını Visual Studio 2017'de açın.
Çözüm Platformu'ndax86, Yerel Makine'yi seçin.
Çözüm Yapılandırması'ndaHata Ayıkla'ya tıklayın.
Uygulamayı makinenize dışarıdan yüklemek için Oluştur menüsüne gidin ve Çözümü Dağıt'a tıklayın.
Uygulamanız artık yüklenmeye hazır yüklü uygulamalar listesinde görünmelidir.
UnityDesktopNotifHub uygulamasını Yerel Makinede dağıtmak için:
UnityDesktopNotifHub uygulamanızın çözüm dosyasını Visual Studio 2017'de açın.
Çözüm Platformu'ndax86, Yerel Makine'yi seçin.
Çözüm Yapılandırması'ndaHata Ayıkla'ya tıklayın.
Uygulamayı makinenize dışarıdan yüklemek için Oluştur menüsüne gidin ve Çözümü Dağıt'a tıklayın.
Uygulamanız artık yüklenmeye hazır yüklü uygulamalar listesinde görünmelidir.
Karma gerçeklik uygulamasını ve ardından Masaüstü uygulamasını başlatın.
Her iki uygulama da çalışırken, masaüstü sahnesindeki bir nesneyi taşıyın (Sol Fare Düğmesi'ni kullanarak). Bu konum değişiklikleri yerel olarak yapılır, seri hale getirilir ve İşlev Uygulaması hizmetine gönderilir. ardından İşlev Uygulaması hizmeti, Notification Hub ile birlikte Tabloyu da güncelleştirir. Bir güncelleştirme aldıktan sonra Bildirim Hub'ı güncelleştirilmiş verileri doğrudan tüm kayıtlı uygulamalara (bu durumda çevreleyici başlık uygulaması) gönderir. Bu uygulama, gelen verileri seri durumdan kaldırır ve yeni konum verilerini yerel nesnelere uygulayarak bunları görünüme taşır.
Azure Notification Hubs uygulamanızı tamamladınız
Tebrikler, Azure Notification Hubs Hizmetinden yararlanan ve uygulamalar arasında iletişime izin veren bir karma gerçeklik uygulaması oluşturacaksınız.
Ek alıştırmalar
Alıştırma 1
GameObjects'in rengini nasıl değiştirebileceğinizi ve bu bildirimi sahneyi görüntüleyen diğer uygulamalara nasıl gönderebileceğinizi açıklayabilir misiniz?
Alıştırma 2
GameObjects'in hareketini MR uygulamanıza ekleyebilir ve masaüstü uygulamanızda güncelleştirilmiş sahneyi görebilir misiniz?