HoloLens (1-го поколения) и Azure 312: интеграция с ботами

Примечание

Руководства Mixed Reality Academy были разработаны для иммерсивных гарнитур HoloLens (1-го поколения) и иммерсивных гарнитур Mixed Reality. Поэтому мы считаем, что важно оставить эти руководства для разработчиков, которые ищут рекомендации по разработке для этих устройств. Данные руководства не будут обновляться с учетом последних наборов инструментов или возможностей взаимодействия для HoloLens 2. Они будут сохранены для работы на поддерживаемых устройствах. В будущем будет опубликована новая серия учебников, демонстрирующих разработку для HoloLens 2. В этом уведомлении будет добавлена ссылка на эти руководства при их публикации.

В этом курсе вы узнаете, как создать и развернуть бота с помощью Microsoft Bot Framework версии 4 и взаимодействовать с ним через приложение Windows Mixed Reality.

Снимок экрана, на котором показано взаимодействие через приложение Windows Mixed Reality.

Microsoft Bot Framework версии 4 — это набор API, предназначенных для предоставления разработчикам средств для создания расширяемого и масштабируемого приложения бота. Дополнительные сведения см. на странице Microsoft Bot Framework или в репозитории Git версии 4.

После прохождения этого курса вы создайте приложение Windows Mixed Reality, которое сможет выполнять следующие действия:

  1. Используйте жест касания , чтобы запустить бот, прослушивающий голос пользователей.
  2. Когда пользователь что-то сказал, бот попытается предоставить ответ.
  3. Отображение ответа ботов в виде текста, расположенного рядом с ботом, в сцене Unity.

В приложении вы определяете, как вы будете интегрировать результаты в проект. Этот курс предназначен для обучения интеграции службы Azure с проектом Unity. Ваша задача — использовать знания, полученные из этого курса, для улучшения приложения смешанной реальности.

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

Курс HoloLens Иммерсивные гарнитуры
312. Смешанная реальность и Azure: интеграция ботов ✔️ ✔️

Примечание

Хотя в этом курсе основное внимание уделяется HoloLens, вы также можете применить полученные в этом курсе сведения для Windows Mixed Reality иммерсивных гарнитур (VR). Так как иммерсивные гарнитуры (VR) не имеют доступных камер, вам потребуется внешняя камера, подключенная к компьютеру. По мере прохождения курса вы увидите заметки о любых изменениях, которые могут потребоваться для поддержки иммерсивных гарнитур (VR).

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

Примечание

Это руководство предназначено для разработчиков, имеющих базовый опыт работы с Unity и C#. Кроме того, имейте в виду, что предварительные требования и письменные инструкции в этом документе представляют то, что было протестировано и проверено на момент написания статьи (июль 2018 г.). Вы можете использовать последнюю версию программного обеспечения, как указано в статье установка инструментов , хотя не следует предполагать, что информация в этом курсе будет идеально соответствовать тому, что вы найдете в более новом программном обеспечении, чем указано ниже.

Для этого курса мы рекомендуем использовать следующее оборудование и программное обеспечение:

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

  1. Чтобы избежать проблем со сборкой этого проекта, настоятельно рекомендуется создать проект, упомянутый в этом руководстве, в корневой или почти корневой папке (длинные пути к папкам могут вызвать проблемы во время сборки).
  2. Настройте и протестируйте HoloLens. Если вам нужна поддержка по настройке HoloLens, обязательно ознакомьтесь со статьей о настройке HoloLens.
  3. Рекомендуется выполнять калибровку и настройку датчиков при разработке нового приложения HoloLens (иногда это может помочь выполнить эти задачи для каждого пользователя).

Для получения справки по калибровке перейдите по этой ссылке на статью Калибровка HoloLens.

Чтобы получить справку по настройке датчика, перейдите по этой ссылке на статью Настройка датчика HoloLens.

Глава 1. Создание приложения бота

Первым шагом является создание бота в качестве локального веб-приложения ASP.Net Core. После завершения и тестирования вы опубликуете его на портале Azure.

  1. Запустите Visual Studio. Создайте проект, выберите веб-приложение ASP NET Core в качестве типа проекта (его можно найти в подразделе .NET Core) и назовите его MyBot. Нажмите кнопку ОК.

  2. В появившемся окне выберите Пустой. Кроме того, убедитесь, что для целевого объекта задано значение ASP NET Core 2.0 , а для параметра Проверка подлинности — значение Без проверки подлинности. Нажмите кнопку ОК.

    Снимок экрана: окно New A S P dot N E T Core Web Application (Новое веб-приложение N E T Core).

  3. Решение откроется. Щелкните правой кнопкой мыши Solution Mybot в Обозреватель решений и выберите Управление пакетами NuGet для решения.

    Снимок экрана: открытое решение с выделенными

  4. На вкладке Обзор найдите Microsoft.Bot.Builder.Integration.AspNet.Core (убедитесь, что установлен флажок Включить предварительные выпуски ). Выберите пакет версии 4.0.1-preview и установите флажки проекта. Затем щелкните Установить. Вы установили библиотеки, необходимые для Bot Framework версии 4. Закройте страницу NuGet.

    Снимок экрана: диспетчер решений Nu-Get.

  5. Щелкните правой кнопкой мыши проектMyBot в Обозреватель решений и выберите Добавить|класс.

    Снимок экрана: процесс добавления нового класса в MyBot.

  6. Назовите класс MyBot и щелкните Добавить.

    Снимок экрана: создание нового класса MyBot.

  7. Повторите предыдущий пункт, чтобы создать другой класс с именем ConversationContext.

  8. Щелкните правой кнопкой мыши wwwroot в Обозреватель решений и выберите команду Добавить|новый элемент. Выберите HTML-страница (она будет находиться в подразделе Интернет). Назовите файл default.html. Нажмите кнопку Добавить.

    Снимок экрана: создание новой страницы H T M L в окне Обозреватель решений.

  9. Список классов и объектов в Обозреватель решений должен выглядеть так, как показано на рисунке ниже.

    Снимок экрана: окно Обозреватель решений со списком классов.

  10. Дважды щелкните класс ConversationContext . Этот класс отвечает за хранение переменных, используемых ботом для поддержания контекста диалога. Эти значения контекста диалога сохраняются в экземпляре этого класса, так как любой экземпляр класса MyBot будет обновляться при каждом получении действия. Добавьте следующий код в класс :

    namespace MyBot
    {
        public static class ConversationContext
        {
            internal static string userName;
    
            internal static string userMsg;
        }
    }
    
  11. Дважды щелкните класс MyBot . Этот класс будет размещать обработчики, вызываемые любым входящим действием от клиента. В этом классе вы добавите код, используемый для построения диалога между ботом и клиентом. Как упоминалось ранее, экземпляр этого класса инициализируется при каждом получении действия. Добавьте следующий код в этот класс:

    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 . Этот класс инициализирует бота. Добавьте следующий код в класс :

    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 и убедитесь, что код в нем совпадает с приведенным ниже.

    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.

Глава 2. Создание Служба Bot Azure

Теперь, когда вы создали код для бота, необходимо опубликовать его в экземпляре службы веб-приложений Bot на портале Azure. В этой главе показано, как создать и настроить Служба Bot в Azure, а затем опубликовать в нем свой код.

  1. Сначала войдите на портал Azure (https://portal.azure.com).

    1. Если у вас еще нет учетной записи Azure, ее необходимо создать. Если вы выполняете это руководство в учебной или лабораторной ситуации, обратитесь к преподавателю или одному из прокторов за помощью в настройке новой учетной записи.
  2. Выполнив вход, щелкните Создать ресурс в левом верхнем углу, выполните поиск бота веб-приложения и нажмите клавишу ВВОД.

    Снимок экрана: панель мониторинга Microsoft Azure с выделенным элементом

  3. На новой странице будет представлено описание службы бота веб-приложений . В левом нижнем углу этой страницы нажмите кнопку Создать , чтобы создать связь с этой службой.

    Снимок экрана: страница

  4. После нажатия кнопки Создать:

    1. Вставьте нужное имя для этого экземпляра службы.

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

    3. Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, управления доступом, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется хранить все службы Azure, связанные с одним проектом (например, этими курсами), в общей группе ресурсов.

      Если вы хотите узнать больше о группах ресурсов Azure, перейдите по этой ссылке.

    4. Определите расположение группы ресурсов (если вы создаете новую группу ресурсов). Расположение в идеале должно находиться в регионе, где будет выполняться приложение. Некоторые ресурсы Azure доступны только в определенных регионах.

    5. Выберите подходящую ценовую категорию . Если вы создаете службу бота веб-приложений впервые, вам должна быть доступна бесплатная категория (F0).

    6. Имя приложения можно просто оставить так же, как имя бота.

    7. Оставьте шаблон ботабазовым (C#).

    8. План или расположение службы приложений должны быть автоматически заполнены для вашей учетной записи.

    9. Задайте службу хранилища Azure , которую вы хотите использовать для размещения бота. Если у вас его еще нет, его можно создать здесь.

    10. Вам также потребуется подтвердить, что вы поняли условия, применяемые к этой Службе.

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

      Снимок экрана: обязательные поля, необходимые для создания службы.

  5. После нажатия кнопки Создать вам придется подождать, пока служба будет создана. Это может занять минуту.

  6. После создания экземпляра службы на портале появится уведомление.

    Снимок экрана: значок уведомления, выделенный после создания экземпляра службы.

  7. Щелкните уведомление, чтобы просмотреть новый экземпляр службы.

    Снимок экрана: развертывание выполнено успешно и кнопка

  8. Нажмите кнопку Перейти к ресурсу в уведомлении, чтобы просмотреть новый экземпляр службы. Вы перейдете к новому экземпляру службы Azure.

    Снимок экрана: окна ресурсов после нажатия кнопки

  9. На этом этапе необходимо настроить функцию с именем Direct Line, чтобы разрешить клиентскому приложению взаимодействовать с этим Служба Bot. Щелкните Каналы, а затем в разделе Добавление рекомендуемого канала щелкните Настроить канал Direct Line.

    Снимок экрана: канал

  10. На этой странице вы найдете секретные ключи , которые позволят клиентскому приложению проходить проверку подлинности с помощью бота. Нажмите кнопку Показать и сделайте копию одного из отображаемых ключей, так как они понадобятся вам позже в проекте.

    Снимок экрана: секретные ключи, выделенные в myHoloLensBot Configure Direct Line channel.

Глава 3. Публикация бота в веб-приложении Azure Служба Bot

Теперь, когда служба готова, необходимо опубликовать созданный ранее код бота в только что созданном веб-приложении Служба Bot.

Примечание

Вам придется публиковать бот в службе Azure каждый раз, когда вы вносите изменения в решение или код Бота.

  1. Назад в созданное ранее решение Visual Studio.

  2. Щелкните правой кнопкой мыши проект MyBot в Обозреватель решений, а затем выберите Опубликовать.

    Снимок экрана: раскрывающееся меню проекта MyBot после щелчка правой кнопкой мыши.

  3. На странице Выбор целевого объекта публикации щелкните Служба приложений, а затем Выберите существующий, наконец, щелкните Создать профиль (возможно, потребуется щелкнуть стрелку раскрывающегося списка рядом с кнопкой Опубликовать, если она не отображается).

    Снимок экрана: страница

  4. Если вы еще не вошли в свою учетную запись Майкрософт, это необходимо сделать здесь.

  5. На странице Публикация вы увидите, что необходимо задать ту же подписку , которая использовалась для создания службы ботов веб-приложений . Затем задайте для представлениязначение Группа ресурсов и в раскрывающемся списке структуры папок выберите созданную ранее группу ресурсов . Нажмите кнопку ОК.

    Снимок экрана: окно Служба приложений с выбранной подпиской, используемой для создания веб-приложения Служба Bot.

  6. Теперь нажмите кнопку Опубликовать и дождитесь публикации бота (это может занять несколько минут).

    Снимок экрана: окно

Глава 4. Настройка проекта Unity

Ниже приведена типичная настройка для разработки со смешанной реальностью и, следовательно, хороший шаблон для других проектов.

  1. Откройте Unity и нажмите кнопку Создать.

    Снимок экрана: окно

  2. Теперь необходимо указать имя проекта Unity. Вставьте бот HoloLens. Убедитесь, что для шаблона проекта задано значение 3D. Задайте для параметра Расположение подходящее место (помните, что лучше ближе к корневым каталогам). Затем щелкните Создать проект.

    Снимок экрана: выделено новое поле имени проекта Unity.

  3. При открытии Unity стоит проверить, что для редактора скриптов по умолчанию задано значение Visual Studio. Перейдите в раздел Изменение > параметров , а затем в новом окне перейдите к разделу Внешние инструменты. Измените внешний редактор скриптов на Visual Studio 2017. Закройте окно Параметры .

    Снимок экрана: окно параметров Unity с необходимыми параметрами.

  4. Затем перейдите в раздел Параметры сборки файлов > и выберите универсальная платформа Windows, а затем нажмите кнопку Переключить платформу, чтобы применить выбранный вариант.

    Снимок экрана: окно параметров сборки с выделенной кнопкой

  5. Оставаясь в параметрах сборки файлов > и убедитесь, что:

    1. Для целевого устройствазадано значение HoloLens

      Для иммерсивных гарнитур установите для параметра Целевое устройствозначение Любое устройство.

    2. Для параметра Тип сборки задано значение D3D.

    3. Для пакета SDK задано значение Последняя установленная версия.

    4. Версия Visual Studio имеет значение Последняя установленная

    5. Для сборки и запуска задано значение Локальный компьютер.

    6. Сохраните сцену и добавьте ее в сборку.

      1. Для этого выберите Добавить открытые сцены. Откроется окно сохранения.

        Снимок экрана: окно параметров сборки с выделенной кнопкой

      2. Создайте новую папку для этой и любой будущей сцены, а затем нажмите кнопку Создать папку , чтобы создать новую папку и назовите ее Сцены.

        Снимок экрана: создание новой папки Scenes.

      3. Откройте только что созданную папку Scenes , а затем в текстовом поле Имя файла: введите BotScene и нажмите кнопку Сохранить.

        Снимок экрана: папка Scenes и новый файл, который сохраняется.

    7. Остальные параметры в разделе Параметры сборки пока следует оставить по умолчанию.

  6. В окне Параметры сборки нажмите кнопку Параметры проигрывателя . Откроется соответствующая панель в пространстве, где находится инспектор .

    Снимок экрана: окно

  7. На этой панели необходимо проверить несколько параметров:

    1. На вкладке Другие параметры :

      1. Версия среды выполнения скриптов должна быть экспериментальной (эквивалент NET 4.6); Для этого потребуется перезапустить редактор.

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

      3. Уровень совместимости API должен быть .NET 4.6

        Снимок экрана: вкладка

    2. На вкладке Параметры публикации в разделе Возможности проверка:

      • InternetClient;

      • Микрофон

        Снимок экрана: InternetClient и Микрофон, включенные на вкладке Параметры публикации.

    3. Далее вниз по панели в разделе Параметры XR (см. раздел Параметры публикации) установите флажок Виртуальная реальность Поддерживается, убедитесь, что пакет SDK для Windows Mixed Reality добавлен.

      Снимок экрана: включена поддержка виртуальной реальности и добавлена Windows Mixed Reality SDK.

  8. Вернувшись в параметры сборки, проекты Unity C# больше не выделены серым цветом; Установите флажок рядом с этим.

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

  10. Сохраните сцену и проект (ФАЙЛ > СОХРАНИТЬ СЦЕНУ или ФАЙЛ > СОХРАНИТЬ ПРОЕКТ).

Глава 5. Настройка камеры

Важно!

Если вы хотите пропустить компонент Unity Set up этого курса и перейти непосредственно к коду, скачайте этот пакет Azure-MR-312-Package.unitypackage, импортируйте его в проект в виде пользовательского пакета, а затем перейдите к главе 7.

  1. На панели Иерархия выберите Основная камера.

  2. После выбора вы увидите все компоненты основной камеры на панели Инспектор.

    1. Объект Camera должен называться Main Camera (обратите внимание на орфографию)
    2. Для тега основной камеры должно быть задано значение MainCamera (обратите внимание на орфографию).
    3. Убедитесь, что для позиции преобразования задано значение 0, 0, 0.
    4. Для параметра Очистить флаги установите значение Сплошной цвет.
    5. Задайте для параметра Цвет фона компонента "Камера " значение Черный, Альфа 0 (шестнадцатеричный код: #00000000)

    Снимок экрана, на котором показаны все компоненты основной камеры на панели Инспектор.

Глава 6. Импорт библиотеки Newtonsoft

Чтобы упростить десериализацию и сериализацию объектов, полученных и отправленных в Служба Bot, необходимо скачать библиотеку Newtonsoft. Здесь вы найдете совместимую версию с правильной структурой папок Unity.

Чтобы импортировать библиотеку Newtonsoft в проект, используйте пакет Unity, который поставляется с этим курсом.

  1. Добавьте .unitypackage в Unity с помощью пункта менюПользовательский пакетимпорта ресурсов>>.

    Снимок экрана: раскрывающееся меню

  2. Во всплывающем окне Импорт пакета Unity убедитесь, что выбраны все компоненты в разделе (и в том числе) Подключаемые модули .

    Снимок экрана: всплывающее окно

  3. Нажмите кнопку Импорт , чтобы добавить элементы в проект.

  4. Перейдите в папку Newtonsoft в разделе Подключаемые модули в представлении проекта и выберите подключаемый модуль Newtonsoft.

    Снимок экрана: папка Newtonsoft в представлении проекта.

  5. Выбрав подключаемый модуль Newtonsoft, снимите флажокЛюбая платформа, а затем снимите флажокWSAPlayer, а затем нажмите кнопку Применить. Это необходимо только для того, чтобы убедиться, что файлы настроены правильно.

    Снимок экрана, на котором показаны правильные параметры для подключаемого модуля Newtonsoft.

    Примечание

    Маркировка этих подключаемых модулей позволяет настроить их для использования только в редакторе Unity. В папке WSA есть другой набор из них, который будет использоваться после экспорта проекта из Unity.

  6. Затем необходимо открыть папку WSA в папке Newtonsoft . Вы увидите копию того же файла, который вы только что настроили. Выберите файл, а затем в инспекторе убедитесь, что

    • Флажок "Любая платформа " снят
    • Установлен флажоктолькоWSAPlayer
    • Проверка не выполняется

    Снимок экрана: правильный выбор подключаемого модуля Newtonsoft в папке WSA.

Глава 7. Создание BotTag

  1. Создайте новый объект Tag с именем BotTag. Выберите основную камеру в сцене. Щелкните раскрывающееся меню Тег на панели Инспектор. Щелкните Добавить тег.

    Снимок экрана: раскрывающееся меню

  2. + Щелкните символ. Присвойте новому тегу имя BotTag, сохранить.

    Снимок экрана: панель

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

Не применяйтеBotTag к основной камере. Если вы случайно сделали это, обязательно измените тег Main Camera обратно на MainCamera.

Глава 8. Создание класса BotObjects

Первым скриптом, который необходимо создать, является класс BotObjects , который является пустым классом, созданным таким образом, чтобы ряд других объектов класса можно было хранить в том же скрипте и получать доступ к другим скриптам в сцене.

Создание этого класса является исключительно архитектурным выбором. Вместо этого эти объекты могут размещаться в скрипте бота, который вы создадите позже в этом курсе.

Чтобы создать этот класс, выполните указанные ниже действия.

  1. Щелкните правой кнопкой мыши на панели Проект и выберите Создать > папку. Назовите папку Scripts.

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

  2. Дважды щелкните папку Скрипты, чтобы открыть ее. Затем в этой папке щелкните правой кнопкой мыши и выберите Создать > скрипт C#. Присвойте скрипту имя BotObjects.

  3. Дважды щелкните новый скрипт BotObjects , чтобы открыть его в Visual Studio.

  4. Удалите содержимое скрипта и замените его следующим кодом:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class BotObjects : MonoBehaviour{}
    
    /// <summary>
    /// Object received when first opening a conversation
    /// </summary>
    [Serializable]
    public class ConversationObject
    {
        public string ConversationId;
        public string token;
        public string expires_in;
        public string streamUrl;
        public string referenceGrammarId;
    }
    
    /// <summary>
    /// Object including all Activities
    /// </summary>
    [Serializable]
    public class ActivitiesRootObject
    {
        public List<Activity> activities { get; set; }
        public string watermark { get; set; }
    }
    [Serializable]
    public class Conversation
    {
        public string id { get; set; }
    }
    [Serializable]
    public class From
    {
        public string id { get; set; }
        public string name { get; set; }
    }
    [Serializable]
    public class Activity
    {
        public string type { get; set; }
        public string channelId { get; set; }
        public Conversation conversation { get; set; }
        public string id { get; set; }
        public From from { get; set; }
        public string text { get; set; }
        public string textFormat { get; set; }
        public DateTime timestamp { get; set; }
        public string serviceUrl { get; set; }
    }
    
  5. Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.

Глава 9. Создание класса GazeInput

Следующий класс, который вы собираетесь создать, — это класс GazeInput . Этот класс отвечает за:

  • Создание курсора, который будет представлять взгляд игрока.
  • Обнаружение объектов, попадающих под взгляд игрока, и удержание ссылки на обнаруженные объекты.

Чтобы создать этот класс, выполните указанные ниже действия.

  1. Перейдите в папку Скрипты, созданную ранее.

  2. Щелкните правой кнопкой мыши в папке Create C# Script (Создать > скрипт C#). Вызовите скрипт GazeInput.

  3. Дважды щелкните новый скрипт GazeInput , чтобы открыть его с помощью Visual Studio.

  4. Вставьте следующую строку прямо поверх имени класса:

    /// <summary>
    /// Class responsible for the User's gaze interactions
    /// </summary>
    [System.Serializable]
    public class GazeInput : MonoBehaviour
    
  5. Затем добавьте следующие переменные в класс GazeInput над методом 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;
    
  6. Необходимо добавить код для метода Start( ). Он будет вызываться при инициализации класса:

        /// <summary>
        /// Start method used upon initialization.
        /// </summary>
        internal virtual void Start()
        {
            FocusedObject = null;
            Cursor = CreateCursor();
        }
    
  7. Реализуйте метод, который создаст экземпляр и настроит курсор взгляда:

        /// <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. Реализуйте методы, которые будут настраивать Raycast с основной камеры и отслеживать текущий объект.

        /// <summary>
        /// Called every frame
        /// </summary>
        internal virtual void Update()
        {
            _gazeOrigin = Camera.main.transform.position;
    
            _gazeDirection = Camera.main.transform.forward;
    
            UpdateRaycast();
        }
    
    
        /// <summary>
        /// Reset the old focused object, stop the gaze timer, and send data if it
        /// is greater than one.
        /// </summary>
        private void ResetFocusedObject()
        {
            // Ensure the old focused object is not null.
            if (_oldFocusedObject != null)
            {
                if (_oldFocusedObject.CompareTag(InteractibleTag))
                {
                    // Provide the OnGazeExited event.
                    _oldFocusedObject.SendMessage("OnGazeExited", 
                        SendMessageOptions.DontRequireReceiver);
                }
            }
        }
    
    
        private void UpdateRaycast()
        {
            // Set the old focused gameobject.
            _oldFocusedObject = FocusedObject;
            RaycastHit hitInfo;
    
            // Initialize Raycasting.
            Hit = Physics.Raycast(_gazeOrigin,
                _gazeDirection,
                out hitInfo,
                GazeMaxDistance);
            HitInfo = hitInfo;
    
            // Check whether raycast has hit.
            if (Hit == true)
            {
                Position = hitInfo.point;
                Normal = hitInfo.normal;
    
                // Check whether the hit has a collider.
                if (hitInfo.collider != null)
                {
                    // Set the focused object with what the user just looked at.
                    FocusedObject = hitInfo.collider.gameObject;
                }
                else
                {
                    // Object looked on is not valid, set focused gameobject to null.
                    FocusedObject = null;
                }
            }
            else
            {
                // No object looked upon, set focused gameobject to null.
                FocusedObject = null;
    
                // Provide default position for cursor.
                Position = _gazeOrigin + (_gazeDirection * GazeMaxDistance);
    
                // Provide a default normal.
                Normal = _gazeDirection;
            }
    
            // Lerp the cursor to the given position, which helps to stabilize the gaze.
            Cursor.transform.position = Vector3.Lerp(Cursor.transform.position, Position, 0.6f);
    
            // Check whether the previous focused object is this same. If so, reset the focused object.
            if (FocusedObject != _oldFocusedObject)
            {
                ResetFocusedObject();
                if (FocusedObject != null)
                {
                    if (FocusedObject.CompareTag(InteractibleTag))
                    {
                        // Provide the OnGazeEntered event.
                        FocusedObject.SendMessage("OnGazeEntered",
                            SendMessageOptions.DontRequireReceiver);
                    }
                }
            }
        }
    
  9. Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.

Глава 10. Создание класса Bot

Скрипт, который вы собираетесь создать сейчас, называется Бот. Это основной класс приложения, в котором хранятся:

  • Учетные данные бота веб-приложения
  • Метод, который собирает голосовые команды пользователя
  • Метод, необходимый для запуска бесед с ботом веб-приложения
  • Метод, необходимый для отправки сообщений боту веб-приложения

Для отправки сообщений в Служба Bot сопрограмма SendMessageToBot() создаст действие, которое является объектом, распознаваемым Bot Framework как данные, отправленные пользователем.

Чтобы создать этот класс, выполните указанные ниже действия.

  1. Дважды щелкните папку Скрипты , чтобы открыть ее.

  2. Щелкните правой кнопкой мыши в папке Скрипты и выберите Создать > скрипт C#. Назовите скрипт Bot.

  3. Дважды щелкните новый скрипт, чтобы открыть его в Visual Studio.

  4. Обновите пространства имен, чтобы они совпадали со следующими значениями в верхней части класса Bot :

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

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

    Примечание

    Вставьте секретный ключ бота в переменную botSecret . Вы заметите секретный ключ бота в начале этого курса в главе 2, шаг 10.

  6. Теперь необходимо добавить код для Awake() и Start().

        /// <summary>
        /// Called on Initialization
        /// </summary>
        void Awake()
        {
            Instance = this;
        }
    
        /// <summary>
        /// Called immediately after Awake method
        /// </summary>
        void Start()
        {
            botState = BotState.ReadyToListen;
        }
    
  7. Добавьте два обработчика, которые вызываются библиотеками речи, когда начинается и заканчивается запись голоса. ДиктовкаRecognizer автоматически прекратит запись голоса пользователя, когда пользователь перестанет говорить.

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

        /// <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. Чтобы начать беседу с ботом, вызывается следующая сопрограмма. Вы заметите, что после завершения вызова беседы он вызовет SendMessageToCoroutine(), передав ряд параметров, которые задают действие для отправки Служба Bot в качестве пустого сообщения. Это делается, чтобы предложить Служба Bot начать диалог.

        /// <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, вызывается следующая сопрограмма.

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

        /// <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. Последний метод, добавляемый в этот класс, необходим для отображения сообщения в сцене:

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

    Примечание

    В консоли редактора Unity может появись сообщение об отсутствии класса SceneOrganiser . Игнорируйте это сообщение, так как вы создадите этот класс далее в этом руководстве.

  13. Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.

Глава 11. Создание класса Interactions

Класс, который вы собираетесь создать сейчас, называется Interactions. Этот класс используется для обнаружения входных данных holoLens tap от пользователя.

Если пользователь касается объекта Bot в сцене, а бот готов прослушивать голосовые данные, объект Bot изменит цвет на красный и начнет прослушивать голосовые данные.

Этот класс наследуется от класса GazeInput и поэтому может ссылаться на метод Start() и переменные из этого класса, обозначаемые использованием base.

Чтобы создать этот класс, выполните указанные ниже действия.

  1. Дважды щелкните папку Скрипты , чтобы открыть ее.

  2. Щелкните правой кнопкой мыши в папке Скрипты и выберите Создать > скрипт C#. Присвойте скрипту имя Interactions.

  3. Дважды щелкните новый скрипт, чтобы открыть его в Visual Studio.

  4. Обновите пространства имен и наследование классов, чтобы они совпадали со следующими значениями в верхней части класса Interactions :

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

        /// <summary>
        /// Allows input recognition with the HoloLens
        /// </summary>
        private GestureRecognizer _gestureRecognizer;
    
  6. Затем добавьте метод 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();
        }
    
  7. Добавьте обработчик, который будет активироваться при выполнении пользователем жеста касания перед камерой 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());
                    }                                  
                }
            }
        }
    
  8. Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.

Глава 12. Создание класса SceneOrganiser

Последний требуемый класс в этой лаборатории называется SceneOrganiser. Этот класс настроит сцену программным способом, добавив компоненты и скрипты в основную камеру и создав соответствующие объекты в сцене.

Чтобы создать этот класс, выполните указанные ниже действия.

  1. Дважды щелкните папку Скрипты , чтобы открыть ее.

  2. Щелкните правой кнопкой мыши в папке Скрипты и выберите Создать > скрипт C#. Присвойте скрипту имя SceneOrganiser.

  3. Дважды щелкните новый скрипт, чтобы открыть его в Visual Studio.

  4. Внутри класса SceneOrganiser добавьте следующие переменные:

        /// <summary>
        /// Static instance of this class
        /// </summary>
        public static SceneOrganiser Instance;
    
        /// <summary>
        /// The 3D text representing the Bot response
        /// </summary>
        internal TextMesh botResponseText;
    
  5. Затем добавьте методы Awake() и 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();
        }
    
  6. Добавьте следующий метод, отвечающий за создание объекта Bot в сцене и настройку параметров и компонентов:

        /// <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. Добавьте следующий метод, отвечающий за создание объекта пользовательского интерфейса в сцене, представляющего ответы бота:

        /// <summary>
        /// Spawns cursor for the Main Camera
        /// </summary>
        private TextMesh CreateBotResponseText()
        {
            // Create a sphere as new cursor
            GameObject textObject = new GameObject();
            textObject.transform.parent = Bot.Instance.transform;
            textObject.transform.localPosition = new Vector3(0,1,0);
    
            // Resize the new cursor
            textObject.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
    
            // Creating the text of the Label
            TextMesh textMesh = textObject.AddComponent<TextMesh>();
            textMesh.anchor = TextAnchor.MiddleCenter;
            textMesh.alignment = TextAlignment.Center;
            textMesh.fontSize = 50;
            textMesh.text = "Hi there, tap on me and I will start listening.";
    
            return textMesh;
        }
    
  8. Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.

  9. В редакторе Unity перетащите скрипт SceneOrganiser из папки Scripts (Скрипты) в главную камеру. Компонент "Организатор сцены" должен появиться в объекте "Основная камера", как показано на рисунке ниже.

    Снимок экрана: скрипт Организатора сцены, добавляемый в объект Main Camera в редакторе Unity.

Глава 13. Перед сборкой

Чтобы выполнить тщательный тест приложения, необходимо загрузить его неопубликованное приложение на HoloLens. Прежде чем сделать, убедитесь, что:

  • Все параметры, упомянутые в главе 4 , заданы правильно.
  • Скрипт SceneOrganiser присоединяется к объекту Main Camera .
  • В классе Bot убедитесь, что вы вставили секретный ключ бота в переменную botSecret .

Глава 14. Сборка и загрузка неопубликованных приложений в HoloLens

Все необходимое для раздела Unity этого проекта завершено, поэтому пришло время создать его из Unity.

  1. Перейдите в раздел Параметры сборки, Параметры сборки файлов > ....

  2. В окне Параметры сборки щелкните Сборка.

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

  3. Если это еще не так, установите флажок Проекты Unity C#.

  4. Щелкните Построить. Unity запустит окно проводник, в котором необходимо создать, а затем выбрать папку для сборки приложения. Создайте папку и назовите ее App. Затем, выбрав папку приложения , щелкните Выбрать папку.

  5. Unity начнет сборку проекта в папке App .

  6. После завершения сборки Unity (это может занять некоторое время), откроется окно проводник в расположении сборки (проверка панели задач, так как она может не всегда отображаться над окнами, но будет уведомлять вас о добавлении нового окна).

Глава 15. Развертывание в HoloLens

Чтобы развернуть в HoloLens, выполните приведенные далее действия.

  1. Вам потребуется IP-адрес HoloLens (для удаленного развертывания) и убедитесь, что HoloLens находится в режиме разработчика. Для этого выполните следующие действия.

    1. При ношении HoloLens откройте раздел Параметры.
    2. Перейдите в раздел Сетевые & Internet > Wi-Fi > Дополнительные параметры
    3. Запишите IPv4-адрес .
    4. Затем вернитесь к разделу Параметры, а затем выберите Обновить безопасность & > для разработчиков.
    5. Установите режим разработчика включено.
  2. Перейдите к новой сборке Unity (папке App ) и откройте файл решения в Visual Studio.

  3. В разделе Конфигурация решения выберите Отладка.

  4. В разделе Платформа решения выберите x86, Удаленный компьютер.

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

  5. Перейдите в меню Сборка и щелкните Развернуть решение, чтобы загрузить неопубликованное приложение в HoloLens.

  6. Теперь ваше приложение должно появиться в списке установленных на HoloLens приложений, готовых к запуску!

    Примечание

    Чтобы выполнить развертывание на иммерсивной гарнитуре, задайте для параметра Платформа решениязначение Локальный компьютер, а для параметра Конфигурациязначение Отладка с x86 в качестве платформы. Затем выполните развертывание на локальном компьютере, выбрав в меню Сборкапункт Развернуть решение.

Глава 16. Использование приложения в HoloLens

  • После запуска приложения перед вами появится синяя сфера бота.

  • Используйте жест касания , глядя на сферу, чтобы начать беседу.

  • Дождитесь начала беседы (в пользовательском интерфейсе будет отображаться сообщение при его возникновении). Получив вводное сообщение от бота, еще раз коснитесь бота, чтобы он покраснел и начал слушать ваш голос.

  • Когда вы прекратите говорить, приложение отправит ваше сообщение боту, и вы быстро получите ответ, который будет отображаться в пользовательском интерфейсе.

  • Повторите процесс отправки дополнительных сообщений боту (вам нужно нажимать каждый раз, когда вы хотите отключить сообщение).

В этом разговоре показано, как бот может хранить сведения (ваше имя), а также предоставлять известные сведения (например, элементы, которые запасаются).

Некоторые вопросы, которые нужно задать боту:

what do you sell? 

how much are umbrellas?

how much are raincoats?

Готовое приложение бота веб-приложения (версия 4)

Поздравляем, вы создали приложение смешанной реальности, которое использует бот веб-приложения Azure Microsoft Bot Framework версии 4.

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

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

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

Структура беседы в этом задании очень простая. Используйте Microsoft LUIS, чтобы предоставить вашему боту возможности распознавания естественного языка.

Упражнение 2

Этот пример не включает в себя прекращение беседы и перезапуск новой беседы. Чтобы сделать функцию бота полной, попробуйте реализовать закрытие диалога.