312. Смешанная реальность и Azure: интеграция ботовMR and Azure 312: Bot integration

Примечание

Руководства Mixed Reality Academy были разработаны для иммерсивных гарнитур HoloLens (1-го поколения) и иммерсивных гарнитур Mixed Reality.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. Поэтому мы считаем, что важно оставить эти руководства для разработчиков, которые ищут рекомендации по разработке для этих устройств.As such, we feel it is important to leave these tutorials in place for developers who are still looking for guidance in developing for those devices. Данные руководства не будут обновляться с учетом последних наборов инструментов или возможностей взаимодействия для HoloLens 2.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Они будут сохранены для работы на поддерживаемых устройствах.They will be maintained to continue working on the supported devices. Появится новая серия руководств, которые будут опубликованы в будущем, где будет показано, как разрабатывать данные для HoloLens 2.There will be a new series of tutorials that will be posted in the future that will demonstrate how to develop for HoloLens 2. Это уведомление будет обновлено ссылкой на эти учебники при их публикации.This notice will be updated with a link to those tutorials when they are posted.

В этом курсе вы узнаете, как создать и развернуть робот с помощью Microsoft Bot Framework v4 и взаимодействовать с ним через приложение Windows Mixed Reality.In this course, you will learn how to create and deploy a bot using the Microsoft Bot Framework V4 and communicate with it through a Windows Mixed Reality application.

Microsoft Bot Framework v4 — это набор интерфейсов API, предназначенных для предоставления разработчикам средств для создания расширяемого и масштабируемого приложения-робота.The Microsoft Bot Framework V4 is a set of APIs designed to provide developers with the tools to build an extensible and scalable bot application. Дополнительные сведения см. на странице Microsoft Bot Framework или в репозитории Git v4.For more information, visit the Microsoft Bot Framework page or the V4 Git Repository.

После завершения этого курса вы получите приложение Windows Mixed Reality, которое сможет сделать следующее:After completing this course, you will have built a Windows Mixed Reality application, which will be able to do the following:

  1. Используйте жест касания для запуска программы-робота, ожидающей голоса пользователя.Use a Tap Gesture to start the bot listening for the users voice.
  2. Когда пользователь сказал что-то, программа Bot попытается предоставить ответ.When the user has said something, the bot will attempt to provide a response.
  3. Отображение ответа программы-роботы в виде текста, расположенного рядом с Bot, в сцене Unity.Display the bots reply as text, positioned near the bot, in the Unity Scene.

В приложении вы будете выполнять интеграцию результатов с вашей структурой.In your application, it is up to you as to how you will integrate the results with your design. Этот курс предназначен для изучения того, как интегрировать службу Azure с проектом Unity.This course is designed to teach you how to integrate an Azure Service with your Unity project. Это ваша задача использовать знания, полученные из этого курса, для улучшения приложения смешанной реальности.It is your job to use the knowledge you gain from this course to enhance your mixed reality application.

Поддержка устройствDevice support

КурсCourse HoloLensHoloLens Иммерсивные гарнитурыImmersive headsets
312. Смешанная реальность и Azure: интеграция ботовMR and Azure 312: Bot integration ✔️✔️ ✔️✔️

Примечание

Хотя этот курс в основном ориентирован на HoloLens, вы можете также применить сведения, которые вы узнаете в этом курсе, к головным телефонам Windows Mixed Reality (VR).While this course primarily focuses on HoloLens, you can also apply what you learn in this course to Windows Mixed Reality immersive (VR) headsets. Так как у головных гарнитур нет доступных камер, вам потребуется внешняя камера, подключенная к компьютеру.Because immersive (VR) headsets do not have accessible cameras, you will need an external camera connected to your PC. При работе с курсом вы увидите заметки о любых изменениях, которые могут потребоваться для поддержки головных телефонов (VR).As you follow along with the course, you will see notes on any changes you might need to employ to support immersive (VR) headsets.

Предварительные требованияPrerequisites

Примечание

Этот учебник предназначен для разработчиков, имеющих базовый опыт работы с Unity и C#.This tutorial is designed for developers who have basic experience with Unity and C#. Также имейте в виду, что предварительные требования и письменные инструкции в этом документе отражают, что проверялось и проверено на момент написания статьи (Июль 2018).Please also be aware that the prerequisites and written instructions within this document represent what has been tested and verified at the time of writing (July 2018). Вы можете использовать новейшее программное обеспечение, как указано в статье Установка средств , но не следует предполагать, что информация в этом курсе будет полностью соответствовать тому, что вы найдете в более новом программном обеспечении, чем указано ниже.You are free to use the latest software, as listed within the install the tools article, though it should not be assumed that the information in this course will perfectly match what you will find in newer software than what is listed below.

Для этого курса рекомендуется следующее оборудование и программное обеспечение:We recommend the following hardware and software for this course:

Перед началом работыBefore you start

  1. Чтобы избежать проблем при создании этого проекта, настоятельно рекомендуется создать проект, упомянутый в этом руководстве, в корневой или ближайшем к корневой папке (длинные пути к папкам могут вызвать проблемы во время сборки).To avoid encountering issues building this project, it is strongly suggested that you create the project mentioned in this tutorial in a root or near-root folder (long folder paths can cause issues at build-time).
  2. Настройка и тестирование HoloLens.Set up and test your HoloLens. Если вам нужна поддержка по настройке HoloLens, обязательно посетите статью Настройка hololens.If you need support setting up your HoloLens, make sure to visit the HoloLens setup article.
  3. Рекомендуется выполнять настройку калибровки и датчика при разработке нового приложения HoloLens (иногда это может помочь в выполнении этих задач для каждого пользователя).It is a good idea to perform Calibration and Sensor Tuning when beginning developing a new HoloLens app (sometimes it can help to perform those tasks for each user).

Чтобы получить справку по калибровке, перейдите по этой ссылке в статью калибровка HoloLens.For help on Calibration, please follow this link to the HoloLens Calibration article.

Чтобы получить справку по настройке датчика, перейдите по ссылке в статью Настройка датчика HoloLens.For help on Sensor Tuning, please follow this link to the HoloLens Sensor Tuning article.

Глава 1. Создание приложения-роботаChapter 1 – Create the Bot application

Первым шагом является создание программы Bot в качестве локального веб-приложения ASP.Net Core.The first step is to create your bot as a local ASP.Net Core Web application. После завершения и тестирования вы сможете опубликовать его на портале Azure.Once you have finished and tested it, you will publish it to the Azure Portal.

  1. Запустите Visual Studio.Open Visual Studio. Создайте новый проект, выберите в качестве типа проекта веб-приложение ASP NET Core (его можно найти в подразделе .NET Core) и вызовите его мибот.Create a new project, select ASP NET Core Web Application as the project type (you will find it under the subsection .NET Core) and call it MyBot. Нажмите кнопку ОК.Click OK.

  2. В окне, которое будет отображаться, выберите пустое.In the Window that will appear select Empty. Также убедитесь, что для целевого объекта задано значение ASP NET Core 2,0 , а для параметра Проверка подлинности — значение без проверки подлинности.Also make sure the target is set to ASP NET Core 2.0 and the Authentication is set to No Authentication. Нажмите кнопку ОК.Click OK.

    Создание приложения-робота

  3. Теперь решение откроется.The solution will now open. Щелкните правой кнопкой мыши решение мибот в Обозреватель решений и выберите пункт Управление пакетами NuGet для решения.Right-click on Solution Mybot in the Solution Explorer and click on Manage NuGet Packages for Solution.

    Создание приложения-робота

  4. На вкладке Обзор выполните поиск Microsoft. Bot. Builder. Integration. AspNet. Core (убедитесь, что установлен флажок Предварительная версия включена ).In the Browse tab, search for Microsoft.Bot.Builder.Integration.AspNet.Core (make sure you have Include pre-release checked). Выберите версию пакета 4.0.1-Preview и установите флажки в полях проекта.Select the package version 4.0.1-preview, and tick the project boxes. Затем нажмите кнопку установить.Then click on Install. Теперь вы установили библиотеки, необходимые для Bot Framework v4.You have now installed the libraries needed for the Bot Framework v4. Закройте страницу NuGet.Close the NuGet page.

    Создание приложения-робота

  5. Щелкните правой кнопкой мыши проект мибот в Обозреватель решений и выберите Добавить | класс.Right-click on your Project, MyBot, in the Solution Explorer and click on Add | Class.

    Создание приложения-робота

  6. Назовите класс мибот и нажмите кнопку Добавить.Name the class MyBot and click on Add.

    Создание приложения-робота

  7. Повторите предыдущую точку, чтобы создать другой класс с именем конверсатионконтекст.Repeat the previous point, to create another class named ConversationContext.

  8. Щелкните правой кнопкой мыши узел wwwroot в Обозреватель решений и выберите команду добавить | новый элемент.Right-click on wwwroot in the Solution Explorer and click on Add | New Item. Выберите HTML-страница (она будет находиться в подразделе веб).Select HTML Page (you will find it under the subsection Web). Присвойте файлу имя default.html.Name the file default.html. Нажмите кнопку Добавить.Click Add.

    Создание приложения-робота

  9. Список классов и объектов в Обозреватель решений должен выглядеть, как показано на рисунке ниже.The list of classes / objects in the Solution Explorer should look like the image below.

    Создание приложения-робота

  10. Дважды щелкните класс конверсатионконтекст .Double-click on the ConversationContext class. Этот класс отвечает за хранение переменных, используемых программой Bot для поддержания контекста диалога.This class is responsible for holding the variables used by the bot to maintain the context of the conversation. Эти значения контекста диалога сохраняются в экземпляре этого класса, так как любой экземпляр класса мибот будет обновляться при каждом получении действия.These conversation context values are maintained in an instance of this class, because any instance of the MyBot class will refresh each time an activity is received. Добавьте в класс следующий код:Add the following code to the class:

    namespace MyBot
    {
        public static class ConversationContext
        {
            internal static string userName;
    
            internal static string userMsg;
        }
    }
    
  11. Дважды щелкните класс мибот .Double-click on the MyBot class. Этот класс будет размещать обработчики, вызываемые любыми входящими действиями от клиента.This class will host the handlers called by any incoming activity from the customer. В этом классе будет добавлен код, используемый для создания диалога между Bot и клиентом.In this class you will add the code used to build the conversation between the bot and the customer. Как упоминалось ранее, экземпляр этого класса инициализируется каждый раз при получении действия.As mentioned earlier, an instance of this class is initialized each time an activity is received. Добавьте в этот класс следующий код:Add the following code to this class:

    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. Дважды щелкните класс Startup .Double-click on the Startup class. Этот класс инициализирует робот.This class will initialize the bot. Добавьте в класс следующий код:Add the following code to the class:

    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 и проверьте, что код в нем совпадает со следующим:Open the Program class file and verify the code in it is the same as the following:

    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. Не забудьте сохранить изменения. чтобы сделать это, выберите файл > сохранить все на панели инструментов в верхней части Visual Studio.Remember to save your changes, to do so, go to File > Save All, from the toolbar at the top of Visual Studio.

Глава 2. Создание службы Azure BotChapter 2 - Create the Azure Bot Service

Теперь, когда вы создали код для программы Bot, необходимо опубликовать его в экземпляре службы веб-приложения Bot на портале Azure.Now that you have built the code for your bot, you have to publish it to an instance of the Web App Bot Service, on the Azure Portal. В этой главе мы покажем, как создать и настроить службу Bot в Azure, а затем опубликовать в ней свой код.This Chapter will show you how to create and configure the Bot Service on Azure and then publish your code to it.

  1. Сначала войдите на портал Azure ( https://portal.azure.com) .First, log in to the Azure Portal (https://portal.azure.com).

    1. Если у вас еще нет учетной записи Azure, необходимо создать ее.If you do not already have an Azure account, you will need to create one. Если вы используете этот учебник в учебной или лабораторной ситуации, обратитесь к своему преподавателю или к одной из прокторс, чтобы получить помощь в настройке новой учетной записи.If you are following this tutorial in a classroom or lab situation, ask your instructor or one of the proctors for help setting up your new account.
  2. После входа в систему щелкните создать ресурс в левом верхнем углу, а затем выполните поиск по запросу Bot веб-приложения и нажмите клавишу Ввод.Once you are logged in, click on Create a resource in the top left corner, and search for Web App bot, and click Enter.

    Создание службы Azure Bot

  3. На новой странице будет представлено описание службы веб-приложения Bot .The new page will provide a description of the Web App Bot Service. В нижнем левом углу этой страницы нажмите кнопку создать , чтобы создать связь с этой службой.At the bottom left of this page, select the Create button, to create an association with this Service.

    Создание службы Azure Bot

  4. После нажатия кнопки создать:Once you have clicked on Create:

    1. Вставьте нужное имя для этого экземпляра службы.Insert your desired Name for this Service instance.

    2. Выберите подписку.Select a Subscription.

    3. Выберите группу ресурсов или создайте новую.Choose a Resource Group or create a new one. Группа ресурсов предоставляет способ мониторинга, контроля доступа, подготовки счетов и управления ими для коллекции ресурсов Azure.A resource group provides a way to monitor, control access, provision and manage billing for a collection of Azure assets. Рекомендуется размещать все службы Azure, связанные с одним проектом (например, такие курсы), в общей группе ресурсов.It is recommended to keep all the Azure Services associated with a single project (e.g. such as these courses) under a common resource group).

      Если вы хотите ознакомиться с дополнительными сведениями о группах ресурсов Azure, перейдите по этой ссылке.If you wish to read more about Azure Resource Groups, please follow this link

    4. Определите расположение группы ресурсов (при создании новой группы ресурсов).Determine the Location for your resource group (if you are creating a new Resource Group). В идеале это расположение будет находиться в регионе, в котором будет выполняться приложение.The location would ideally be in the region where the application would run. Некоторые ресурсы Azure доступны только в определенных регионах.Some Azure assets are only available in certain regions.

    5. Выберите ценовую категорию , подходящую для вас. Если вы впервые создаете службу веб-приложения Bot , для вас должен быть доступен бесплатный уровень (с именем F0).Select the Pricing Tier appropriate for you, if this is the first time creating a Web App Bot Service, a free tier (named F0) should be available to you

    6. Имя приложения может быть просто оставлено именем Bot.App name can just be left the same as the Bot name.

    7. Оставьте шаблон Bot Basic (C#).Leave the Bot template as Basic (C#).

    8. План службы приложений или расположение должны быть заполнены автоматически для вашей учетной записи.App service plan/Location should have been auto-filled for your account.

    9. Укажите службу хранилища Azure , которую вы хотите использовать для размещения программы-робота.Set the Azure Storage that you wish to use to host your Bot. Если у вас его еще нет, его можно создать здесь.If you dont have one already, you can create it here.

    10. Также необходимо подтвердить, что вы поняли условия, примененные к этой службе.You will also need to confirm that you have understood the Terms and Conditions applied to this Service.

    11. Щелкните Создать.Click Create.

      Создание службы Azure Bot

  5. После нажатия кнопки создать необходимо подождать, пока не будет создана служба, а это может занять некоторое время.Once you have clicked on Create, you will have to wait for the Service to be created, this might take a minute.

  6. После создания экземпляра службы на портале отобразится уведомление.A notification will appear in the Portal once the Service instance is created.

    Создание службы Azure Bot

  7. Щелкните уведомление, чтобы просмотреть новый экземпляр службы.Click on the notification to explore your new Service instance.

    Создание службы Azure Bot

  8. Нажмите кнопку " Переход к ресурсу " в уведомлении, чтобы изучить новый экземпляр службы.Click the Go to resource button in the notification to explore your new Service instance. Вы будете перенаправлены на новый экземпляр службы Azure.You will be taken to your new Azure Service instance.

    Создание службы Azure Bot

  9. На этом этапе необходимо настроить функцию прямой командной строки , которая позволит клиентскому приложению взаимодействовать с этой службой Bot.At this point you need to setup a feature called Direct Line to allow your client application to communicate with this Bot Service. Щелкните каналы, а затем в разделе Добавление избранного канала щелкните настроить прямой канал линии.Click on Channels, then in the Add a featured channel section, click on Configure Direct Line channel.

    Создание службы Azure Bot

  10. На этой странице находятся секретные ключи , которые позволяют клиентскому приложению проходить проверку подлинности с помощью программы-робота.In this page you will find the Secret keys that will allow your client app to authenticate with the bot. Нажмите кнопку Показать и получите копию одного из отображаемых ключей, так как это потребуется позже в проекте.Click on the Show button and take a copy of one of the displayed Keys, as you will need this later in your project.

    Создание службы Azure Bot

Глава 3. Публикация программы-робота в службе Azure Web App BotChapter 3 – Publish the Bot to the Azure Web App Bot Service

Теперь, когда служба готова, необходимо опубликовать созданный ранее код Bot в созданной службе веб-приложения Bot.Now that your Service is ready, you need to publish your Bot code, that you built previously, to your newly created Web App Bot Service.

Примечание

Каждый раз при внесении изменений в решение или код для программы-робота потребуется опубликовать программу Bot в службе Azure.You will have to publish your Bot to the Azure Service every time you make changes to the Bot solution / code.

  1. Вернитесь к созданному ранее решению Visual Studio.Go back to your Visual Studio Solution that you created previously.

  2. Щелкните правой кнопкой мыши проект мибот в Обозреватель решений, а затем щелкните Publish (опубликовать).Right-click on your MyBot project, in the Solution Explorer, then click on Publish.

    Публикация программы Bot в службе веб-приложения Azure Bot

  3. На странице Выбор целевого объекта публикации щелкните служба приложений, а затем выберите существующий, в последний раз щелкните создать профиль (если это не отображается, может потребоваться щелкнуть стрелку раскрывающегося списка рядом с кнопкой опубликовать .)On the Pick a publish target page, click App Service, then Select Existing, lastly click on Create Profile (you may need to click on the dropdown arrow alongside the Publish button, if this is not visible).

    Публикация программы Bot в службе веб-приложения Azure Bot

  4. Если вы еще не вошли в учетную запись Майкрософт, это можно сделать здесь.If you are not yet logged in into your Microsoft Account, you have to do it here.

  5. На странице Публикация вам нужно будет задать ту же подписку , которая использовалась для создания службы веб-приложения Bot .On the Publish page you will find you have to set the same Subscription that you used for the Web App Bot Service creation. Затем задайте представление в качестве группы ресурсов и в раскрывающейся структуре папок выберите группу ресурсов , созданную ранее.Then set the View as Resource Group and, in the drop down folder structure, select the Resource Group you have created previously. Нажмите кнопку ОК.Click OK.

    Публикация программы Bot в службе веб-приложения Azure Bot

  6. Теперь нажмите кнопку " опубликовать " и дождитесь публикации программы-робота (это может занять несколько минут).Now click on the Publish button, and wait for the Bot to be published (it might take a few minutes).

    Публикация программы Bot в службе веб-приложения Azure Bot

Глава 4 — Настройка проекта UnityChapter 4 – Set up the Unity project

Ниже приведена типичная Настройка для разработки с использованием смешанной реальности, которая является хорошим шаблоном для других проектов.The following is a typical set up for developing with mixed reality, and as such, is a good template for other projects.

  1. Откройте Unity и нажмите кнопку создать.Open Unity and click New.

    Настройка проекта Unity

  2. Теперь необходимо указать имя проекта Unity.You will now need to provide a Unity project name. Вставьте HoloLens Bot.Insert HoloLens Bot. Убедитесь, что для шаблона проекта задано значение 3D.Make sure the project template is set to 3D. Задайте для расположения нужное расположение (Помните, что ближе к корневым каталогам лучше).Set the Location to somewhere appropriate for you (remember, closer to root directories is better). Затем нажмите кнопку создать проект.Then, click Create project.

    Настройка проекта Unity

  3. При открытом Unity стоит проверить, что для редактора скриптов по умолчанию задано значение Visual Studio.With Unity open, it is worth checking the default Script Editor is set to Visual Studio. Перейдите к разделу изменение параметров > , а затем в новом окне перейдите к разделу Внешние инструменты.Go to Edit > Preferences and then from the new window, navigate to External Tools. Измените Редактор внешних скриптов на Visual Studio 2017.Change External Script Editor to Visual Studio 2017. Закройте окно настройки .Close the Preferences window.

    Настройка проекта Unity

  4. Затем перейдите в раздел файл > параметры сборки и выберите универсальная платформа Windows, а затем нажмите кнопку переключения платформы , чтобы применить выбранные элементы.Next, go to File > Build Settings and select Universal Windows Platform, then click on the Switch Platform button to apply your selection.

    Настройка проекта Unity

  5. Несмотря на то что в файле > параметры сборки , убедитесь в том, что:While still in File > Build Settings and make sure that:

    1. Целевое устройство имеет значение HoloLensTarget Device is set to HoloLens

      Для впечатляющих головных телефонов задайте для параметра целевое устройство любое устройство.For the immersive headsets, set Target Device to Any Device.

    2. Для типа сборки задано значение D3DBuild Type is set to D3D

    3. Пакет SDK установлен в значение " Последняя установка "SDK is set to Latest installed

    4. Для версии Visual Studio установлено значение " Последняя установка "Visual Studio Version is set to Latest installed

    5. Сборка и запуск настроены на локальный компьютерBuild and Run is set to Local Machine

    6. Сохраните сцену и добавьте ее в сборку.Save the scene and add it to the build.

      1. Для этого выберите Добавить открытые сцены.Do this by selecting Add Open Scenes. Появится окно сохранения.A save window will appear.

        Настройка проекта Unity

      2. Создайте новую папку для этого, а также любой будущей сцены, а затем нажмите кнопку создать папку , чтобы создать новую папку, назовите ее « сцены».Create a new folder for this, and any future, scene, then select the New folder button, to create a new folder, name it Scenes.

        Настройка проекта Unity

      3. Откройте созданную папку сцены , а затем в текстовом поле имя файла введите Ботсцене, а затем щелкните Save (сохранить).Open your newly created Scenes folder, and then in the File name: text field, type BotScene, then click on Save.

        Настройка проекта Unity

    7. Оставшиеся параметры, в параметрах сборки, должны быть оставлены по умолчанию.The remaining settings, in Build Settings, should be left as default for now.

  6. В окне параметры сборки нажмите кнопку Параметры проигрывателя , чтобы открыть связанную панель в пространстве, где находится инспектор .In the Build Settings window, click on the Player Settings button, this will open the related panel in the space where the Inspector is located.

    Настройка проекта Unity

  7. На этой панели необходимо проверить несколько параметров:In this panel, a few settings need to be verified:

    1. На вкладке другие параметры выполните следующие действия.In the Other Settings tab:

      1. Версия среды выполнения сценариев должна быть экспериментальной (.NET 4,6 эквивалент); чтобы изменить это, потребуется перезапустить редактор.Scripting Runtime Version should be Experimental (NET 4.6 Equivalent); changing this will require a restart of the Editor.

      2. Серверная часть сценариев должна быть .NETScripting Backend should be .NET

      3. Уровень совместимости API должен быть .NET 4,6API Compatibility Level should be .NET 4.6

        Настройка проекта Unity

    2. На вкладке Параметры публикации в разделе возможности установите флажок:Within the Publishing Settings tab, under Capabilities, check:

      • InternetClient;InternetClient

      • МикрофонMicrophone

        Настройка проекта Unity

    3. На более низких панели в параметрах XR (см. ниже Параметры публикации), поддерживаемая виртуальная реальность Tick, убедитесь, что добавлен пакет SDK для Windows Mixed Reality .Further down the panel, in XR Settings (found below Publish Settings), tick Virtual Reality Supported, make sure the Windows Mixed Reality SDK is added.

      Настройка проекта Unity

  8. Назад в параметрах сборки проекты C# Unity больше не заключаются; Установите флажок рядом с этим.Back in Build Settings Unity C# Projects is no longer greyed out; tick the checkbox next to this.

  9. Закройте окно Build Settings (Параметры сборки).Close the Build Settings window.

  10. Сохраните сцену и проект (файл > сохранить сцену или файл > сохранить проект).Save your scene and project (FILE > SAVE SCENE / FILE > SAVE PROJECT).

Глава 5 — Настройка камерыChapter 5 – Camera setup

Важно!

Если вы хотите пропустить компонент установки Unity, установленный в этом курсе, и продолжить работу с кодом, скачайте этот пакет Azure-MR-312-Package. пакет unitypackage, импортируйте его в проект в качестве пользовательского пакета, а затем продолжайте в главе 7.If you wish to skip the Unity Set up component of this course, and continue straight into code, feel free to download this Azure-MR-312-Package.unitypackage, import it into your project as a Custom Package, and then continue from Chapter 7.

  1. На панели Иерархия выберите основную камеру.In the Hierarchy panel, select the Main Camera.

  2. После выбора вы сможете увидеть все компоненты основной камеры на панели инспектора.Once selected, you will be able to see all the components of the Main Camera in the Inspector panel.

    1. Объект Camera должен называться основной камерой (Обратите внимание на орфографию)The Camera object must be named Main Camera (note the spelling)
    2. Для тега основной камеры необходимо задать значение маинкамера (Обратите внимание на орфографию)The Main Camera Tag must be set to MainCamera (note the spelling)
    3. Убедитесь, что для параметра Расположение преобразования задано значение 0, 0, 0 .Make sure the Transform Position is set to 0, 0, 0
    4. Установите для параметра сбросить флаги сплошной цвет.Set Clear Flags to Solid Color.
    5. Установить черный цвет фона для компонента камеры , альфа 0 (шестнадцатеричный код: #00000000)Set the Background Color of the Camera component to Black, Alpha 0 (Hex Code: #00000000)

    Настройка камеры

Глава 6 — Импорт библиотеки NewtonsoftChapter 6 – Import the Newtonsoft library

Чтобы упростить десериализацию и сериализацию объектов, полученных и отправленных службе Bot, необходимо загрузить библиотеку Newtonsoft .To help you deserialize and serialize objects received and sent to the Bot Service you need to download the Newtonsoft library. Совместимая версия уже организована с правильной структурой папок Unity.You will find a compatible version already organized with the correct Unity folder structure here.

Чтобы импортировать библиотеку Newtonsoft в проект, используйте пакет Unity, прилагаемый к этому курсу.To import the Newtonsoft library into your project, use the Unity Package which came with this course.

  1. Добавьте . пакет unitypackage в Unity с помощью команды > > меню настраиваемый пакет импорт активов.Add the .unitypackage to Unity by using the Assets > Import Package > Custom Package menu option.

    Импорт библиотеки Newtonsoft

  2. В появившемся окне Импорт пакета Unity убедитесь, что выбраны все компоненты подключаемых модулей (включая).In the Import Unity Package box that pops up, ensure everything under (and including) Plugins is selected.

    Импорт библиотеки Newtonsoft

  3. Нажмите кнопку Импорт , чтобы добавить элементы в проект.Click the Import button to add the items to your project.

  4. Перейдите в папку Newtonsoft в разделе подключаемые модули в представлении проекта и выберите подключаемый модуль Newtonsoft.Go to the Newtonsoft folder under Plugins in the project view and select the Newtonsoft plugin.

  5. Выбрав подключаемый модуль Newtonsoft, убедитесь, что не установлен флажок для любой платформы , а затем убедитесь, что всаплайер также не установлен, а затем нажмите кнопку Применить.With the Newtonsoft plugin selected, ensure that Any Platform is unchecked, then ensure that WSAPlayer is also unchecked, then click Apply. Это необходимо только для того, чтобы убедиться, что файлы настроены правильно.This is just to confirm that the files are configured correctly.

    Примечание

    Пометка этих подключаемых модулей настраивает их для использования только в редакторе Unity.Marking these plugins configures them to only be used in the Unity Editor. В папке WSA имеется другой набор, который будет использоваться после экспорта проекта из Unity.There are a different set of them in the WSA folder which will be used after the project is exported from Unity.

  6. Далее необходимо открыть папку WSA в папке NewtonsoftNext, you need to open the WSA folder, within the Newtonsoft folder. Вы увидите копию того же файла, который вы только что настроили.You will see a copy of the same file you just configured. Выберите файл, а затем в инспекторе убедитесь, чтоSelect the file, and then in the inspector, ensure that

    • Все платформы не отмеченыAny Platform is unchecked
    • проверяется только всаплайерonly WSAPlayer is checked
    • Установлен процесс неDont process is checked

Глава 7 — создание БоттагChapter 7 – Create the BotTag

  1. Создайте новый объект Tag с именем боттаг.Create a new Tag object called BotTag. Выберите основную камеру в сцене.Select the Main Camera in the scene. Щелкните раскрывающееся меню тега на панели инспектора.Click on the Tag drop down menu in the Inspector panel. Щелкните Добавить тег.Click on Add Tag.

    Настройка камеры

  2. Щелкните + символ.Click on the + symbol. Присвойте новому тегу имя боттаг, Сохраните.Name the new Tag as BotTag, Save.

    Настройка камеры

Предупреждение

Не применяйте Боттаг к основной камере.Do not apply the BotTag to the Main Camera. Если вы случайно сделали это, обязательно замените основной тег камеры обратно на маинкамера.If you have accidentally done this, make sure to change the Main Camera tag back to MainCamera.

Глава 8 — Создание класса БотобжектсChapter 8 – Create the BotObjects class

Первым скриптом, который необходимо создать, является класс ботобжектс , который представляет собой пустой класс, так что ряд других объектов класса может храниться в пределах одного скрипта и обращаться к ним из других скриптов в сцене.The first script you need to create is the BotObjects class, which is an empty class created so that a series of other class objects can be stored within the same script and accessed by other scripts in the scene.

Создание этого класса является исключительно архитектурным выбором, поэтому эти объекты можно разместить в скрипте Bot, который будет создан далее в этом курсе.The creation of this class is purely an architectural choice, these objects could instead be hosted in the Bot script that you will create later in this course.

Чтобы создать этот класс, сделайте следующее:To create this class:

  1. Щелкните правой кнопкой мыши на панели проект, а затем Создайте > папку.Right-click in the Project panel, then Create > Folder. Назовите папку Scripts.Name the folder Scripts.

    Создайте папку Scripts.

  2. Дважды щелкните папку Scripts , чтобы открыть ее.Double-click on the Scripts folder to open it. Затем в этой папке щелкните правой кнопкой мыши и выберите создать > скрипт C#.Then within that folder, right-click, and select Create > C# Script. Назовите сценарий ботобжектс.Name the script BotObjects.

  3. Дважды щелкните новый скрипт ботобжектс , чтобы открыть его в Visual Studio.Double-click on the new BotObjects script to open it with Visual Studio.

  4. Удалите содержимое скрипта и замените его следующим кодом:Delete the content of the script and replace it with the following code:

    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. Не забудьте сохранить изменения в Visual Studio перед возвратом в Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Глава 9 — Создание класса ГазеинпутChapter 9 – Create the GazeInput class

Следующий класс, который предстоит создать, — это класс газеинпут .The next class you are going to create is the GazeInput class. Этот класс отвечает за:This class is responsible for:

  • Создание курсора, который будет представлять взгляд на игрока.Creating a cursor that will represent the gaze of the player.
  • Обнаружение объектов, которые попадают на взгляд игроку, и хранение ссылок на обнаруженные объекты.Detecting objects hit by the gaze of the player, and holding a reference to detected objects.

Чтобы создать этот класс, сделайте следующее:To create this class:

  1. Перейдите к созданной ранее папке Scripts .Go to the Scripts folder you created previously.

  2. Щелкните правой кнопкой мыши внутри папки, создайте > скрипт C#.Right-click inside the folder, Create > C# Script. Вызовите скрипт газеинпут.Call the script GazeInput.

  3. Дважды щелкните новый скрипт газеинпут , чтобы открыть его в Visual Studio.Double-click on the new GazeInput script to open it with Visual Studio.

  4. Вставьте следующую строку непосредственно в начале имени класса:Insert the following line right on top of the class name:

    /// <summary>
    /// Class responsible for the User's gaze interactions
    /// </summary>
    [System.Serializable]
    public class GazeInput : MonoBehaviour
    
  5. Затем добавьте следующие переменные в класс газеинпут над методом Start () :Then add the following variables inside the GazeInput class, above the Start() method:

        [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 () .Code for Start() method should be added. Он будет вызываться при инициализации класса:This will be called when the class initializes:

        /// <summary>
        /// Start method used upon initialization.
        /// </summary>
        internal virtual void Start()
        {
            FocusedObject = null;
            Cursor = CreateCursor();
        }
    
  7. Реализуйте метод, который будет создавать и настраивать курсор взгляда:Implement a method that will instantiate and setup the gaze cursor:

        /// <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. Реализуйте методы, которые будут настраивать Райкаст из основной камеры и отслеживают текущий объект, на который осуществляется запись.Implement the methods that will setup the Raycast from the Main Camera and will keep track of the current focused object.

        /// <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. Не забудьте сохранить изменения в Visual Studio перед возвратом в Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Глава 10 — Создание класса BotChapter 10 – Create the Bot class

Скрипт, который предстоит создать, называется Bot.The script you are going to create now is called Bot. Это основной класс вашего приложения, который хранит:This is the core class of your application, it stores:

  • Учетные данные для роботов веб-приложенияYour Web App Bot credentials
  • Метод, собирающий пользовательские командыThe method that collects the user voice commands
  • Метод, необходимый для инициации диалогов с помощью робота веб-приложенияThe method necessary to initiate conversations with your Web App Bot
  • Метод, необходимый для отправки сообщений в робот веб-приложенияThe method necessary to send messages to your Web App Bot

Чтобы отправлять сообщения в службу Bot, соподпрограмма сендмессажетобот () создает действие, которое представляет собой объект, распознаваемый программой Bot в качестве данных, отправленных пользователем.To send messages to the Bot Service, the SendMessageToBot() coroutine will build an activity, which is an object recognized by the Bot Framework as data sent by the user.

Чтобы создать этот класс, сделайте следующее:To create this class:

  1. Дважды щелкните папку Scripts , чтобы открыть ее.Double-click on the Scripts folder, to open it.

  2. Щелкните правой кнопкой мыши в папке Scripts и выберите создать > скрипт C#.Right-click inside the Scripts folder, click Create > C# Script. Присвойте сценарию имя Bot.Name the script Bot.

  3. Дважды щелкните новый скрипт, чтобы открыть его в Visual Studio.Double-click on the new script to open it with Visual Studio.

  4. Обновите пространства имен, как показано ниже, в верхней части класса Bot :Update the namespaces to be the same as the following, at the top of the Bot class:

    using Newtonsoft.Json;
    using System.Collections;
    using System.Text;
    using UnityEngine;
    using UnityEngine.Networking;
    using UnityEngine.Windows.Speech;
    
  5. Внутри класса Bot добавьте следующие переменные:Inside the Bot class add the following variables:

        /// <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;
    

    Примечание

    Обязательно вставьте секретный ключ Bot в переменную ботсекрет .Make sure you insert your Bot Secret Key into the botSecret variable. В начале этого курса вы заметили секретный ключ программы-робота , в главе 2, шаг 10.You will have noted your Bot Secret Key at the beginning of this course, in Chapter 2, step 10.

  6. Необходимо добавить код для спящего режима () и запуска () .Code for Awake() and Start() now needs to be added.

        /// <summary>
        /// Called on Initialization
        /// </summary>
        void Awake()
        {
            Instance = this;
        }
    
        /// <summary>
        /// Called immediately after Awake method
        /// </summary>
        void Start()
        {
            botState = BotState.ReadyToListen;
        }
    
  7. Добавьте два обработчика, которые вызываются библиотеками распознавания речи при начале и окончании захвата голоса.Add the two handlers that are called by the speech libraries when voice capture begins and ends. Диктатионрекогнизер автоматически прекратит запись голоса пользователя, когда пользователь прекратит говорить.The DictationRecognizer will automatically stop capturing the user voice when the user stops speaking.

        /// <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. Следующий обработчик собирает результат входного голоса пользователя и вызывает соподпрограмму, ответственную за отправку сообщения в службу веб-приложения Bot.The following handler collects the result of the user voice input and calls the coroutine responsible for sending the message to the Web App Bot Service.

        /// <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. Для начала диалога с роботом вызывается следующая соподпрограмма.The following coroutine is called to begin a conversation with the Bot. Вы заметите, что после завершения вызова диалога он вызовет сендмессажетокораутине () путем передачи ряда параметров, которые задают действие, которое будет отправлено в службу Bot, в виде пустого сообщения.You will notice that once the conversation call is complete, it will call the SendMessageToCoroutine() by passing a series of parameters that will set the activity to be sent to the Bot Service as an empty message. Это делается для запроса службы Bot на инициацию диалога.This is done to prompt the Bot Service to initiate the dialogue.

        /// <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, вызывается следующая соподпрограмма.The following coroutine is called to build the activity to be sent to the 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));
            }
        }
    
  11. Для запроса ответа после отправки действия в службу Bot вызывается следующая соподпрограмма.The following coroutine is called to request a response after sending an activity to the 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;
            }
        } 
    
  12. Последний метод, который необходимо добавить в этот класс, необходим для вывода сообщения в сцене:The last method to be added to this class, is required to display the message in the scene:

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

    Примечание

    В консоли редактора Unity может появиться сообщение об ошибке, в котором отсутствует класс сценеорганисер .You may see an error within the Unity Editor Console, about missing the SceneOrganiser class. Пропустите это сообщение, так как вы создадите этот класс позже в этом руководстве.Disregard this message, as you will create this class later in the tutorial.

  13. Не забудьте сохранить изменения в Visual Studio перед возвратом в Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Глава 11 — Создание класса взаимодействийChapter 11 – Create the Interactions class

Класс, который будет создан, теперь называется взаимодействием.The class you are going to create now is called Interactions. Этот класс используется для обнаружения входных данных касания HoloLens от пользователя.This class is used to detect the HoloLens Tap Input from the user.

Если пользователь перейдет на объект Bot в сцене, и Bot готов к прослушиванию речевых входов, объект Bot изменит цвет на красный и начнет прослушивание входных данных голоса.If the user taps while looking at the Bot object in the scene, and the Bot is ready to listen for voice inputs, the Bot object will change color to red and begin listening for voice inputs.

Этот класс наследует от класса газеинпут , поэтому он может ссылаться на метод Start () и переменные из этого класса, обозначенные с помощью base.This class inherits from the GazeInput class, and so is able to reference the Start() method and variables from that class, denoted by the use of base.

Чтобы создать этот класс, сделайте следующее:To create this class:

  1. Дважды щелкните папку Scripts , чтобы открыть ее.Double-click on the Scripts folder, to open it.

  2. Щелкните правой кнопкой мыши в папке Scripts и выберите создать > скрипт C#.Right-click inside the Scripts folder, click Create > C# Script. Назовите скрипт взаимодействия.Name the script Interactions.

  3. Дважды щелкните новый скрипт, чтобы открыть его в Visual Studio.Double-click on the new script to open it with Visual Studio.

  4. Обновите пространства имен и наследование класса, как показано ниже, в верхней части класса Interactions :Update the namespaces and the class inheritance to be the same as the following, at the top of the Interactions class:

    using UnityEngine.XR.WSA.Input;
    
    public class Interactions : GazeInput
    {
    
  5. Внутри класса Interactions добавьте следующую переменную:Inside the Interactions class add the following variable:

        /// <summary>
        /// Allows input recognition with the HoloLens
        /// </summary>
        private GestureRecognizer _gestureRecognizer;
    
  6. Затем добавьте метод Start () :Then add the Start() method:

        /// <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. Добавьте обработчик, который будет срабатывать, когда пользователь выполняет жест касания перед камерой HoloLens.Add the handler that will be triggered when the user performs the tap gesture in front of the HoloLens camera

        /// <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. Не забудьте сохранить изменения в Visual Studio перед возвратом в Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Глава 12 — создание класса СценеорганисерChapter 12 – Create the SceneOrganiser class

Последний класс, необходимый в этом лабораторном занятии, называется сценеорганисер.The last class required in this Lab is called SceneOrganiser. Этот класс настраивает сцену программным способом, добавляя компоненты и скрипты в основную камеру и создавая соответствующие объекты в сцене.This class will setup the scene programmatically, by adding components and scripts to the Main Camera, and creating the appropriate objects in the scene.

Чтобы создать этот класс, сделайте следующее:To create this class:

  1. Дважды щелкните папку Scripts , чтобы открыть ее.Double-click on the Scripts folder, to open it.

  2. Щелкните правой кнопкой мыши в папке Scripts и выберите создать > скрипт C#.Right-click inside the Scripts folder, click Create > C# Script. Назовите сценарий сценеорганисер.Name the script SceneOrganiser.

  3. Дважды щелкните новый скрипт, чтобы открыть его в Visual Studio.Double-click on the new script to open it with Visual Studio.

  4. Внутри класса сценеорганисер добавьте следующие переменные:Inside the SceneOrganiser class add the following variables:

        /// <summary>
        /// Static instance of this class
        /// </summary>
        public static SceneOrganiser Instance;
    
        /// <summary>
        /// The 3D text representing the Bot response
        /// </summary>
        internal TextMesh botResponseText;
    
  5. Затем добавьте методы спящего режима () и Start () :Then add the Awake() and Start() methods:

        /// <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. Добавьте следующий метод, отвечающий за создание объекта Bot в сцене и настройку параметров и компонентов:Add the following method, responsible for creating the Bot object in the scene and setting up the parameters and components:

        /// <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. Добавьте следующий метод, отвечающий за создание объекта пользовательского интерфейса в сцене, представляющий ответы от программы-робота:Add the following method, responsible for creating the UI object in the scene, representing the responses from the Bot:

        /// <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. Не забудьте сохранить изменения в Visual Studio перед возвратом в Unity.Be sure to save your changes in Visual Studio before returning to Unity.

  9. В редакторе Unity перетащите сценарий сценеорганисер из папки Scripts на главную камеру.In the Unity Editor, drag the SceneOrganiser script from the Scripts folder to the Main Camera. Теперь компонент сцены Органисер должен отображаться на объекте основной камеры, как показано на рисунке ниже.The Scene Organiser component should now appear on the Main Camera object, as shown in the image below.

    Создание службы Azure Bot

Глава 13 – перед сборкойChapter 13 – Before building

Чтобы выполнить тщательный тест приложения, необходимо загружать неопубликованные его на HoloLens.To perform a thorough test of your application you will need to sideload it onto your HoloLens. Перед этим убедитесь в том, что:Before you do, ensure that:

  • Все параметры, упомянутые в главе 4 , заданы правильно.All the settings mentioned in the Chapter 4 are set correctly.
  • Сценеорганисер скрипта прикреплен к главному объекту Camera .The script SceneOrganiser is attached to the Main Camera object.
  • В классе Bot убедитесь, что вы вставили секретный ключ Bot в переменную ботсекрет .In the Bot class, make sure you have inserted your Bot Secret Key into the botSecret variable.

Глава 14 — сборка и загружать неопубликованные в HoloLensChapter 14 – Build and Sideload to the HoloLens

Все необходимое для раздела Unity этого проекта теперь завершено, поэтому пришло время создать его из Unity.Everything needed for the Unity section of this project has now been completed, so it is time to build it from Unity.

  1. Перейдите к разделу параметры сборки, файл > параметры сборки...Navigate to Build Settings, File > Build Settings….

  2. В окне " параметры сборки " щелкните Сборка.From the Build Settings window, click Build.

    Создание приложения из Unity

  3. Если это еще не так, то проект Tick Unity C#.If not already, tick Unity C# Projects.

  4. Щелкните Построить.Click Build. Unity запустит окно проводника , в котором необходимо создать, а затем выбрать папку для сборки приложения.Unity will launch a File Explorer window, where you need to create and then select a folder to build the app into. Создайте эту папку сейчас и назовите ее app Name.Create that folder now, and name it App. Затем выберите папку приложения и щелкните выбрать папку.Then with the App folder selected, click Select Folder.

  5. Unity начнет сборку проекта в папку приложения .Unity will begin building your project to the App folder.

  6. После того как Unity завершит сборку (может занять некоторое время), он откроет окно проводника в расположении сборки (проверьте панель задач, так как она может не всегда отображаться над окнами, но будет уведомлять о добавлении нового окна).Once Unity has finished building (it might take some time), it will open a File Explorer window at the location of your build (check your task bar, as it may not always appear above your windows, but will notify you of the addition of a new window).

Глава 15 — развертывание в HoloLensChapter 15 – Deploy to HoloLens

Для развертывания на HoloLens выполните следующие действия.To deploy on HoloLens:

  1. Вам потребуется IP-адрес HoloLens (для удаленного развертывания) и убедитесь, что HoloLens находится в режиме разработчика.You will need the IP Address of your HoloLens (for Remote Deploy), and to ensure your HoloLens is in Developer Mode. Выполните указанные ниже действия.To do this:

    1. Людьми HoloLens, откройте Параметры.Whilst wearing your HoloLens, open the Settings.
    2. Последовательно выберите сетевые & интернет > Wi-Fi > дополнительные параметры .Go to Network & Internet > Wi-Fi > Advanced Options
    3. Запишите IPv4 -адрес.Note the IPv4 address.
    4. Затем вернитесь к параметрам и обновите & > безопасности для разработчиков .Next, navigate back to Settings, and then to Update & Security > For Developers
    5. Задайте режим разработчика на.Set Developer Mode On.
  2. Перейдите к новой сборке Unity (папка приложения ) и откройте файл решения в Visual Studio.Navigate to your new Unity build (the App folder) and open the solution file with Visual Studio.

  3. В конфигурации решения выберите Отладка.In the Solution Configuration select Debug.

  4. На платформе решения выберите x86, Удаленный компьютер.In the Solution Platform, select x86, Remote Machine.

    Разверните решение из Visual Studio.

  5. Перейдите в меню "сборка " и щелкните " Развернуть решение", чтобы загружать неопубликованные приложение в HoloLens.Go to the Build menu and click on Deploy Solution, to sideload the application to your HoloLens.

  6. Теперь приложение должно отобразиться в списке установленных приложений в HoloLens, готовом к запуску.Your app should now appear in the list of installed apps on your HoloLens, ready to be launched!

    Примечание

    Чтобы выполнить развертывание в иммерсивное виртуальную гарнитуру, задайте для платформы решения значение локальный компьютер и задайте для параметра Конфигурация значение Отладка( x86 в качестве платформы).To deploy to immersive headset, set the Solution Platform to Local Machine, and set the Configuration to Debug, with x86 as the Platform. Затем выполните развертывание на локальном компьютере с помощью меню "сборка" и выберите пункт " Развернуть решение".Then deploy to the local machine, using the Build menu, selecting Deploy Solution.

Глава 16 — использование приложения в HoloLensChapter 16 – Using the application on the HoloLens

  • После запуска приложения вы увидите робота в качестве синей сферы перед вами.Once you have launched the application, you will see the Bot as a blue sphere in front of you.

  • Используйте жест касания , когда вы облакамие в сфере, чтобы начать беседу.Use the Tap Gesture while you are gazing at the sphere to initiate a conversation.

  • Ожидание запуска диалога (в пользовательском интерфейсе будет отображаться сообщение, когда оно произойдет).Wait for the conversation to start (The UI will display a message when it happens). Получив вводное сообщение от программы-робота, снова коснитесь программы-робота, чтобы он превратится в красный, и начнется прослушивание голоса.Once you receive the introductory message from the Bot, tap again on the Bot so it will turn red and begin to listen to your voice.

  • После того как вы перестанете разговор, ваше приложение отправит сообщение в Bot, и Вы незамедлительно получите ответ, который будет отображаться в пользовательском интерфейсе.Once you stop talking, your application will send your message to the Bot and you will promptly receive a response that will be displayed in the UI.

  • Повторите эту процедуру, чтобы отправить больше сообщений в программу-робот (нужно коснуться каждый раз, когда нужно нда сообщение).Repeat the process to send more messages to your Bot (you have to tap each time you want to sen a message).

В этом диалоговом окне показано, как Bot может хранить информацию (ваше имя), а также предоставлять известную информацию (например, товары, которые хранятся в запасах).This conversation demonstrates how the Bot can retain information (your name), whilst also providing known information (such as the items that are stocked).

Вот некоторые вопросы, которые необходимо задать для программы-робота:Some questions to ask the Bot:

what do you sell? 

how much are umbrellas?

how much are raincoats?

Готовое приложение Bot веб-приложения (v4)Your finished Web App Bot (v4) application

Поздравляем! вы создали приложение смешанной реальности, которое использует робот веб-приложения Azure, Microsoft Bot Framework v4.Congratulations, you built a mixed reality app that leverages the Azure Web App Bot, Microsoft Bot Framework v4.

Окончательный продукт

Дополнительные упражненияBonus exercises

Упражнение 1Exercise 1

Структура диалога в этом лабораторном занятии является очень простой.The conversation structure in this Lab is very basic. Используйте Microsoft LUIS, чтобы дать вашему естественному языку возможность понимания возможностей.Use Microsoft LUIS to give your bot natural language understanding capabilities.

Упражнение 2Exercise 2

Этот пример не включает в себя завершение диалога и перезапуск нового.This example does not include terminating a conversation and restarting a new one. Чтобы сделать компонент Bot завершенным, попробуйте реализовать замыкание диалога.To make the Bot feature complete, try to implement closure to the conversation.