Urządzenia HoloLens (1. generacji) i Azure 312: integracja bota
Uwaga
Samouczki akademii rzeczywistości mieszanej zostały zaprojektowane z myślą o urządzeniach HoloLens (1. generacji) i zestawach słuchawkowych immersyjnych rzeczywistości mieszanej. W związku z tym uważamy, że ważne jest pozostawienie tych samouczków na miejscu dla deweloperów, którzy nadal szukają wskazówek dotyczących opracowywania tych urządzeń. Te samouczki nie zostaną zaktualizowane przy użyciu najnowszych zestawów narzędzi ani interakcji używanych dla urządzenia HoloLens 2. Będą one utrzymywane w celu kontynuowania pracy na obsługiwanych urządzeniach. W przyszłości zostanie opublikowana nowa seria samouczków, które pokażą, jak opracowywać urządzenia HoloLens 2. To powiadomienie zostanie zaktualizowane za pomocą linku do tych samouczków po ich opublikowaniu.
W tym kursie dowiesz się, jak utworzyć i wdrożyć bota przy użyciu programu Microsoft Bot Framework w wersji 4 i komunikować się z nim za pośrednictwem aplikacji Windows Mixed Reality.
Microsoft Bot Framework V4 to zestaw interfejsów API zaprojektowanych w celu zapewnienia deweloperom narzędzi do tworzenia rozszerzalnej i skalowalnej aplikacji bota. Aby uzyskać więcej informacji, odwiedź stronę platformy Microsoft Bot Framework lub repozytorium Git w wersji 4.
Po ukończeniu tego kursu utworzysz aplikację windows Mixed Reality, która będzie mogła wykonać następujące czynności:
- Użyj gestu naciśnięcia, aby rozpocząć nasłuchiwanie bota dla głosu użytkowników.
- Gdy użytkownik coś powiedział, bot spróbuje podać odpowiedź.
- Wyświetl odpowiedź botów jako tekst umieszczony w pobliżu bota w scenie aparatu Unity.
W aplikacji należy do Ciebie, jak zintegrować wyniki z projektem. Ten kurs został zaprojektowany, aby nauczyć cię, jak zintegrować usługę platformy Azure z projektem aparatu Unity. Twoim zadaniem jest wykorzystanie wiedzy uzyskanych z tego kursu w celu ulepszenia aplikacji rzeczywistości mieszanej.
Obsługa urządzeń
Kurs | HoloLens | Immersyjne zestawy nagłowne |
---|---|---|
MR i Azure 312: integracja bota | ✔️ | ✔️ |
Uwaga
Chociaż ten kurs koncentruje się głównie na urządzeniu HoloLens, możesz również zastosować to, czego nauczysz się w tym kursie, do zestawów słuchawkowych immersywnych (VR) systemu Windows Mixed Reality. Ponieważ immersyjne zestawy nagłowne (VR) nie mają dostępnych kamer, potrzebny jest zewnętrzny aparat podłączony do komputera. Wraz z kursem zobaczysz notatki dotyczące wszelkich zmian, które mogą być potrzebne do obsługi immersywnych zestawów słuchawkowych (VR).
Wymagania wstępne
Uwaga
Ten samouczek jest przeznaczony dla deweloperów, którzy mają podstawowe doświadczenie w językach Unity i C#. Należy również pamiętać, że wymagania wstępne i pisemne instrukcje zawarte w tym dokumencie reprezentują to, co zostało przetestowane i zweryfikowane w momencie pisania dokumentu (lipiec 2018 r.). Możesz bezpłatnie korzystać z najnowszego oprogramowania, jak wymieniono w artykule dotyczącym instalacji narzędzi , choć nie należy zakładać, że informacje zawarte w tym kursie doskonale pasują do tego, co znajdziesz w nowszym oprogramowaniu niż to, co zostało wymienione poniżej.
Na potrzeby tego kursu zalecamy następujące oprogramowanie i sprzęt:
- Komputer deweloperzy zgodny z windows Mixed Reality na potrzeby programowania immersyjnego zestawu słuchawkowego (VR)
- Windows 10 Fall Creators Update (lub nowszy) z włączonym trybem dewelopera
- Najnowszy zestaw SDK systemu Windows 10
- Unity 2017.4
- Visual Studio 2017
- Zestaw słuchawkowy windows Mixed Reality immersywny (VR) lub Microsoft HoloLens z włączonym trybem dewelopera
- Dostęp do Internetu dla platformy Azure i pobierania usługi Azure Bot. Aby uzyskać więcej informacji, skorzystaj z tego linku.
Przed rozpoczęciem
- Aby uniknąć problemów podczas tworzenia tego projektu, zdecydowanie zaleca się utworzenie projektu wymienionego w tym samouczku w folderze głównym lub niemal głównym (długie ścieżki folderów mogą powodować problemy w czasie kompilacji).
- Skonfiguruj i przetestuj urządzenie HoloLens. Jeśli potrzebujesz pomocy technicznej dotyczącej konfigurowania urządzenia HoloLens, zapoznaj się z artykułem dotyczącym konfiguracji urządzenia HoloLens.
- Dobrym pomysłem jest przeprowadzenie kalibracji i dostrajania czujników podczas tworzenia nowej aplikacji HoloLens (czasami może to pomóc w wykonywaniu tych zadań dla każdego użytkownika).
Aby uzyskać pomoc dotyczącą kalibracji, skorzystaj z tego linku do artykułu Kalibracja urządzenia HoloLens.
Aby uzyskać pomoc dotyczącą dostrajania czujników, skorzystaj z tego linku do artykułu Dostrajanie czujników HoloLens.
Rozdział 1 — tworzenie aplikacji bota
Pierwszym krokiem jest utworzenie bota jako lokalnej aplikacji internetowej ASP.Net Core. Po zakończeniu i przetestowaniu go opublikujesz w witrynie Azure Portal.
Otwórz program Visual Studio. Utwórz nowy projekt, wybierz pozycję Aplikacja internetowa platformy ASP NET Core jako typ projektu (znajdziesz go w podsekcji .NET Core) i wywołaj go MyBot. Kliknij przycisk OK.
W oknie, które zostanie wyświetlone, wybierz pozycję Puste. Upewnij się również, że element docelowy jest ustawiony na platformę ASP NET Core 2.0 , a ustawienie Uwierzytelnianie ma wartość Brak uwierzytelniania. Kliknij przycisk OK.
Rozwiązanie zostanie teraz otwarte. Kliknij prawym przyciskiem myszy pozycję Rozwiązanie Mybot w Eksplorator rozwiązań i kliknij pozycję Zarządzaj pakietami NuGet dla rozwiązania.
Na karcie Przeglądaj wyszukaj ciąg Microsoft.Bot.Builder.Integration.AspNet.Core (upewnij się, że zaznaczono opcję Uwzględnij wstępne wydanie). Wybierz pakiet w wersji 4.0.1-preview i zaznacz pola projektu. Następnie kliknij pozycję Zainstaluj. Teraz zainstalowano biblioteki wymagane dla platformy Bot Framework w wersji 4. Zamknij stronę NuGet.
Kliknij prawym przyciskiem myszy projekt MyBot w Eksplorator rozwiązań i kliknij pozycję Dodaj | klasę.
Nadaj klasie nazwę MyBot i kliknij pozycję Dodaj.
Powtórz poprzedni punkt, aby utworzyć inną klasę o nazwie ConversationContext.
Kliknij prawym przyciskiem myszy pozycję wwwroot w Eksplorator rozwiązań i kliknij pozycję Dodaj | nowy element. Wybierz pozycję Strona HTML (znajdziesz ją w podsekcji Web). Nadaj plikowi nazwę default.html. Kliknij przycisk Dodaj.
Lista klas/obiektów w Eksplorator rozwiązań powinna wyglądać jak na poniższym obrazie.
Kliknij dwukrotnie klasę ConversationContext . Ta klasa jest odpowiedzialna za przechowywanie zmiennych używanych przez bota w celu zachowania kontekstu konwersacji. Te wartości kontekstu konwersacji są zachowywane w wystąpieniu tej klasy, ponieważ każde wystąpienie klasy MyBot będzie odświeżane za każdym razem, gdy zostanie odebrane działanie. Dodaj następujący kod do klasy:
namespace MyBot { public static class ConversationContext { internal static string userName; internal static string userMsg; } }
Kliknij dwukrotnie klasę MyBot . Ta klasa będzie obsługiwać programy obsługi wywoływane przez wszelkie przychodzące działania od klienta. W tej klasie dodasz kod używany do tworzenia konwersacji między botem a klientem. Jak wspomniano wcześniej, wystąpienie tej klasy jest inicjowane za każdym razem, gdy zostanie odebrane działanie. Dodaj następujący kod do tej klasy:
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?"); } } } }
Kliknij dwukrotnie klasę Startup . Ta klasa zainicjuje bota. Dodaj następujący kod do klasy:
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(); } } }
Otwórz plik klasy Program i sprawdź, czy kod w nim jest taki sam jak poniżej:
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(); } }
Pamiętaj, aby zapisać zmiany, aby to zrobić, przejdź do pozycji Plik>Zapisz wszystko z paska narzędzi w górnej części programu Visual Studio.
Rozdział 2 . Tworzenie usługi Azure Bot Service
Po utworzeniu kodu bota musisz opublikować go w wystąpieniu usługi Bot Service aplikacji internetowej w witrynie Azure Portal. W tym rozdziale pokazano, jak utworzyć i skonfigurować usługę Bot Service na platformie Azure, a następnie opublikować w niej kod.
Najpierw zaloguj się do witryny Azure Portal (https://portal.azure.com).
- Jeśli nie masz jeszcze konta platformy Azure, musisz je utworzyć. Jeśli obserwujesz ten samouczek w sytuacji w klasie lub laboratorium, poproś instruktora lub jednego z opiekunów o pomoc przy konfigurowaniu nowego konta.
Po zalogowaniu kliknij pozycję Utwórz zasób w lewym górnym rogu i wyszukaj bota aplikacji internetowej, a następnie kliknij przycisk Enter.
Nowa strona zawiera opis usługi Bot Service aplikacji internetowej. W lewym dolnym rogu tej strony wybierz przycisk Utwórz , aby utworzyć skojarzenie z tą usługą.
Po kliknięciu pozycji Utwórz:
Wstaw żądaną nazwę dla tego wystąpienia usługi.
Wybierz subskrypcję.
Wybierz grupę zasobów lub utwórz nową. Grupa zasobów umożliwia monitorowanie, kontrolowanie dostępu, aprowizowania i zarządzania rozliczeniami dla kolekcji zasobów platformy Azure. Zaleca się zachowanie wszystkich usług platformy Azure skojarzonych z jednym projektem (np. takimi jak te kursy) w ramach wspólnej grupy zasobów.
Jeśli chcesz dowiedzieć się więcej o grupach zasobów platformy Azure, skorzystaj z tego linku
Określ lokalizację dla grupy zasobów (jeśli tworzysz nową grupę zasobów). Lokalizacja najlepiej znajdować się w regionie, w którym aplikacja będzie uruchamiana. Niektóre zasoby platformy Azure są dostępne tylko w niektórych regionach.
Wybierz odpowiednią warstwę cenową, jeśli po raz pierwszy utworzysz usługę Bot Service aplikacji internetowej, powinna być dostępna warstwa bezpłatna (o nazwie F0).
Nazwa aplikacji może być po prostu pozostawiona tak samo jak nazwa bota.
Pozostaw szablon bota jako Podstawowy (C#).
Plan usługi App Service/lokalizacja powinien zostać wypełniony automatycznie dla twojego konta.
Ustaw usługę Azure Storage , której chcesz użyć do hostowania bota. Jeśli jeszcze go nie masz, możesz go utworzyć tutaj.
Musisz również potwierdzić, że rozumiesz warunki i postanowienia zastosowane do tej usługi.
Kliknij przycisk Utwórz.
Po kliknięciu pozycji Utwórz trzeba będzie poczekać na utworzenie usługi. Może to potrwać minutę.
Po utworzeniu wystąpienia usługi w portalu zostanie wyświetlone powiadomienie.
Kliknij powiadomienie, aby zapoznać się z nowym wystąpieniem usługi.
Kliknij przycisk Przejdź do zasobu w powiadomieniu, aby zapoznać się z nowym wystąpieniem usługi. Nastąpi przekierowanie do nowego wystąpienia usługi platformy Azure.
W tym momencie należy skonfigurować funkcję o nazwie Direct Line , aby umożliwić aplikacji klienckiej komunikowanie się z tą usługą Bot Service. Kliknij pozycję Kanały, a następnie w sekcji Dodawanie polecanego kanału kliknij pozycję Konfiguruj kanał Direct Line.
Na tej stronie znajdziesz klucze tajne , które umożliwią aplikacji klienckiej uwierzytelnianie za pomocą bota. Kliknij przycisk Pokaż i pobierz kopię jednego z wyświetlonych kluczy, ponieważ będzie to potrzebne w dalszej części projektu.
Rozdział 3 — Publikowanie bota w usłudze Azure Web App Bot Service
Teraz, gdy usługa jest gotowa, musisz opublikować utworzony wcześniej kod bota w nowo utworzonej usłudze Bot Service.
Uwaga
Za każdym razem, gdy wprowadzisz zmiany w rozwiązaniu bota/kodzie, musisz opublikować bota w usłudze Azure Service.
Wróć do utworzonego wcześniej rozwiązania programu Visual Studio.
Kliknij prawym przyciskiem myszy projekt MyBot w Eksplorator rozwiązań, a następnie kliknij pozycję Publikuj.
Na stronie Wybierz miejsce docelowe publikacji kliknij pozycję App Service, a następnie wybierz pozycję Istniejący, a następnie kliknij pozycję Utwórz profil (może być konieczne kliknięcie strzałki listy rozwijanej obok przycisku Publikuj, jeśli nie jest to widoczne).
Jeśli jeszcze nie zalogowano się do konta Microsoft, musisz to zrobić tutaj.
Na stronie Publikowanie znajdziesz, że musisz ustawić tę samą subskrypcję, która była używana do tworzenia usługi Bot Service aplikacji internetowej. Następnie ustaw widok jako grupę zasobów, a następnie w strukturze folderów rozwijanych wybierz utworzoną wcześniej grupę zasobów. Kliknij przycisk OK.
Teraz kliknij przycisk Publikuj i poczekaj na opublikowanie bota (może to potrwać kilka minut).
Rozdział 4 — Konfigurowanie projektu aparatu Unity
Poniżej przedstawiono typową konfigurację do opracowywania za pomocą rzeczywistości mieszanej, a w związku z tym jest to dobry szablon dla innych projektów.
Otwórz aparat Unity i kliknij pozycję Nowy.
Teraz musisz podać nazwę projektu aparatu Unity. Wstaw bota HoloLens. Upewnij się, że szablon projektu jest ustawiony na 3D. Ustaw lokalizację na odpowiednią dla Ciebie (pamiętaj, że bliżej katalogów głównych jest lepiej). Następnie kliknij pozycję Utwórz projekt.
Po otwarciu aparatu Unity warto sprawdzić, czy domyślny edytor skryptów jest ustawiony na program Visual Studio. Przejdź do pozycji Edytuj > preferencje , a następnie w nowym oknie przejdź do pozycji Narzędzia zewnętrzne. Zmień edytor skryptów zewnętrznych na Visual Studio 2017. Zamknij okno Preferencje.
Następnie przejdź do pozycji Ustawienia kompilacji pliku > i wybierz pozycję platforma uniwersalna systemu Windows, a następnie kliknij przycisk Przełącz platformę, aby zastosować wybór.
Nadal w obszarze Ustawienia kompilacji pliku > i upewnij się, że:
Urządzenie docelowe jest ustawione na urządzenie HoloLens
W przypadku immersyjnych zestawów słuchawkowych ustaw opcję Urządzenie docelowe na dowolne urządzenie.
Typ kompilacji jest ustawiony na D3D
Zestaw SDK jest ustawiony na najnowszą zainstalowaną
Dla wersji programu Visual Studio jest ustawiona wartość Najnowsza zainstalowana
Kompilowanie i uruchamianie jest ustawione na komputer lokalny
Zapisz scenę i dodaj ją do kompilacji.
W tym celu wybierz pozycję Dodaj otwarte sceny. Zostanie wyświetlone okno zapisywania.
Utwórz nowy folder dla tego i dowolnej przyszłości sceny, a następnie wybierz przycisk Nowy folder , aby utworzyć nowy folder, nadaj mu nazwę Sceny.
Otwórz nowo utworzony folder Sceny , a następnie w polu Nazwa pliku: tekst wpisz BotScene, a następnie kliknij pozycję Zapisz.
Pozostałe ustawienia w obszarze Ustawienia kompilacji powinny być pozostawione jako domyślne na razie.
W oknie Ustawienia kompilacji kliknij przycisk Ustawienia odtwarzacza, spowoduje to otwarcie powiązanego panelu w obszarze, w którym znajduje się inspektor.
W tym panelu należy zweryfikować kilka ustawień:
Na karcie Inne ustawienia:
Wersja środowiska uruchomieniowego skryptów powinna być eksperymentalna (odpowiednik platformy NET 4.6); zmiana tego ustawienia będzie wymagać ponownego uruchomienia edytora.
Zaplecze skryptów powinno mieć wartość .NET
Poziom zgodności interfejsu API powinien mieć wartość .NET 4.6
Na karcie Ustawienia publikowania w obszarze Możliwości sprawdź:
InternetClient
Mikrofon
W dalszej części panelu w obszarze Ustawienia XR (znajdujące się poniżej ustawienia publikowania) zaznacz pole Virtual Reality Supported (Obsługiwane w rzeczywistości wirtualnej), upewnij się, że dodano zestaw WINDOWS Mixed Reality SDK .
Po powrocie do ustawień kompilacji Projekty języka C# środowiska Unity nie są już wyszarzone; zaznacz pole wyboru obok tego.
Zamknij okno Build Settings (Ustawienia kompilacji).
Zapisz scenę i projekt (FILE > SAVE SCENE / FILE > SAVE PROJECT).
Rozdział 5 — Konfiguracja aparatu
Ważne
Jeśli chcesz pominąć składnik Konfiguracji aparatu Unity tego kursu i kontynuować bezpośrednio w kodzie, możesz pobrać ten pakiet Azure-MR-312-Package.unitypackage, zaimportować go do projektu jako pakiet niestandardowy, a następnie kontynuować z rozdziału 7.
W panelu Hierarchia wybierz kamerę główną.
Po wybraniu tej opcji będzie można zobaczyć wszystkie składniki głównego aparatu w panelu Inspektor.
- Obiekt Camera musi mieć nazwę Main Camera (zanotuj pisownię)
- Główny tag aparatu musi być ustawiony na MainCamera (zanotuj pisownię)
- Upewnij się, że pozycja przekształcania jest ustawiona na 0, 0, 0
- Ustaw opcję Wyczyść flagi na Kolor stały.
- Ustaw kolor tła składnika Aparatu na , Alfa 0 (kod szesnastkowy: #00000000)
Rozdział 6 — importowanie biblioteki Newtonsoft
Aby ułatwić deserializacji i serializowania odebranych i wysłanych do usługi Bot Service, należy pobrać bibliotekę Newtonsoft . W tym miejscu znajdziesz zgodną wersję z prawidłową strukturą folderów aparatu Unity.
Aby zaimportować bibliotekę Newtonsoft do projektu, użyj pakietu aparatu Unity, który został dołączony do tego kursu.
Dodaj pakiet unitypackage do aparatu Unity przy użyciu opcji menu Importuj pakiet>niestandardowy pakietu Assets>.
W wyświetlonym oknie Importuj pakiet aparatu Unity upewnij się, że wybrano wszystkie elementy w obszarze (i w tym) Wtyczki .
Kliknij przycisk Importuj, aby dodać elementy do projektu.
Przejdź do folderu Newtonsoft w obszarze Wtyczki w widoku projektu i wybierz wtyczkę Newtonsoft.
Po wybraniu wtyczki Newtonsoft upewnij się, że pole wyboru Dowolna platforma jest niezaznaczone, a następnie upewnij się, że WSAPlayer jest również niezaznaczone, a następnie kliknij przycisk Zastosuj. Wystarczy potwierdzić, że pliki są poprawnie skonfigurowane.
Uwaga
Oznaczanie tych wtyczek konfiguruje je tak, aby były używane tylko w Edytorze aparatu Unity. Istnieje inny zestaw z nich w folderze WSA, który będzie używany po wyeksportowaniu projektu z aparatu Unity.
Następnie należy otworzyć folder WSA w folderze Newtonsoft . Zobaczysz kopię tego samego pliku, który został właśnie skonfigurowany. Wybierz plik, a następnie w inspektorze upewnij się, że
- Wszystkie platformy są niezaznaczone
- zaznaczono tylko WSAPlayer
- Nie zaznaczono procesu
Rozdział 7 — tworzenie bottagu
Utwórz nowy obiekt Tag o nazwie BotTag. Wybierz kamerę główną w scenie. Kliknij menu rozwijane Tag w panelu Inspector (Inspektor). Kliknij pozycję Dodaj tag.
+ Kliknij symbol. Nazwij nowy tag jako BotTag, Zapisz.
Ostrzeżenie
Nie należy stosować botTag do aparatu głównego. Jeśli to zrobiono przypadkowo, pamiętaj o zmianie tagu Main Camera z powrotem na MainCamera.
Rozdział 8 — tworzenie klasy BotObjects
Pierwszym skryptem, który należy utworzyć, jest klasa BotObjects , która jest pustą klasą utworzoną, aby seria innych obiektów klas mogła być przechowywana w tym samym skry skrycie i uzyskiwana przez inne skrypty w scenie.
Tworzenie tej klasy jest wyłącznie wyborem architektonicznym. Te obiekty mogą być hostowane w skry skrycie bota, który zostanie utworzony w dalszej części tego kursu.
Aby utworzyć tę klasę:
Kliknij prawym przyciskiem myszy w panelu Projekt, a następnie pozycję Utwórz > folder. Nadaj folderowi nazwę Scripts( Skrypty).
Kliknij dwukrotnie folder Skrypty, aby go otworzyć. Następnie w tym folderze kliknij prawym przyciskiem myszy i wybierz polecenie Utwórz > skrypt języka C#. Nadaj skryptowi nazwę BotObjects.
Kliknij dwukrotnie nowy skrypt BotObjects , aby otworzyć go za pomocą programu Visual Studio.
Usuń zawartość skryptu i zastąp ją następującym kodem:
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; } }
Przed powrotem do aparatu Unity pamiętaj o zapisaniu zmian w programie Visual Studio.
Rozdział 9 — Tworzenie klasy GazeInput
Następną klasą , którą utworzysz, jest klasa GazeInput . Ta klasa jest odpowiedzialna za:
- Utworzenie kursora, który będzie reprezentować spojrzenie odtwarzacza.
- Wykrywanie obiektów trafionych przez spojrzenie odtwarzacza i trzymanie odwołania do wykrytych obiektów.
Aby utworzyć tę klasę:
Przejdź do utworzonego wcześniej folderu Skrypty .
Kliknij prawym przyciskiem myszy wewnątrz folderu Utwórz > skrypt języka C#. Wywołaj skrypt GazeInput.
Kliknij dwukrotnie nowy skrypt GazeInput , aby otworzyć go za pomocą programu Visual Studio.
Wstaw następujący wiersz w prawo u góry nazwy klasy:
/// <summary> /// Class responsible for the User's gaze interactions /// </summary> [System.Serializable] public class GazeInput : MonoBehaviour
Następnie dodaj następujące zmienne wewnątrz klasy GazeInput powyżej metody Start():
[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;
Należy dodać kod metody Start(). Zostanie ona wywołana, gdy klasa inicjuje:
/// <summary> /// Start method used upon initialization. /// </summary> internal virtual void Start() { FocusedObject = null; Cursor = CreateCursor(); }
Zaimplementuj metodę, która utworzy wystąpienie i skonfiguruje kursor spojrzenia:
/// <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; }
Zaimplementuj metody, które skonfigurują raycast z kamery głównej i będą śledzić bieżący obiekt skoncentrowany.
/// <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); } } } }
Przed powrotem do aparatu Unity pamiętaj o zapisaniu zmian w programie Visual Studio.
Rozdział 10 — tworzenie klasy Bot
Skrypt, który teraz utworzysz, nosi nazwę Bot. Jest to podstawowa klasa aplikacji, która przechowuje:
- Poświadczenia bota aplikacji internetowej
- Metoda, która zbiera polecenia głosowe użytkownika
- Metoda niezbędna do inicjowania konwersacji z botem aplikacji internetowej
- Metoda niezbędna do wysyłania komunikatów do bota aplikacji internetowej
Aby wysyłać komunikaty do usługi Bot Service, coroutine SendMessageToBot() utworzy działanie, które jest obiektem rozpoznawanym przez platformę Bot Framework jako danymi wysyłanymi przez użytkownika.
Aby utworzyć tę klasę:
Kliknij dwukrotnie folder Skrypty, aby go otworzyć.
Kliknij prawym przyciskiem myszy wewnątrz folderu Scripts (Skrypty ), kliknij polecenie Create C# Script (Utwórz > skrypt języka C#). Nazwij bota skryptu.
Kliknij dwukrotnie nowy skrypt, aby otworzyć go za pomocą programu Visual Studio.
Zaktualizuj przestrzenie nazw tak samo jak w przypadku następujących elementów w górnej części klasy Bot :
using Newtonsoft.Json; using System.Collections; using System.Text; using UnityEngine; using UnityEngine.Networking; using UnityEngine.Windows.Speech;
Wewnątrz klasy Bot dodaj następujące zmienne:
/// <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;
Uwaga
Upewnij się, że wstawisz klucz tajny bota do zmiennej botSecret. Klucz tajny bota został zanotowany na początku tego kursu, w rozdziale 2, krok 10.
Teraz należy dodać kod dla aplikacji Awake() i Start().
/// <summary> /// Called on Initialization /// </summary> void Awake() { Instance = this; } /// <summary> /// Called immediately after Awake method /// </summary> void Start() { botState = BotState.ReadyToListen; }
Dodaj dwa programy obsługi, które są wywoływane przez biblioteki mowy po rozpoczęciu i zakończeniu przechwytywania głosu. Element DictationRecognizer automatycznie przestanie przechwytywać głos użytkownika, gdy użytkownik przestanie mówić.
/// <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(); }
Poniższa procedura obsługi zbiera wynik danych wejściowych głosowych użytkownika i wywołuje współpracę odpowiedzialną za wysyłanie komunikatu do usługi Bot Service aplikacji internetowej.
/// <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(); }
Aby rozpocząć konwersację z botem, wywoływana jest następująca coroutine. Po zakończeniu rozmowy wywołanie konwersacji wywoła metodę SendMessageToCoroutine() przez przekazanie serii parametrów, które ustawią działanie do wysłania do usługi Bot Service jako pustą wiadomość. Jest to wykonywane w celu monitowania usługi Bot Service o zainicjowanie okna dialogowego.
/// <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")); }
Następująca kohroutyna jest wywoływana w celu utworzenia działania, które ma zostać wysłane do usługi Bot Service.
/// <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)); } }
Następująca kohroutyna jest wywoływana w celu żądania odpowiedzi po wysłaniu działania do usługi Bot Service.
/// <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; } }
Ostatnia metoda, która ma zostać dodana do tej klasy, jest wymagana do wyświetlenia komunikatu w scenie:
/// <summary> /// Set the UI Response Text of the bot /// </summary> internal void SetBotResponseText(string responseString) { SceneOrganiser.Instance.botResponseText.text = responseString; }
Uwaga
W konsoli edytora aparatu Unity może zostać wyświetlony błąd dotyczący braku klasy SceneOrganiser . Zignoruj ten komunikat, ponieważ utworzysz tę klasę w dalszej części samouczka.
Przed powrotem do aparatu Unity pamiętaj o zapisaniu zmian w programie Visual Studio.
Rozdział 11 — Tworzenie klasy Interakcje
Klasa, którą teraz utworzysz, nosi nazwę Interakcje. Ta klasa służy do wykrywania danych wejściowych naciśnięcia urządzenia HoloLens od użytkownika.
Jeśli użytkownik naciągnie obiekt Bot w scenie, a bot będzie gotowy do nasłuchiwania danych głosowych, obiekt Bot zmieni kolor na czerwony i rozpocznie nasłuchiwanie danych głosowych.
Ta klasa dziedziczy z klasy GazeInput i dlatego może odwoływać się do metody Start() i zmiennych z tej klasy, co oznacza użycie bazy.
Aby utworzyć tę klasę:
Kliknij dwukrotnie folder Skrypty, aby go otworzyć.
Kliknij prawym przyciskiem myszy wewnątrz folderu Scripts (Skrypty ), kliknij polecenie Create C# Script (Utwórz > skrypt języka C#). Nadaj skryptowi nazwę Interakcje.
Kliknij dwukrotnie nowy skrypt, aby otworzyć go za pomocą programu Visual Studio.
Zaktualizuj przestrzenie nazw i dziedziczenie klas tak samo jak w przypadku następujących elementów w górnej części klasy Interactions :
using UnityEngine.XR.WSA.Input; public class Interactions : GazeInput {
Wewnątrz klasy Interactions dodaj następującą zmienną:
/// <summary> /// Allows input recognition with the HoloLens /// </summary> private GestureRecognizer _gestureRecognizer;
Następnie dodaj metodę Start():
/// <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(); }
Dodaj procedurę obsługi, która zostanie wyzwolona, gdy użytkownik wykonuje gest naciśnięcia przed aparatem HoloLens
/// <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()); } } } }
Przed powrotem do aparatu Unity pamiętaj o zapisaniu zmian w programie Visual Studio.
Rozdział 12 — Tworzenie klasy SceneOrganiser
Ostatnia klasa wymagana w tym laboratorium nosi nazwę SceneOrganiser. Ta klasa skonfiguruje scenę programowo, dodając składniki i skrypty do aparatu głównego oraz tworząc odpowiednie obiekty w scenie.
Aby utworzyć tę klasę:
Kliknij dwukrotnie folder Skrypty, aby go otworzyć.
Kliknij prawym przyciskiem myszy wewnątrz folderu Scripts (Skrypty ), kliknij polecenie Create C# Script (Utwórz > skrypt języka C#). Nadaj skryptowi nazwę SceneOrganiser.
Kliknij dwukrotnie nowy skrypt, aby otworzyć go za pomocą programu Visual Studio.
Wewnątrz klasy SceneOrganiser dodaj następujące zmienne:
/// <summary> /// Static instance of this class /// </summary> public static SceneOrganiser Instance; /// <summary> /// The 3D text representing the Bot response /// </summary> internal TextMesh botResponseText;
Następnie dodaj metody Awake() i Start():
/// <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(); }
Dodaj następującą metodę, odpowiedzialną za utworzenie obiektu Bot w scenie i skonfigurowanie parametrów i składników:
/// <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"; }
Dodaj następującą metodę odpowiedzialną za utworzenie obiektu interfejsu użytkownika w scenie reprezentującą odpowiedzi bota:
/// <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; }
Przed powrotem do aparatu Unity pamiętaj o zapisaniu zmian w programie Visual Studio.
W edytorze aparatu Unity przeciągnij skrypt SceneOrganiser z folderu Scripts do głównego aparatu. Składnik Organizator sceny powinien teraz pojawić się w obiekcie Main Camera, jak pokazano na poniższej ilustracji.
Rozdział 13 – Przed budynkiem
Aby przeprowadzić dokładny test aplikacji, należy załadować ją bezpośrednio na urządzenie HoloLens. Przed wykonaniem upewnij się, że:
- Wszystkie ustawienia wymienione w rozdziale 4 są ustawione poprawnie.
- Skrypt SceneOrganiser jest dołączony do obiektu Main Camera .
- W klasie Bot upewnij się, że klucz tajny bota został wstawiony do zmiennej botSecret.
Rozdział 14 — Kompilowanie i ładowanie bezpośrednie do urządzenia HoloLens
Wszystko, co jest potrzebne w sekcji aparatu Unity tego projektu, zostało ukończone, więc nadszedł czas, aby skompilować go z poziomu aparatu Unity.
Przejdź do obszaru Ustawienia kompilacji, Ustawienia kompilacji pliku > ....
W oknie Ustawienia kompilacji kliknij pozycję Kompiluj.
Jeśli jeszcze tego nie zrobiono, zaznacz pole Unity C# Projects (Projekty języka C# aparatu Unity).
Kliknij pozycję Kompiluj. Aparat Unity uruchomi okno Eksplorator plików, w którym należy utworzyć, a następnie wybierz folder do skompilowania aplikacji. Utwórz teraz ten folder i nadaj mu nazwę Aplikacja. Następnie po wybraniu folderu Aplikacja kliknij pozycję Wybierz folder.
Aparat Unity rozpocznie kompilowanie projektu w folderze App .
Po zakończeniu kompilowania środowiska Unity (może to zająć trochę czasu), zostanie otwarte okno Eksplorator plików w lokalizacji kompilacji (sprawdź pasek zadań, ponieważ może nie zawsze pojawiać się nad oknami, ale powiadomi o dodaniu nowego okna).
Rozdział 15 — Wdrażanie na urządzeniu HoloLens
Aby wdrożyć na urządzeniu HoloLens:
Będziesz potrzebować adresu IP urządzenia HoloLens (na potrzeby zdalnego wdrażania) i upewnij się, że urządzenie HoloLens jest w trybie dewelopera. Czynność:
- Podczas noszenia urządzenia HoloLens otwórz ustawienia.
- Przejdź do pozycji Sieć i Internetowe > opcje zaawansowane sieci Wi-Fi >
- Zanotuj adres IPv4 .
- Następnie przejdź z powrotem do pozycji Ustawienia, a następnie przejdź do pozycji Aktualizuj i zabezpieczenia > dla deweloperów
- Ustaw tryb dewelopera wł.
Przejdź do nowej kompilacji aparatu Unity ( folderu App ) i otwórz plik rozwiązania za pomocą programu Visual Studio.
W obszarze Konfiguracja rozwiązania wybierz pozycję Debuguj.
W polu Platforma rozwiązania wybierz pozycję x86, Maszyna zdalna.
Przejdź do menu Kompilacja i kliknij pozycję Wdróż rozwiązanie, aby załadować aplikację bezpośrednio do urządzenia HoloLens.
Aplikacja powinna być teraz wyświetlana na liście zainstalowanych aplikacji na urządzeniu HoloLens, gotowych do uruchomienia.
Uwaga
Aby wdrożyć w immersywnym zestawie słuchawkowym, ustaw wartość Platforma rozwiązania na Komputer lokalny i ustaw wartość Konfiguracja na Debugowanie z wartością x86 jako platforma. Następnie wdróż na komputerze lokalnym, korzystając z menu Kompilacja, wybierając pozycję Wdróż rozwiązanie.
Rozdział 16 — Używanie aplikacji na urządzeniu HoloLens
Po uruchomieniu aplikacji zobaczysz bota jako niebieską sferę.
Użyj gestu naciśnięcia, gdy patrzysz na sferę, aby zainicjować konwersację.
Poczekaj na rozpoczęcie konwersacji (interfejs użytkownika wyświetli komunikat w takim przypadku). Po otrzymaniu komunikatu wprowadzającego z bota naciśnij ponownie bota, aby zmienić kolor na czerwony i rozpocząć nasłuchiwanie głosu.
Po zakończeniu rozmowy aplikacja wyśle wiadomość do bota i natychmiast otrzymasz odpowiedź, która będzie wyświetlana w interfejsie użytkownika.
Powtórz ten proces, aby wysłać więcej komunikatów do bota (musisz nacisnąć za każdym razem, gdy chcesz użyć komunikatu).
Ta konwersacja pokazuje, jak bot może przechowywać informacje (twoje imię i nazwisko), a także dostarczać znane informacje (takie jak elementy, które są zaopatrzone).
Kilka pytań, które należy zadać botowi:
what do you sell?
how much are umbrellas?
how much are raincoats?
Zakończona aplikacja bota aplikacji internetowej (wersja 4)
Gratulacje, utworzono aplikację rzeczywistości mieszanej, która korzysta z bota aplikacji internetowej platformy Azure, platformy Microsoft Bot Framework w wersji 4.
Ćwiczenia dodatkowe
Ćwiczenie 1
Struktura konwersacji w tym laboratorium jest bardzo podstawowa. Użyj usługi Microsoft LUIS, aby zapewnić możliwości interpretacji języka naturalnego bota.
Ćwiczenie 2
W tym przykładzie nie znaleziono zakończenia konwersacji i ponownego uruchomienia nowej konwersacji. Aby ukończyć funkcję bota, spróbuj zaimplementować zamknięcie konwersacji.