HoloLens (1. nesil) ve Azure 312: Bot tümleştirmesi

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ılır. Gelecekte HoloLens 2 için nasıl geliştirileceğini gösteren yeni bir öğretici serisi sunulacaktır. Bu bildirim, gönderildiğinde bu öğreticilerin bağlantısıyla güncelleştirilir.

Bu kursta, Microsoft Bot Framework V4 kullanarak bot oluşturmayı ve dağıtmayı ve Windows Mixed Reality bir uygulama aracılığıyla botla iletişim kurmayı öğreneceksiniz.

bir Windows Mixed Reality uygulaması üzerinden iletişimi gösteren ekran görüntüsü.

Microsoft Bot Framework V4, geliştiricilere genişletilebilir ve ölçeklenebilir bir bot uygulaması oluşturmaya yönelik araçlar sağlamak için tasarlanmış bir API kümesidir. Daha fazla bilgi için Microsoft Bot Framework sayfasını veya V4 Git Deposunu ziyaret edin.

Bu kursu tamamladıktan sonra aşağıdakileri yapabilecek bir Windows Mixed Reality uygulaması oluşturacaksınız:

  1. Botu kullanıcıların sesini dinlemeye başlamak için Dokunma Hareketi'ni kullanın.
  2. Kullanıcı bir şey söylediyse bot bir yanıt sağlamaya çalışır.
  3. Unity Sahnesi'nde botların yanıtını botun yakınına yerleştirilmiş metin olarak görüntüleyin.

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 elde ettiğiniz bilgileri kullanmak sizin işinizdir.

Cihaz desteği

Kurs HoloLens Çevreleyici kulaklıklar
MR ve Azure 312: Bot tümleştirmesi ✔️ ✔️

Not

Bu kurs öncelikli olarak HoloLens'e odaklansa da, bu kursta öğrendiklerini çevreleyici (VR) kulaklıklara Windows Mixed Reality uygulayabilirsiniz. Çevreleyici (VR) mikrofonlu kulaklıkların erişilebilir kamerası olmadığından, bilgisayarınıza bağlı bir harici kameraya ihtiyacınız olacaktır. Kursu takip ettikçe, çevreleyici (VR) mikrofonlu kulaklıkları desteklemek için kullanmanız gerekebilecek değişikliklerle ilgili notlar görürsünüz.

Önkoşullar

Not

Bu öğretici, Unity ve C# ile ilgili temel deneyime sahip geliştiriciler için tasarlanmıştır. Bu belgedeki önkoşulların ve yazılı yönergelerin, yazma sırasında (Temmuz 2018) test edilen ve 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:

Başlamadan önce

  1. 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).
  2. HoloLens'inizi ayarlayın ve test edin. HoloLens'inizi ayarlamak için desteğe ihtiyacınız varsa HoloLens kurulum makalesini ziyaret edin.
  3. Yeni bir HoloLens uygulaması geliştirmeye başlarken Kalibrasyon ve Algılayıcı Ayarlaması yapmak iyi bir fikirdir (bazen bu görevleri her kullanıcı için gerçekleştirmeye yardımcı olabilir).

Kalibrasyon hakkında yardım için lütfen HoloLens Kalibrasyon makalesinin bağlantısını izleyin.

Algılayıcı Ayarlama hakkında yardım için lütfen HoloLens Algılayıcı Ayarlama makalesinin bağlantısını izleyin.

1. Bölüm – Bot uygulamasını oluşturma

İlk adım, botunuzu yerel bir ASP.Net Core Web uygulaması olarak oluşturmaktır. Bitirip test ettikten sonra Azure Portal'da yayımlarsınız.

  1. Visual Studio'yu açın. Yeni bir proje oluşturun, proje türü olarak ASP NET Core Web Uygulaması'nı seçin (bunu .NET Core alt bölümünde bulacaksınız) ve MyBot olarak adlandırın. Tamam'a tıklayın.

  2. Görüntülenecek pencerede Boş'a tıklayın. Ayrıca hedefin ASP NET Core 2.0 ve Kimlik Doğrulaması'nın Kimlik Doğrulaması Yok olarak ayarlandığından emin olun. Tamam'a tıklayın.

    New A S P dot N E T Core Web Uygulaması penceresini gösteren ekran görüntüsü.

  3. Çözüm şimdi açılır. Çözüm Gezgini Çözüm Mybot'a sağ tıklayın ve Çözüm için NuGet Paketlerini Yönet'e tıklayın.

    'MyBot' ve 'Çözüm için NuGet Paketlerini Yönet' vurgulanmış şekilde açılan çözümü gösteren ekran görüntüsü.

  4. Gözat sekmesinde Microsoft.Bot.Builder.Integration.AspNet.Core için arama yapın (Ön sürümü dahil et seçeneğini işaretlediğinizden emin olun). 4.0.1-preview paket sürümünü seçin ve proje kutularını işaretleyin. Ardından Yükle'ye tıklayın. Şimdi Bot Framework v4 için gereken kitaplıkları yüklediniz. NuGet sayfasını kapatın.

    Nu-Get Çözüm yöneticisini gösteren ekran görüntüsü.

  5. Çözüm Gezgini ProjenizMyBot'a sağ tıklayın veSınıfEkle'ye| tıklayın.

    MyBot'a yeni sınıf ekleme işlemini gösteren ekran görüntüsü.

  6. Sınıfı MyBot olarak adlandırın ve Ekle'ye tıklayın.

    Yeni sınıf oluşturma 'MyBot' öğesini gösteren ekran görüntüsü.

  7. ConversationContext adlı başka bir sınıf oluşturmak için önceki noktayı tekrarlayın.

  8. Çözüm Gezginiwwwroot'a sağ tıklayın veYeni ÖğeEkle'ye| tıklayın. HTML Sayfası'nı seçin (web'in alt bölümünde bulabilirsiniz). dosyayı default.htmlolarak adlandırın. Ekle'ye tıklayın.

    Çözüm Gezgini penceresinin içinden yeni bir H T M L sayfası oluşturmayı gösteren ekran görüntüsü.

  9. Çözüm Gezgini sınıf / nesne listesi aşağıdaki görüntü gibi görünmelidir.

    Sınıfların listesini içeren Çözüm Gezgini penceresinin ekran görüntüsü.

  10. ConversationContext sınıfına çift tıklayın. Bu sınıf, konuşmanın bağlamını korumak için bot tarafından kullanılan değişkenleri tutmakla sorumludur. MyBot sınıfının herhangi bir örneği her etkinlik alındığında yenilendiğinden, bu konuşma bağlamı değerleri bu sınıfın bir örneğinde tutulur. Sınıfına aşağıdaki kodu ekleyin:

    namespace MyBot
    {
        public static class ConversationContext
        {
            internal static string userName;
    
            internal static string userMsg;
        }
    }
    
  11. MyBot sınıfına çift tıklayın. Bu sınıf, müşteriden gelen herhangi bir etkinlik tarafından çağrılan işleyicileri barındıracaktır. Bu sınıfta botla müşteri arasındaki konuşmayı oluşturmak için kullanılan kodu ekleyebilirsiniz. Daha önce belirtildiği gibi, her etkinlik alındığında bu sınıfın bir örneği başlatılır. Bu sınıfa aşağıdaki kodu ekleyin:

    using Microsoft.Bot;
    using Microsoft.Bot.Builder;
    using Microsoft.Bot.Schema;
    using System.Threading.Tasks;
    
    namespace MyBot
    {
        public class MyBot : IBot
        {       
            public async Task OnTurn(ITurnContext context)
            {
                ConversationContext.userMsg = context.Activity.Text;
    
                if (context.Activity.Type is ActivityTypes.Message)
                {
                    if (string.IsNullOrEmpty(ConversationContext.userName))
                    {
                        ConversationContext.userName = ConversationContext.userMsg;
                        await context.SendActivity($"Hello {ConversationContext.userName}. Looks like today it is going to rain. \nLuckily I have umbrellas and waterproof jackets to sell!");
                    }
                    else
                    {
                        if (ConversationContext.userMsg.Contains("how much"))
                        {
                            if (ConversationContext.userMsg.Contains("umbrella")) await context.SendActivity($"Umbrellas are $13.");
                            else if (ConversationContext.userMsg.Contains("jacket")) await context.SendActivity($"Waterproof jackets are $30.");
                            else await context.SendActivity($"Umbrellas are $13. \nWaterproof jackets are $30.");
                        }
                        else if (ConversationContext.userMsg.Contains("color") || ConversationContext.userMsg.Contains("colour"))
                        {
                            await context.SendActivity($"Umbrellas are black. \nWaterproof jackets are yellow.");
                        }
                        else
                        {
                            await context.SendActivity($"Sorry {ConversationContext.userName}. I did not understand the question");
                        }
                    }
                }
                else
                {
    
                    ConversationContext.userMsg = string.Empty;
                    ConversationContext.userName = string.Empty;
                    await context.SendActivity($"Welcome! \nI am the Weather Shop Bot \nWhat is your name?");
                }
    
            }
        }
    }
    
  12. Başlangıç sınıfına çift tıklayın. Bu sınıf botu başlatır. Sınıfına aşağıdaki kodu ekleyin:

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Bot.Builder.BotFramework;
    using Microsoft.Bot.Builder.Integration.AspNet.Core;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    
    namespace MyBot
    {
    public class Startup
        {
            public IConfiguration Configuration { get; }
    
            public Startup(IHostingEnvironment env)
            {
                var builder = new ConfigurationBuilder()
                    .SetBasePath(env.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                    .AddEnvironmentVariables();
                Configuration = builder.Build();
            }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddSingleton(_ => Configuration);
                services.AddBot<MyBot>(options =>
                {
                    options.CredentialProvider = new ConfigurationCredentialProvider(Configuration);
                });
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseDefaultFiles();
                app.UseStaticFiles();
                app.UseBotFramework();
            }
        }
    }
    
  13. Program sınıf dosyasını açın ve içindeki kodun aşağıdakilerle aynı olduğunu doğrulayın:

    using Microsoft.AspNetCore;
    using Microsoft.AspNetCore.Hosting;
    
    namespace MyBot
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                BuildWebHost(args).Run();
            }
    
            public static IWebHost BuildWebHost(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    .Build();
        }
    }
    
  14. Değişikliklerinizi kaydetmeyi unutmayın, bunu yapmak için Visual Studio'nun üst kısmındaki araç çubuğundan Dosya>Tümünü Kaydet'e gidin.

2. Bölüm - Azure Bot Hizmeti oluşturma

Artık botunuzun kodunu oluşturduğunuza göre, bunu Azure Portal'da Web App Bot Hizmeti örneğinde yayımlamanız gerekir. Bu Bölümde, Azure'da Bot Hizmeti oluşturma ve yapılandırma ve ardından kodunuzu bu bölümde yayımlama adımları gösterilir.

  1. İlk olarak Azure Portalında (https://portal.azure.com ) oturum açın.

    1. 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.
  2. Oturum açtıktan sonra sol üst köşedeki Kaynak oluştur'a tıklayın, Web Uygulaması botu için arama yapıp Enter tuşuna basın.

    Sol üst kısımda 'Kaynak oluştur' seçeneğinin vurgulandığı Microsoft Azure panosunun ekran görüntüsü.

  3. Yeni sayfada Web App Bot Hizmeti'nin açıklaması sağlanacaktır. Bu hizmetle ilişkilendirme oluşturmak için bu sayfanın sol alt kısmındaki Oluştur düğmesini seçin.

    Web App Bot sayfasının ve sol alttaki 'Oluştur' düğmesinin ekran görüntüsü.

  4. Oluştur'a tıkladığınızda:

    1. Bu Hizmet örneği için istediğiniz Adı ekleyin.

    2. Bir Abonelik seçin.

    3. 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 kurslar gibi) ortak bir kaynak grubu altında tutulması önerilir.

      Azure Kaynak Grupları hakkında daha fazla bilgi edinmek istiyorsanız lütfen bu bağlantıyı izleyin

    4. Kaynak grubunuzun Konumunu belirleyin (yeni bir Kaynak Grubu oluşturuyorsanız). Konum ideal olarak uygulamanın çalıştırıldığı bölgede olacaktır. Bazı Azure varlıkları yalnızca belirli bölgelerde kullanılabilir.

    5. Sizin için uygun Fiyatlandırma Katmanını seçin. Web App Bot Hizmeti'ni ilk kez oluşturuyorsanız ücretsiz bir katman (F0 adlı) sizin için kullanılabilir olmalıdır

    6. Uygulama adı , Bot adıyla aynı bırakılabilir.

    7. Bot şablonunuTemel (C#) olarak bırakın.

    8. App Service planı/Konumu hesabınız için otomatik olarak doldurulmuş olmalıdır.

    9. Botunuzu barındırmak için kullanmak istediğiniz Azure Depolama'yı ayarlayın. Henüz yoksa, burada oluşturabilirsiniz.

    10. Ayrıca bu Hizmete uygulanan Hüküm ve Koşulları anladığınızdan emin olmanız gerekir.

    11. Oluştur’a tıklayın.

      Yeni Hizmeti oluşturmak için gereken alanları gösteren ekran görüntüsü.

  5. Oluştur'a tıkladığınızda Hizmetin oluşturulmasını beklemeniz gerekir. Bu işlem bir dakika sürebilir.

  6. Hizmet örneği oluşturulduktan sonra Portalda bir bildirim görüntülenir.

    Hizmet örneği oluşturulduktan sonra vurgulanan bildirim simgesini gösteren ekran görüntüsü.

  7. Yeni Hizmet örneğinizi keşfetmek için bildirime tıklayın.

    Dağıtımın başarılı olduğunu ve 'Kaynaklara git' düğmesini gösteren ekran görüntüsü.

  8. Yeni Hizmet örneğinizi keşfetmek için bildirimdeki Kaynağa git düğmesine tıklayın. Yeni Azure Hizmeti örneğine yönlendirilirsiniz.

    Önceki pencerede 'Kaynaklara git' düğmesine tıkladıktan sonra Kaynaklar penceresinin ekran görüntüsü.

  9. Bu noktada, istemci uygulamanızın bu Bot Hizmeti iletişim kurmasına izin vermek için Direct Line adlı bir özellik ayarlamanız gerekir. Kanallar'a tıklayın, ardından Öne çıkan kanal ekle bölümünde Direct Line kanalı yapılandır'a tıklayın.

    MyHoloLensBot'ta Direct Line yapılandır kanalının vurgulandığını gösteren ekran görüntüsü.

  10. Bu sayfada, istemci uygulamanızın botla kimlik doğrulamasına izin veren Gizli anahtarlar'ı bulacaksınız. Göster düğmesine tıklayın ve görüntülenen Anahtarlardan birinin bir kopyasını alın; projenizde daha sonra buna ihtiyacınız olacaktır.

    MyHoloLensBot yapılandırma Direct Line kanalında vurgulanan gizli anahtarlar ekran görüntüsü.

3. Bölüm – Botu Azure Web App Bot Hizmeti yayımlama

Hizmetiniz hazır olduğuna göre, daha önce oluşturduğunuz Bot kodunuzu yeni oluşturduğunuz Web App Bot Hizmeti yayımlamanız gerekir.

Not

Bot çözümünde/kodunda her değişiklik yaptığınızda Botunuzu Azure Hizmetinde yayımlamanız gerekir.

  1. Daha önce oluşturduğunuz Visual Studio Çözümünüzü Geri dön.

  2. MyBot projenize sağ tıklayın, Çözüm Gezgini ardından Yayımla'ya tıklayın.

    Sağ tıklamanın ardından 'MyBot' projesi açılan menüsünü gösteren ekran görüntüsü.

  3. Yayımlama hedefi seçin sayfasında, App Service'e ve ardından Var Olanı Seç'e tıklayın, son olarak Profil Oluştur'a tıklayın (bu görünmüyorsa Yayımla düğmesinin yanındaki açılan oka tıklamanız gerekebilir).

    'App Service', 'Var Olanı Seç' ve 'Profil Oluştur' vurgulanmış bir yayımlama hedefi seçin sayfasını gösteren ekran görüntüsü.

  4. Henüz Microsoft Hesabınızda oturum açmadıysanız, bunu burada yapmanız gerekir.

  5. Yayımla sayfasında, Web App Bot Hizmeti oluşturmak için kullandığınız Aboneliği ayarlamanız gerekir. Ardından Kaynak Grubu Olarak Görüntüle'yi ayarlayın ve açılan klasör yapısında daha önce oluşturduğunuz Kaynak Grubunu seçin. Tamam'a tıklayın.

    Web Uygulaması Bot Hizmeti oluşturma için kullanılan Aboneliğin seçili olduğu App Service penceresini gösteren ekran görüntüsü.

  6. Şimdi Yayımla düğmesine tıklayın ve Bot'un yayımlanmasını bekleyin (birkaç dakika sürebilir).

    Yayımla düğmesini içeren Yayımla penceresini gösteren ekran görüntüsü.

4. Bölüm – Unity projesini 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.

  1. Unity'yi açın ve Yeni'ye tıklayın.

    Sağ üst kısımda 'Yeni' proje simgesinin vurgulandığı Unity Projeleri penceresini gösteren ekran görüntüsü.

  2. Şimdi bir Unity proje adı sağlamanız gerekir. HoloLens Botu'nu ekleyin. Proje şablonunun 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.

    Yeni Unity Projesi adı alanının vurgulandığını gösteren ekran görüntüsü.

  3. Unity açıkken, varsayılan Betik Düzenleyicisi'ninVisual Studio olarak ayarlandığını denetlemeye değer. Tercihleri Dü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.

    Gerekli ayarları içeren Unity Tercihleri penceresini gösteren ekran görüntüsü.

  4. 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.

    'Platform Değiştir' düğmesinin vurgulandığı Derleme Ayarları penceresini gösteren ekran görüntüsü.

  5. Dosya > Derleme Ayarları'ndayken şunları yaptığınızdan emin olun:

    1. Hedef CihazHoloLens olarak ayarlandı

      Çevreleyici başlıklar için Hedef Cihaz'ıHerhangi Bir Cihaz olarak ayarlayın.

    2. Derleme TürüD3D olarak ayarlandı

    3. SDK, En son yüklenen olarak ayarlandı

    4. Visual Studio SürümüEn son yüklenen olarak ayarlandı

    5. Derleme ve Çalıştırma, Yerel Makine olarak ayarlanır

    6. Sahneyi kaydedin ve derlemeye ekleyin.

      1. Bunu yapmak için Açık Sahne Ekle'yi seçin. Bir kaydetme penceresi görüntülenir.

        'Açık Sahne Ekle' düğmesinin vurgulandığı Derleme Ayarları penceresini gösteren ekran görüntüsü.

      2. 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 bir 'Sahneler' klasörünün oluşturulmasını gösteren ekran görüntüsü.

      3. Yeni oluşturduğunuz Sahneler klasörünüzü açın ve Dosya adı: metin alanına BotScene yazın ve Kaydet'e tıklayın.

        Sahneler klasörünün ve yeni oluşturulan dosyanın kaydedildiği ekran görüntüsü.

    7. Derleme Ayarları'nda kalan ayarlar şimdilik varsayılan olarak bırakılmalıdır.

  6. Derleme Ayarları penceresinde Yürütücü Ayarları düğmesine tıkladığınızda, denetçinin bulunduğu alanda ilgili panel açılır.

    Denetçi sekmesindeki Derleme Ayarları penceresini gösteren ekran görüntüsü.

  7. Bu panelde birkaç ayarın doğrulanması gerekir:

    1. Diğer Ayarlar sekmesinde:

      1. Betik Çalışma Zamanı SürümüDeneysel olmalıdır (NET 4.6 Eşdeğeri); bunu değiştirmek için Düzenleyici'nin yeniden başlatılması gerekir.

      2. Betik Arka Ucu.NET olmalıdır

      3. API Uyumluluk Düzeyi.NET 4.6 olmalıdır

        Gerekli ayarları içeren Diğer Ayarlar sekmesini gösteren ekran görüntüsü.

    2. Yayımlama Ayarları sekmesindeki Özellikler'in altında şunları denetleyin:

      • InternetClient

      • Mikrofon

        Yayımlama Ayarları sekmesinde 'InternetClient' ve 'Mikrofon'un etkinleştirildiğini gösteren ekran görüntüsü.

    3. Panelin daha aşağısında, XR Ayarları'nda (Yayımlama Ayarları'nın altında bulunur) Sanal Gerçeklik Desteği'ni işaretleyin ve Windows Mixed Reality SDK'sının eklendiğinden emin olun.

      Sanal Gerçeklik Desteği'nin etkinleştirildiğini ve Windows Mixed Reality S D K'nin eklendiğini gösteren ekran görüntüsü.

  8. Derleme AyarlarıUnity C# Projeleri artık gri değil; bunun yanındaki onay kutusunu işaretleyin.

  9. Derleme Ayarları penceresini kapatın.

  10. Sahnenizi ve projenizi kaydedin (DOSYA KAYDETME SAHNESİ > / DOSYA > KAYDET PROJESİ).

5. Bölüm – Kamera kurulumu

Önemli

Bu kursun Unity Set up bileşenini atlamak ve doğrudan koda devam etmek istiyorsanız, bu Azure-MR-312-Package.unitypackage dosyasını indirmekten çekinmeyin, özel paket olarak projenize aktarın ve 7. Bölümden devam edin.

  1. Hiyerarşi panelindeAna Kamera'yı seçin.

  2. Seçildikten sonra, Denetçi panelindeAna Kamera'nın tüm bileşenlerini görebilirsiniz.

    1. Kamera nesnesiAna Kamera olarak adlandırılmalıdır (yazım denetimine dikkat edin)
    2. Ana Kamera EtiketiMainCamera olarak ayarlanmalıdır (yazım denetimine dikkat edin)
    3. Dönüştürme Konumunun0, 0, 0 olarak ayarlandığından emin olun
    4. Bayrakları Temizle'yiDüz Renk olarak ayarlayın.
    5. Kamera bileşeninin Arka Plan Rengi'ni Siyah, Alfa 0 olarak ayarlayın (Onaltılık Kod: #000000000)

    Denetçi panelinde Ana Kamera'nın tüm bileşenlerini gösteren ekran görüntüsü.

Bölüm 6 – Newtonsoft kitaplığını içeri aktarma

Alınan ve Bot Hizmeti gönderilen nesneleri seri durumdan çıkarmanıza ve seri hale getirmenize yardımcı olmak için Newtonsoft kitaplığını indirmeniz gerekir. Burada doğru Unity klasör yapısıyla önceden düzenlenmiş uyumlu bir sürüm bulacaksınız.

Newtonsoft kitaplığını projenize aktarmak için bu kursla birlikte gelen Unity Paketini kullanın.

  1. Varlıkları>İçeri Aktar PaketiÖzel Paket> menü seçeneğini kullanarak .unitypackage öğesini Unity'ye ekleyin.

    'Paketi İçeri Aktar' ve ardından 'Özel Paket' seçeneğinin seçili olduğu Varlıklar açılan menüsünü gösteren ekran görüntüsü.

  2. Açılan Unity Paketini İçeri Aktar kutusunda Eklentiler altındaki (ve dahil) her şeyin seçili olduğundan emin olun.

    'Eklentiler' öğesinin seçili olduğu Unity Paketini İçeri Aktar açılan kutusunun ekran görüntüsü.

  3. Öğeleri projenize eklemek için İçeri Aktar düğmesine tıklayın.

  4. Proje görünümünde Eklentiler'in altında Newtonsoft klasörüne gidin ve Newtonsoft eklentisini seçin.

    Proje görünümünde Newtonsoft klasörünü gösteren ekran görüntüsü.

  5. Newtonsoft eklentisi seçiliyken , Herhangi Bir Platformunişaretinin kaldırıldığından emin olun, ardından WSAPlayer'ın da işaretinin kaldırıldığından emin olun ve uygula'ya tıklayın. Bu yalnızca dosyaların doğru yapılandırıldığını onaylamak için yapılır.

    Newtonsoft eklentisi için doğru seçimleri gösteren ekran görüntüsü.

    Not

    Bu eklentilerin işaretlenmesi, bunları yalnızca Unity Düzenleyicisi'nde kullanılacak şekilde yapılandırılır. WSA klasöründe proje Unity'den dışarı aktarıldıktan sonra kullanılacak farklı bir küme vardır.

  6. Ardından, Newtonsoft klasörünün içindeki WSA klasörünü açmanız gerekir. Az önce yapılandırdığınız dosyanın bir kopyasını görürsünüz. Dosyayı seçin ve ardından denetçide

    • Herhangi bir Platformunişareti kaldırılır
    • yalnızcaWSAPlayerişaretli
    • Dont processis checked

    WSA klasöründeki Newtonsoft eklentisi için doğru seçimleri gösteren ekran görüntüsü.

7. Bölüm – BotTag oluşturma

  1. BotTag adlı yeni bir Tag nesnesi oluşturun. Sahnedeki Ana Kamera'ya tıklayın. Denetçi panelinde Etiket açılan menüsüne tıklayın. Etiket Ekle'ye tıklayın.

    Denetçi panelindeki Ana Kamera Etiketi açılan menüsünün ekran görüntüsü ve 'Etiket Ekle' vurgulanmış.

  2. Simgesine + tıklayın. Yeni EtiketiBotTag olarak adlandırın, Kaydet'i seçin.

    Yeni BotTag adı, artı simgesi ve Kaydet düğmesini içeren Denetçi panelinin ekran görüntüsü.

Uyarı

BotTag'i Ana Kameraya uygulamayın. Bunu yanlışlıkla yaptıysanız Ana Kamera etiketini MainCamera olarak değiştirdiğinizden emin olun.

8. Bölüm – BotObjects sınıfını oluşturma

Oluşturmanız gereken ilk betik, bir dizi diğer sınıf nesnesinin aynı betik içinde depolanabilmesi ve sahnedeki diğer betikler tarafından erişilmesi için oluşturulmuş boş bir sınıf olan BotObjects sınıfıdır.

Bu sınıfın oluşturulması tamamen mimari bir seçimdir; bu nesneler bunun yerine bu kursun ilerleyen bölümlerinde oluşturacağınız Bot betiğinde barındırılabilir.

Bu sınıfı oluşturmak için:

  1. Proje panelinde sağ tıklayın, ardından Klasör Oluştur'a >tıklayın. Klasöre Betikler adını verin.

    Betikler klasörü oluşturun.

  2. Betikler klasörüne çift tıklayarak açın. Ardından bu klasörün içinde sağ tıklayın ve C# Betiği Oluştur'u >seçin. Betiği BotObjects olarak adlandırın.

  3. Yeni BotObjects betiğine çift tıklayarak Visual Studio ile açın.

  4. Betiğin içeriğini silin ve aşağıdaki kodla değiştirin:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class BotObjects : MonoBehaviour{}
    
    /// <summary>
    /// Object received when first opening a conversation
    /// </summary>
    [Serializable]
    public class ConversationObject
    {
        public string ConversationId;
        public string token;
        public string expires_in;
        public string streamUrl;
        public string referenceGrammarId;
    }
    
    /// <summary>
    /// Object including all Activities
    /// </summary>
    [Serializable]
    public class ActivitiesRootObject
    {
        public List<Activity> activities { get; set; }
        public string watermark { get; set; }
    }
    [Serializable]
    public class Conversation
    {
        public string id { get; set; }
    }
    [Serializable]
    public class From
    {
        public string id { get; set; }
        public string name { get; set; }
    }
    [Serializable]
    public class Activity
    {
        public string type { get; set; }
        public string channelId { get; set; }
        public Conversation conversation { get; set; }
        public string id { get; set; }
        public From from { get; set; }
        public string text { get; set; }
        public string textFormat { get; set; }
        public DateTime timestamp { get; set; }
        public string serviceUrl { get; set; }
    }
    
  5. Unity'ye dönmeden önce değişikliklerinizi Visual Studio'ya kaydettiğinizden emin olun.

9. Bölüm – GazeInput sınıfını oluşturma

Oluşturacağınız bir sonraki sınıf , GazeInput sınıfıdır. Bu sınıf aşağıdakilerin sorumluluğundadır:

  • Oyuncunun bakışını temsil edecek bir imleç oluşturma.
  • Oyuncunun bakışının isabet ettiği nesneleri algılama ve algılanan nesnelere bir başvuru tutma.

Bu sınıfı oluşturmak için:

  1. Daha önce oluşturduğunuz Betikler klasörüne gidin.

  2. C# Betiği Oluştur >klasörünün içine sağ tıklayın. Betiği GazeInput olarak çağırın.

  3. Yeni GazeInput betiğine çift tıklayarak Visual Studio ile açın.

  4. Sınıf adının hemen üstüne aşağıdaki satırı ekleyin:

    /// <summary>
    /// Class responsible for the User's gaze interactions
    /// </summary>
    [System.Serializable]
    public class GazeInput : MonoBehaviour
    
  5. Ardından Start() yönteminin üst kısmındaki GazeInput sınıfının içine aşağıdaki değişkenleri ekleyin:

        [Tooltip("Used to compare whether an object is to be interacted with.")]
        internal string InteractibleTag = "BotTag";
    
        /// <summary>
        /// Length of the gaze
        /// </summary>
        internal float GazeMaxDistance = 300;
    
        /// <summary>
        /// Object currently gazed
        /// </summary>
        internal GameObject FocusedObject { get; private set; }
    
        internal GameObject _oldFocusedObject { get; private set; }
    
        internal RaycastHit HitInfo { get; private set; }
    
        /// <summary>
        /// Cursor object visible in the scene
        /// </summary>
        internal GameObject Cursor { get; private set; }
    
        internal bool Hit { get; private set; }
    
        internal Vector3 Position { get; private set; }
    
        internal Vector3 Normal { get; private set; }
    
        private Vector3 _gazeOrigin;
    
        private Vector3 _gazeDirection;
    
  6. Start() yöntemi için kod eklenmelidir. Sınıf başlatıldığında bu çağrılır:

        /// <summary>
        /// Start method used upon initialization.
        /// </summary>
        internal virtual void Start()
        {
            FocusedObject = null;
            Cursor = CreateCursor();
        }
    
  7. Bakış imlecini oluşturacak ve ayarlayacak bir yöntem uygulayın:

        /// <summary>
        /// Method to create a cursor object.
        /// </summary>
        internal GameObject CreateCursor()
        {
            GameObject newCursor = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            newCursor.SetActive(false);
            // Remove the collider, so it does not block Raycast.
            Destroy(newCursor.GetComponent<SphereCollider>());
            newCursor.transform.localScale = new Vector3(0.05f, 0.05f, 0.05f);
            Material mat = new Material(Shader.Find("Diffuse"));
            newCursor.GetComponent<MeshRenderer>().material = mat;
            mat.color = Color.HSVToRGB(0.0223f, 0.7922f, 1.000f);
            newCursor.SetActive(true);
    
            return newCursor;
        }
    
  8. Ana Kameradan Raycast'i ayarlayacak ve geçerli odaklanmış nesneyi izleyecek yöntemleri uygulayın.

        /// <summary>
        /// Called every frame
        /// </summary>
        internal virtual void Update()
        {
            _gazeOrigin = Camera.main.transform.position;
    
            _gazeDirection = Camera.main.transform.forward;
    
            UpdateRaycast();
        }
    
    
        /// <summary>
        /// Reset the old focused object, stop the gaze timer, and send data if it
        /// is greater than one.
        /// </summary>
        private void ResetFocusedObject()
        {
            // Ensure the old focused object is not null.
            if (_oldFocusedObject != null)
            {
                if (_oldFocusedObject.CompareTag(InteractibleTag))
                {
                    // Provide the OnGazeExited event.
                    _oldFocusedObject.SendMessage("OnGazeExited", 
                        SendMessageOptions.DontRequireReceiver);
                }
            }
        }
    
    
        private void UpdateRaycast()
        {
            // Set the old focused gameobject.
            _oldFocusedObject = FocusedObject;
            RaycastHit hitInfo;
    
            // Initialize Raycasting.
            Hit = Physics.Raycast(_gazeOrigin,
                _gazeDirection,
                out hitInfo,
                GazeMaxDistance);
            HitInfo = hitInfo;
    
            // Check whether raycast has hit.
            if (Hit == true)
            {
                Position = hitInfo.point;
                Normal = hitInfo.normal;
    
                // Check whether the hit has a collider.
                if (hitInfo.collider != null)
                {
                    // Set the focused object with what the user just looked at.
                    FocusedObject = hitInfo.collider.gameObject;
                }
                else
                {
                    // Object looked on is not valid, set focused gameobject to null.
                    FocusedObject = null;
                }
            }
            else
            {
                // No object looked upon, set focused gameobject to null.
                FocusedObject = null;
    
                // Provide default position for cursor.
                Position = _gazeOrigin + (_gazeDirection * GazeMaxDistance);
    
                // Provide a default normal.
                Normal = _gazeDirection;
            }
    
            // Lerp the cursor to the given position, which helps to stabilize the gaze.
            Cursor.transform.position = Vector3.Lerp(Cursor.transform.position, Position, 0.6f);
    
            // Check whether the previous focused object is this same. If so, reset the focused object.
            if (FocusedObject != _oldFocusedObject)
            {
                ResetFocusedObject();
                if (FocusedObject != null)
                {
                    if (FocusedObject.CompareTag(InteractibleTag))
                    {
                        // Provide the OnGazeEntered event.
                        FocusedObject.SendMessage("OnGazeEntered",
                            SendMessageOptions.DontRequireReceiver);
                    }
                }
            }
        }
    
  9. Unity'ye dönmeden önce değişikliklerinizi Visual Studio'ya kaydettiğinizden emin olun.

10. Bölüm – Bot sınıfını oluşturma

Şimdi oluşturacağınız betiğin adı Bot'tır. Bu, uygulamanızın temel sınıfıdır ve şunları depolar:

  • Web App Bot kimlik bilgileriniz
  • Kullanıcı sesli komutlarını toplayan yöntem
  • Web Uygulaması Botunuzla konuşma başlatmak için gereken yöntem
  • Web App Botunuza ileti göndermek için gereken yöntem

Bot Hizmeti ileti göndermek için SendMessageToBot() eş yordam, Bot Framework tarafından kullanıcı tarafından gönderilen veriler olarak tanınan bir nesne olan bir etkinlik oluşturur.

Bu sınıfı oluşturmak için:

  1. Betikler klasörüne çift tıklayarak açın.

  2. Betikler klasörünün içine sağ tıklayın, C# Betiği Oluştur'a >tıklayın. Betiği Bot olarak adlandırın.

  3. Visual Studio ile açmak için yeni betiği çift tıklatın.

  4. Bot sınıfının en üstünde ad alanlarını aşağıdakiyle aynı olacak şekilde güncelleştirin:

    using Newtonsoft.Json;
    using System.Collections;
    using System.Text;
    using UnityEngine;
    using UnityEngine.Networking;
    using UnityEngine.Windows.Speech;
    
  5. Bot sınıfının içine aşağıdaki değişkenleri ekleyin:

        /// <summary>
        /// Static instance of this class
        /// </summary>
        public static Bot Instance;
    
        /// <summary>
        /// Material of the sphere representing the Bot in the scene
        /// </summary>
        internal Material botMaterial;
    
        /// <summary>
        /// Speech recognizer class reference, which will convert speech to text.
        /// </summary>
        private DictationRecognizer dictationRecognizer;
    
        /// <summary>
        /// Use this variable to identify the Bot Id
        /// Can be any value
        /// </summary>
        private string botId = "MRBotId";
    
        /// <summary>
        /// Use this variable to identify the Bot Name
        /// Can be any value
        /// </summary>
        private string botName = "MRBotName";
    
        /// <summary>
        /// The Bot Secret key found on the Web App Bot Service on the Azure Portal
        /// </summary>
        private string botSecret = "-- Add your Secret Key here --"; 
    
        /// <summary>
        /// Bot Endpoint, v4 Framework uses v3 endpoint at this point in time
        /// </summary>
        private string botEndpoint = "https://directline.botframework.com/v3/directline";
    
        /// <summary>
        /// The conversation object reference
        /// </summary>
        private ConversationObject conversation;
    
        /// <summary>
        /// Bot states to regulate the application flow
        /// </summary>
        internal enum BotState {ReadyToListen, Listening, Processing}
    
        /// <summary>
        /// Flag for the Bot state
        /// </summary>
        internal BotState botState;
    
        /// <summary>
        /// Flag for the conversation status
        /// </summary>
        internal bool conversationStarted = false;
    

    Not

    Bot Gizli AnahtarınızıbotSecret değişkenine eklediğinizden emin olun. Bu kursun başında, 2. Bölümde, 10. adımdaBot Gizli Anahtarınızı not etmiş olacaksınız.

  6. Awake() ve Start() kodu artık eklenmelidir.

        /// <summary>
        /// Called on Initialization
        /// </summary>
        void Awake()
        {
            Instance = this;
        }
    
        /// <summary>
        /// Called immediately after Awake method
        /// </summary>
        void Start()
        {
            botState = BotState.ReadyToListen;
        }
    
  7. Ses yakalama başladığında ve sona erdiğinde konuşma kitaplıkları tarafından çağrılan iki işleyiciyi ekleyin. DictationRecognizer, kullanıcı konuşmayı durdurduğunda kullanıcı sesini yakalamayı otomatik olarak durdurur.

        /// <summary>
        /// Start microphone capture.
        /// </summary>
        public void StartCapturingAudio()
        {
            botState = BotState.Listening;
            botMaterial.color = Color.red;
    
            // Start dictation
            dictationRecognizer = new DictationRecognizer();
            dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
            dictationRecognizer.Start();
        }
    
    
        /// <summary>
        /// Stop microphone capture.
        /// </summary>
        public void StopCapturingAudio()
        {
            botState = BotState.Processing;
            dictationRecognizer.Stop();
        }
    
    
  8. Aşağıdaki işleyici, kullanıcı sesi girişinin sonucunu toplar ve iletiyi Web App Bot Hizmeti göndermekle sorumlu olan eş yordamları çağırır.

        /// <summary>
        /// This handler is called every time the Dictation detects a pause in the speech. 
        /// </summary>
        private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
        {
            // Update UI with dictation captured
            Debug.Log($"User just said: {text}");      
    
            // Send dictation to Bot
            StartCoroutine(SendMessageToBot(text, botId, botName, "message"));
            StopCapturingAudio();
        }     
    
  9. Bot ile bir konuşma başlatmak için aşağıdaki eş yordam çağrılır. Konuşma çağrısı tamamlandıktan sonra, etkinliği boş bir ileti olarak Bot Hizmeti gönderilecek şekilde ayarlayacak bir dizi parametre geçirerek SendMessageToCoroutine() öğesini çağıracağını göreceksiniz. Bu işlem, Bot Hizmeti diyaloğu başlatmasını isteme amacıyla yapılır.

        /// <summary>
        /// Request a conversation with the Bot Service
        /// </summary>
        internal IEnumerator StartConversation()
        {
            string conversationEndpoint = string.Format("{0}/conversations", botEndpoint);
    
            WWWForm webForm = new WWWForm();
    
            using (UnityWebRequest unityWebRequest = UnityWebRequest.Post(conversationEndpoint, webForm))
            {
                unityWebRequest.SetRequestHeader("Authorization", "Bearer " + botSecret);
                unityWebRequest.downloadHandler = new DownloadHandlerBuffer();
    
                yield return unityWebRequest.SendWebRequest();
                string jsonResponse = unityWebRequest.downloadHandler.text;
    
                conversation = new ConversationObject();
                conversation = JsonConvert.DeserializeObject<ConversationObject>(jsonResponse);
                Debug.Log($"Start Conversation - Id: {conversation.ConversationId}");
                conversationStarted = true; 
            }
    
            // The following call is necessary to create and inject an activity of type //"conversationUpdate" to request a first "introduction" from the Bot Service.
            StartCoroutine(SendMessageToBot("", botId, botName, "conversationUpdate"));
        }    
    
  10. Bot Hizmeti gönderilecek etkinliği oluşturmak için aşağıdaki eş yordam çağrılır.

        /// <summary>
        /// Send the user message to the Bot Service in form of activity
        /// and call for a response
        /// </summary>
        private IEnumerator SendMessageToBot(string message, string fromId, string fromName, string activityType)
        {
            Debug.Log($"SendMessageCoroutine: {conversation.ConversationId}, message: {message} from Id: {fromId} from name: {fromName}");
    
            // Create a new activity here
            Activity activity = new Activity();
            activity.from = new From();
            activity.conversation = new Conversation();
            activity.from.id = fromId;
            activity.from.name = fromName;
            activity.text = message;
            activity.type = activityType;
            activity.channelId = "DirectLineChannelId";
            activity.conversation.id = conversation.ConversationId;     
    
            // Serialize the activity
            string json = JsonConvert.SerializeObject(activity);
    
            string sendActivityEndpoint = string.Format("{0}/conversations/{1}/activities", botEndpoint, conversation.ConversationId);
    
            // Send the activity to the Bot
            using (UnityWebRequest www = new UnityWebRequest(sendActivityEndpoint, "POST"))
            {
                www.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(json));
    
                www.downloadHandler = new DownloadHandlerBuffer();
                www.SetRequestHeader("Authorization", "Bearer " + botSecret);
                www.SetRequestHeader("Content-Type", "application/json");
    
                yield return www.SendWebRequest();
    
                // extrapolate the response Id used to keep track of the conversation
                string jsonResponse = www.downloadHandler.text;
                string cleanedJsonResponse = jsonResponse.Replace("\r\n", string.Empty);
                string responseConvId = cleanedJsonResponse.Substring(10, 30);
    
                // Request a response from the Bot Service
                StartCoroutine(GetResponseFromBot(activity));
            }
        }
    
  11. Bot Hizmeti etkinlik gönderdikten sonra yanıt istemek için aşağıdaki eş yordam çağrılır.

        /// <summary>
        /// Request a response from the Bot by using a previously sent activity
        /// </summary>
        private IEnumerator GetResponseFromBot(Activity activity)
        {
            string getActivityEndpoint = string.Format("{0}/conversations/{1}/activities", botEndpoint, conversation.ConversationId);
    
            using (UnityWebRequest unityWebRequest1 = UnityWebRequest.Get(getActivityEndpoint))
            {
                unityWebRequest1.downloadHandler = new DownloadHandlerBuffer();
                unityWebRequest1.SetRequestHeader("Authorization", "Bearer " + botSecret);
    
                yield return unityWebRequest1.SendWebRequest();
    
                string jsonResponse = unityWebRequest1.downloadHandler.text;
    
                ActivitiesRootObject root = new ActivitiesRootObject();
                root = JsonConvert.DeserializeObject<ActivitiesRootObject>(jsonResponse);
    
                foreach (var act in root.activities)
                {
                    Debug.Log($"Bot Response: {act.text}");
                    SetBotResponseText(act.text);
                }
    
                botState = BotState.ReadyToListen;
                botMaterial.color = Color.blue;
            }
        } 
    
  12. Bu sınıfa eklenecek son yöntem, iletiyi sahnede görüntülemek için gereklidir:

        /// <summary>
        /// Set the UI Response Text of the bot
        /// </summary>
        internal void SetBotResponseText(string responseString)
        {        
            SceneOrganiser.Instance.botResponseText.text =  responseString;
        }
    

    Not

    Unity Düzenleyici Konsolu'ndaki SceneOrganiser sınıfının eksik olduğuyla ilgili bir hata görebilirsiniz. Öğreticinin ilerleyen bölümlerinde bu sınıfı oluşturacağınız için bu iletiyi göz ardı edin.

  13. Unity'ye dönmeden önce değişikliklerinizi Visual Studio'ya kaydettiğinizden emin olun.

11. Bölüm – Etkileşimler sınıfını oluşturma

Şimdi oluşturacağınız sınıfa Etkileşimler adı verilir. Bu sınıf, kullanıcıdan HoloLens Dokunma Girişi'ni algılamak için kullanılır.

Kullanıcı sahnedeki Bot nesnesine bakarken dokunursa ve Bot ses girişlerini dinlemeye hazırsa Bot nesnesi rengi kırmızıya değiştirir ve ses girişlerini dinlemeye başlar.

Bu sınıf GazeInput sınıfından devralır ve bu nedenle base kullanımıyla belirtilen Start() yöntemine ve bu sınıftan değişkenlere başvurabiliyor.

Bu sınıfı oluşturmak için:

  1. Betikler klasörüne çift tıklayarak açın.

  2. Betikler klasörünün içine sağ tıklayın, C# Betiği Oluştur'a >tıklayın. Betiği Etkileşimler olarak adlandırın.

  3. Visual Studio ile açmak için yeni betiği çift tıklatın.

  4. Etkileşimler sınıfının üst kısmında ad alanlarını ve sınıf devralmayı aşağıdakilerle aynı olacak şekilde güncelleştirin:

    using UnityEngine.XR.WSA.Input;
    
    public class Interactions : GazeInput
    {
    
  5. Interactions sınıfının içine aşağıdaki değişkeni ekleyin:

        /// <summary>
        /// Allows input recognition with the HoloLens
        /// </summary>
        private GestureRecognizer _gestureRecognizer;
    
  6. Ardından Start() yöntemini ekleyin:

        /// <summary>
        /// Called on initialization, after Awake
        /// </summary>
        internal override void Start()
        {
            base.Start();
    
            //Register the application to recognize HoloLens user inputs
            _gestureRecognizer = new GestureRecognizer();
            _gestureRecognizer.SetRecognizableGestures(GestureSettings.Tap);
            _gestureRecognizer.Tapped += GestureRecognizer_Tapped;
            _gestureRecognizer.StartCapturingGestures();
        }
    
  7. Kullanıcı HoloLens kamerasının önünde dokunma hareketini gerçekleştirdiğinde tetiklenecek işleyiciyi ekleyin

        /// <summary>
        /// Detects the User Tap Input
        /// </summary>
        private void GestureRecognizer_Tapped(TappedEventArgs obj)
        {
            // Ensure the bot is being gazed upon.
            if(base.FocusedObject != null)
            {
                // If the user is tapping on Bot and the Bot is ready to listen
                if (base.FocusedObject.name == "Bot" && Bot.Instance.botState == Bot.BotState.ReadyToListen)
                {
                    // If a conversation has not started yet, request one
                    if(Bot.Instance.conversationStarted)
                    {
                        Bot.Instance.SetBotResponseText("Listening...");
                        Bot.Instance.StartCapturingAudio();
                    }
                    else
                    {
                        Bot.Instance.SetBotResponseText("Requesting Conversation...");
                        StartCoroutine(Bot.Instance.StartConversation());
                    }                                  
                }
            }
        }
    
  8. Unity'ye dönmeden önce değişikliklerinizi Visual Studio'ya kaydettiğinizden emin olun.

12. Bölüm – SceneOrganiser sınıfını oluşturma

Bu laboratuvarda gereken son sınıf SceneOrganiser olarak adlandırılır. Bu sınıf, Ana Kameraya bileşenler ve betikler ekleyerek ve sahnede uygun nesneleri oluşturarak sahneyi program aracılığıyla ayarlar.

Bu sınıfı oluşturmak için:

  1. Betikler klasörüne çift tıklayarak açın.

  2. Betikler klasörünün içine sağ tıklayın, C# Betiği Oluştur'a >tıklayın. Betiği SceneOrganiser olarak adlandırın.

  3. Visual Studio ile açmak için yeni betiği çift tıklatın.

  4. SceneOrganiser sınıfının içine aşağıdaki değişkenleri ekleyin:

        /// <summary>
        /// Static instance of this class
        /// </summary>
        public static SceneOrganiser Instance;
    
        /// <summary>
        /// The 3D text representing the Bot response
        /// </summary>
        internal TextMesh botResponseText;
    
  5. Ardından Awake() ve Start() yöntemlerini ekleyin:

        /// <summary>
        /// Called on Initialization
        /// </summary>
        private void Awake()
        {
            Instance = this;
        }
    
        /// <summary>
        /// Called immediately after Awake method
        /// </summary>
        void Start ()
        {
            // Add the GazeInput class to this object
            gameObject.AddComponent<GazeInput>();
    
            // Add the Interactions class to this object
            gameObject.AddComponent<Interactions>();
    
            // Create the Bot in the scene
            CreateBotInScene();
        }
    
  6. Sahnede Bot nesnesini oluşturmak ve parametreleri ve bileşenleri ayarlamakla sorumlu olan aşağıdaki yöntemi ekleyin:

        /// <summary>
        /// Create the Sign In button object in the scene
        /// and sets its properties
        /// </summary>
        private void CreateBotInScene()
        {
            GameObject botObjInScene = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            botObjInScene.name = "Bot";
    
            // Add the Bot class to the Bot GameObject
            botObjInScene.AddComponent<Bot>();
    
            // Create the Bot UI
            botResponseText = CreateBotResponseText();
    
            // Set properties of Bot GameObject
            Bot.Instance.botMaterial = new Material(Shader.Find("Diffuse"));
            botObjInScene.GetComponent<Renderer>().material = Bot.Instance.botMaterial;
            Bot.Instance.botMaterial.color = Color.blue;
            botObjInScene.transform.position = new Vector3(0f, 2f, 10f);
            botObjInScene.tag = "BotTag";
        }
    
  7. Bot'tan gelen yanıtları temsil eden kullanıcı arabirimi nesnesini sahnede oluşturmaktan sorumlu olan aşağıdaki yöntemi ekleyin:

        /// <summary>
        /// Spawns cursor for the Main Camera
        /// </summary>
        private TextMesh CreateBotResponseText()
        {
            // Create a sphere as new cursor
            GameObject textObject = new GameObject();
            textObject.transform.parent = Bot.Instance.transform;
            textObject.transform.localPosition = new Vector3(0,1,0);
    
            // Resize the new cursor
            textObject.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
    
            // Creating the text of the Label
            TextMesh textMesh = textObject.AddComponent<TextMesh>();
            textMesh.anchor = TextAnchor.MiddleCenter;
            textMesh.alignment = TextAlignment.Center;
            textMesh.fontSize = 50;
            textMesh.text = "Hi there, tap on me and I will start listening.";
    
            return textMesh;
        }
    
  8. Unity'ye dönmeden önce değişikliklerinizi Visual Studio'ya kaydettiğinizden emin olun.

  9. Unity Düzenleyicisi'nde , Script klasöründeki SceneOrganiser betiğini Ana Kamera'ya sürükleyin. Sahne Düzenleyici bileşeni, aşağıdaki görüntüde gösterildiği gibi artık Ana Kamera nesnesinde görünmelidir.

    Unity Düzenleyicisi'nde Ana Kamera nesnesine eklenen Sahne Düzenleyici betiğini gösteren ekran görüntüsü.

Bölüm 13 – Derlemeden önce

Uygulamanızın kapsamlı bir testini gerçekleştirmek için holoLens'inize dışarıdan yüklemeniz gerekir. Bunu yapmadan önce şunları yaptığınızdan emin olun:

  • Bölüm 4'te belirtilen tüm ayarlar doğru ayarlanmıştır.
  • SceneOrganiser betiği Ana Kamera nesnesine eklenir.
  • Bot sınıfında BotGizli AnahtarınızıbotSecret değişkenine eklediğinizden emin olun.

14. Bölüm – HoloLens'e Derleme ve Dışarıdan Yükleme

Bu projenin Unity bölümü için gereken her şey tamamlandı, bu nedenle Unity'den derleme zamanı geldi.

  1. Derleme Ayarları, Dosya > Derleme Ayarları...'ye gidin.

  2. Derleme Ayarları penceresinde Derle'ye tıklayın.

    Uygulamayı Unity'den oluşturma

  3. Henüz yapmadıysanız Unity C# Projeleri'ni işaretleyin.

  4. Oluştur'a tıklayın. Unity, uygulamayı oluşturmak için bir klasör oluşturmanız ve ardından seçmeniz gereken bir Dosya Gezgini penceresi başlatır. Bu klasörü şimdi oluşturun ve Uygulama olarak adlandırlayın. Ardından Uygulama klasörü seçiliyken Klasör Seç'e tıklayın.

  5. Unity, projenizi Uygulama klasörüne oluşturmaya başlar.

  6. Unity derlemeyi tamamladıktan sonra (biraz zaman alabilir), derlemenizin konumunda bir Dosya Gezgini penceresi açar (görev çubuğunuzu denetleyin, her zaman pencerelerinizin üzerinde görünmeyebilir, ancak yeni bir pencere eklenmesini size bildirir).

15. Bölüm – HoloLens'e dağıtma

HoloLens'te dağıtmak için:

  1. HoloLens'inizin IP Adresine (Uzaktan Dağıtım için) ve HoloLens'inizin Geliştirici Modu'nda olduğundan emin olmanız gerekir. Bunu yapmak için:

    1. HoloLens'inizi takarken Ayarlar'ı açın.
    2. Ağ & İnternet > Wi-Fi > Gelişmiş Seçenekler'e gidin
    3. IPv4 adresini not edin.
    4. Ardından Ayarlar'a ve ardından Geliştiriciler için & Güvenliği > Güncelleştir'e gidin
    5. Geliştirici modunu açık olarak ayarlayın.
  2. Yeni Unity derlemenize ( Uygulama klasörü) gidin ve Çözüm dosyasını Visual Studio ile açın.

  3. Çözüm Yapılandırması'ndaHata Ayıkla'ya tıklayın.

  4. Çözüm Platformu'ndax86, Uzak Makine'yi seçin.

    Çözümü Visual Studio'dan dağıtın.

  5. Uygulamayı HoloLens'inize dışarıdan yüklemek için Derleme menüsüne gidin ve Çözümü Dağıt'a tıklayın.

  6. Uygulamanız artık HoloLens'inizde yüklenmeye hazır yüklü uygulamalar listesinde görünmelidir!

    Not

    Çevreleyici mikrofonlu kulaklığa dağıtmak için ÇözümPlatformu'nı Yerel Makine olarak ayarlayın ve Yapılandırma'yıHata Ayıklama olarak ayarlayın, x86ise Platform olarak ayarlayın. Ardından Derleme menüsünü kullanarak Çözümü Dağıt'ı seçerek yerel makineye dağıtın.

16. Bölüm – HoloLens'te uygulamayı kullanma

  • Uygulamayı başlattıktan sonra, botu önünüzde mavi küre olarak görürsünüz.

  • Konuşma başlatmak için küreye bakarken Dokunma Hareketi'ni kullanın.

  • Konuşmanın başlamasını bekleyin (Kullanıcı arabirimi gerçekleştiğinde bir ileti görüntüler). Bottan giriş iletisini aldıktan sonra, kırmızıya dönüşmesi ve sesinizi dinlemeye başlaması için Bot'a yeniden dokunun.

  • Konuşmayı bıraktığınızda uygulamanız iletinizi Bot'a gönderir ve kullanıcı arabiriminde görüntülenecek bir yanıt alırsınız.

  • Botunuza daha fazla ileti göndermek için işlemi yineleyin (her ileti algılamak istediğinizde dokunmanız gerekir).

Bu konuşmada Bot'un bilgileri (adınız) nasıl tutabileceği gösterilirken, bilinen bilgiler de sağlanır (stokta bulunan öğeler gibi).

Bota sorulacak bazı sorular:

what do you sell? 

how much are umbrellas?

how much are raincoats?

Tamamlanmış Web Uygulaması Botu (v4) uygulamanız

Tebrikler, v4 Microsoft Bot Framework Azure Web App Botu'nu kullanan bir karma gerçeklik uygulaması oluşturacaksınız.

Son Ürün

Ek alıştırmalar

Alıştırma 1

Bu Laboratuvardaki konuşma yapısı çok temeldir. Botunuza doğal dil anlama özellikleri sağlamak için Microsoft LUIS'i kullanın.

Alıştırma 2

Bu örnek, bir konuşmayı sonlandırmayı ve yeni bir konuşmayı yeniden başlatmayı içermez. Bot özelliğinin tamamlanmasını sağlamak için konuşmaya kapatmayı deneyin.