MR e Azure 312: integração de botsMR and Azure 312: Bot integration

Observação

Os tutoriais do Mixed Reality Academy foram projetados com o HoloLens (1ª geração) e os headsets imersivos de realidade misturada em mente.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. Dessa forma, achamos que é importante continuar disponibilizando esses tutoriais para os desenvolvedores que ainda buscam obter diretrizes para o desenvolvimento visando esses dispositivos.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. Esses tutoriais não serão atualizados com os conjuntos de ferramentas mais recentes nem com as interações usadas para o HoloLens 2.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Eles serão mantidos para continuar funcionando nos dispositivos compatíveis.They will be maintained to continue working on the supported devices. Haverá uma nova série de tutoriais que serão publicados no futuro, que demonstrarão como desenvolver para o 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. Esse aviso será atualizado com um link para esses tutoriais quando eles forem postados.This notice will be updated with a link to those tutorials when they are posted.

Neste curso, você aprenderá a criar e a implantar um bot usando o Microsoft bot Framework v4 e se comunicar com ele por meio de um aplicativo do 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.

O Microsoft bot Framework v4 é um conjunto de APIs projetado para fornecer aos desenvolvedores as ferramentas para criar um aplicativo de bot extensível e escalonável.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. Para obter mais informações, visite a página Microsoft bot Framework ou o repositório git v4.For more information, visit the Microsoft Bot Framework page or the V4 Git Repository.

Depois de concluir este curso, você terá criado um aplicativo do Windows Mixed Reality, que poderá fazer o seguinte:After completing this course, you will have built a Windows Mixed Reality application, which will be able to do the following:

  1. Use um gesto de toque para iniciar a escuta de bot para a voz dos usuários.Use a Tap Gesture to start the bot listening for the users voice.
  2. Quando o usuário disse algo, o bot tentará fornecer uma resposta.When the user has said something, the bot will attempt to provide a response.
  3. Exiba as respostas de bots como texto, posicionadas próximo ao bot, na cena do Unity.Display the bots reply as text, positioned near the bot, in the Unity Scene.

Em seu aplicativo, cabe a você como você integrará os resultados com seu design.In your application, it is up to you as to how you will integrate the results with your design. Este curso foi projetado para ensinar a você como integrar um serviço do Azure com seu projeto do Unity.This course is designed to teach you how to integrate an Azure Service with your Unity project. É seu trabalho usar o conhecimento obtido deste curso para aprimorar seu aplicativo de realidade misturada.It is your job to use the knowledge you gain from this course to enhance your mixed reality application.

Suporte a dispositivosDevice support

CursoCourse HoloLensHoloLens Headsets imersivosImmersive headsets
MR e Azure 312: integração de botsMR and Azure 312: Bot integration ✔️✔️ ✔️✔️

Observação

Embora este curso se concentre principalmente no HoloLens, você também pode aplicar o que aprende neste curso a fones de ouvido (VR) de realidade mista do Windows.While this course primarily focuses on HoloLens, you can also apply what you learn in this course to Windows Mixed Reality immersive (VR) headsets. Como os headsets de imersão (VR) não têm câmeras acessíveis, você precisará de uma câmera externa conectada ao seu PC.Because immersive (VR) headsets do not have accessible cameras, you will need an external camera connected to your PC. Ao acompanhar o curso, você verá observações sobre as alterações que talvez precise empregar para dar suporte a headsets de imersão (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.

Pré-requisitosPrerequisites

Observação

Este tutorial foi projetado para desenvolvedores que têm experiência básica com o Unity e o C#.This tutorial is designed for developers who have basic experience with Unity and C#. Além disso, lembre-se de que os pré-requisitos e as instruções escritas neste documento representam o que foi testado e verificado no momento da gravação (julho de 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). Você está livre para usar o software mais recente, conforme listado no artigo instalar as ferramentas , embora não seja recomendável que as informações neste curso correspondam perfeitamente ao que você encontrará no software mais recente do que o que está listado abaixo.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.

Recomendamos o seguinte hardware e software para este curso:We recommend the following hardware and software for this course:

Antes de começarBefore you start

  1. Para evitar problemas de criação desse projeto, é altamente recomendável que você crie o projeto mencionado neste tutorial em uma pasta raiz ou quase raiz (caminhos de pasta longos podem causar problemas em tempo de compilação).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. Configure e teste seu HoloLens.Set up and test your HoloLens. Se você precisar de suporte para configurar seu HoloLens, visite o artigo configuração do hololens.If you need support setting up your HoloLens, make sure to visit the HoloLens setup article.
  3. É uma boa ideia executar a calibragem e o ajuste do sensor ao começar a desenvolver um novo aplicativo do HoloLens (às vezes, ele pode ajudar a executar essas tarefas para cada usuário).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).

Para obter ajuda sobre calibragem, siga este link para o artigo Calibration do HoloLens.For help on Calibration, please follow this link to the HoloLens Calibration article.

Para obter ajuda sobre o ajuste do sensor, siga este link para o artigo de ajuste do sensor do HoloLens.For help on Sensor Tuning, please follow this link to the HoloLens Sensor Tuning article.

Capítulo 1 – criar o aplicativo botChapter 1 – Create the Bot application

A primeira etapa é criar o bot como um aplicativo Web ASP.Net Core local.The first step is to create your bot as a local ASP.Net Core Web application. Depois de concluir e testar, você o publicará no portal do Azure.Once you have finished and tested it, you will publish it to the Azure Portal.

  1. Abra o Visual Studio.Open Visual Studio. Crie um novo projeto, selecione aplicativo Web ASP .NET Core como o tipo de projeto (você o encontrará na subseção .NET Core) e chame-o de MyBot.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. Clique em OK.Click OK.

  2. Na janela que aparecerá, selecione vazio.In the Window that will appear select Empty. Verifique também se o destino está definido como ASP NET Core 2,0 e se a autenticação está definida como sem autenticação.Also make sure the target is set to ASP NET Core 2.0 and the Authentication is set to No Authentication. Clique em OK.Click OK.

    Criar o aplicativo bot

  3. A solução agora será aberta.The solution will now open. Clique com o botão direito do mouse em Solution Mybot na Gerenciador de soluções e clique em Manage NuGet packages for Solution.Right-click on Solution Mybot in the Solution Explorer and click on Manage NuGet Packages for Solution.

    Criar o aplicativo bot

  4. Na guia procurar , procure Microsoft. bot. Builder. Integration. AspNet. Core (certifique-se de que incluiu a versão prévia verificada).In the Browse tab, search for Microsoft.Bot.Builder.Integration.AspNet.Core (make sure you have Include pre-release checked). Selecione a versão do pacote 4.0.1-Preview e marque as caixas do projeto.Select the package version 4.0.1-preview, and tick the project boxes. Em seguida, clique em instalar.Then click on Install. Agora você instalou as bibliotecas necessárias para o bot Framework v4.You have now installed the libraries needed for the Bot Framework v4. Feche a página NuGet.Close the NuGet page.

    Criar o aplicativo bot

  5. Clique com o botão direito do mouse em seu projeto, MyBot, na Gerenciador de soluções e clique em Adicionar | classe.Right-click on your Project, MyBot, in the Solution Explorer and click on Add | Class.

    Criar o aplicativo bot

  6. Nomeie a classe MyBot e clique em Adicionar.Name the class MyBot and click on Add.

    Criar o aplicativo bot

  7. Repita o ponto anterior para criar outra classe chamada ConversationContext.Repeat the previous point, to create another class named ConversationContext.

  8. Clique com o botão direito do mouse em wwwroot no Gerenciador de soluções e clique em Adicionar | novo item.Right-click on wwwroot in the Solution Explorer and click on Add | New Item. Selecione a página HTML (você a encontrará na subseção Web).Select HTML Page (you will find it under the subsection Web). Nomeie o arquivo default.html.Name the file default.html. Clique em Adicionar.Click Add.

    Criar o aplicativo bot

  9. A lista de classes/objetos no Gerenciador de soluções deve ser parecida com a imagem abaixo.The list of classes / objects in the Solution Explorer should look like the image below.

    Criar o aplicativo bot

  10. Clique duas vezes na classe ConversationContext .Double-click on the ConversationContext class. Essa classe é responsável por conter as variáveis usadas pelo bot para manter o contexto da conversa.This class is responsible for holding the variables used by the bot to maintain the context of the conversation. Esses valores de contexto de conversa são mantidos em uma instância dessa classe, porque qualquer instância da classe MyBot será atualizada toda vez que uma atividade for recebida.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. Adicione o seguinte código à classe:Add the following code to the class:

    namespace MyBot
    {
        public static class ConversationContext
        {
            internal static string userName;
    
            internal static string userMsg;
        }
    }
    
  11. Clique duas vezes na classe MyBot .Double-click on the MyBot class. Essa classe hospedará os manipuladores chamados por qualquer atividade de entrada do cliente.This class will host the handlers called by any incoming activity from the customer. Nessa classe, você adicionará o código usado para criar a conversa entre o bot e o cliente.In this class you will add the code used to build the conversation between the bot and the customer. Como mencionado anteriormente, uma instância dessa classe é inicializada toda vez que uma atividade é recebida.As mentioned earlier, an instance of this class is initialized each time an activity is received. Adicione o seguinte código a esta classe: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. Clique duas vezes na classe Startup .Double-click on the Startup class. Essa classe irá inicializar o bot.This class will initialize the bot. Adicione o seguinte código à classe: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. Abra o arquivo de classe programa e verifique se o código nele é o seguinte: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. Lembre-se de salvar suas alterações, para fazer isso, vá para arquivo > salvar tudo, na barra de ferramentas na parte superior do Visual Studio.Remember to save your changes, to do so, go to File > Save All, from the toolbar at the top of Visual Studio.

Capítulo 2 – criar o serviço de bot do AzureChapter 2 - Create the Azure Bot Service

Agora que você criou o código para o bot, é necessário publicá-lo em uma instância do serviço de bot do aplicativo Web , no portal do 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. Este capítulo mostrará como criar e configurar o serviço bot no Azure e, em seguida, publicar seu código nele.This Chapter will show you how to create and configure the Bot Service on Azure and then publish your code to it.

  1. Primeiro, faça logon no portal do Azure ( https://portal.azure.com) .First, log in to the Azure Portal (https://portal.azure.com).

    1. Se você ainda não tiver uma conta do Azure, será necessário criar uma.If you do not already have an Azure account, you will need to create one. Se você estiver seguindo este tutorial em uma situação de sala de aula ou laboratório, peça ao instrutor ou a uma das proctors para obter ajuda para configurar sua nova conta.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. Depois de fazer logon, clique em criar um recurso no canto superior esquerdo e procure por bot do aplicativo Web e clique em Enter.Once you are logged in, click on Create a resource in the top left corner, and search for Web App bot, and click Enter.

    Criar o serviço de bot do Azure

  3. A nova página fornecerá uma descrição do serviço de bot do aplicativo Web .The new page will provide a description of the Web App Bot Service. Na parte inferior esquerda desta página, selecione o botão criar para criar uma associação com esse serviço.At the bottom left of this page, select the Create button, to create an association with this Service.

    Criar o serviço de bot do Azure

  4. Depois de clicar em criar:Once you have clicked on Create:

    1. Insira o nome desejado para esta instância de serviço.Insert your desired Name for this Service instance.

    2. Selecione uma Assinatura.Select a Subscription.

    3. Escolha um grupo de recursos ou crie um novo.Choose a Resource Group or create a new one. Um grupo de recursos fornece uma maneira de monitorar, controlar o acesso, provisionar e gerenciar a cobrança de uma coleção de ativos do Azure.A resource group provides a way to monitor, control access, provision and manage billing for a collection of Azure assets. É recomendável manter todos os serviços do Azure associados a um único projeto (por exemplo, esses cursos) em um grupo de recursos comum).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).

      Se você quiser ler mais sobre grupos de recursos do Azure, siga este linkIf you wish to read more about Azure Resource Groups, please follow this link

    4. Determine o local do seu grupo de recursos (se você estiver criando um novo grupo de recursos).Determine the Location for your resource group (if you are creating a new Resource Group). O local ideal seria na região em que o aplicativo seria executado.The location would ideally be in the region where the application would run. Alguns ativos do Azure só estão disponíveis em determinadas regiões.Some Azure assets are only available in certain regions.

    5. Selecione o tipo de preço apropriado para você, se esta for a primeira vez que criar um serviço de bot de aplicativo Web , uma camada gratuita (chamada F0) deverá estar disponível para você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. O nome do aplicativo pode apenas ser deixado o mesmo que o nome do bot.App name can just be left the same as the Bot name.

    7. Deixe o modelo de bot como básico (C#).Leave the Bot template as Basic (C#).

    8. O plano/local do serviço de aplicativo deve ter sido preenchido automaticamente para sua conta.App service plan/Location should have been auto-filled for your account.

    9. Defina o armazenamento do Azure que você deseja usar para hospedar o bot.Set the Azure Storage that you wish to use to host your Bot. Se você ainda não tiver um, poderá criá-lo aqui.If you dont have one already, you can create it here.

    10. Você também precisará confirmar que entendeu os termos e condições aplicados a esse serviço.You will also need to confirm that you have understood the Terms and Conditions applied to this Service.

    11. Clique em Criar.Click Create.

      Criar o serviço de bot do Azure

  5. Depois de clicar em criar, você precisará aguardar até que o serviço seja criado, isso pode levar um minuto.Once you have clicked on Create, you will have to wait for the Service to be created, this might take a minute.

  6. Uma notificação será exibida no portal assim que a instância do serviço for criada.A notification will appear in the Portal once the Service instance is created.

    Criar o serviço de bot do Azure

  7. Clique na notificação para explorar sua nova instância de serviço.Click on the notification to explore your new Service instance.

    Criar o serviço de bot do Azure

  8. Clique no botão ir para recurso na notificação para explorar sua nova instância de serviço.Click the Go to resource button in the notification to explore your new Service instance. Você será levado para sua nova instância de serviço do Azure.You will be taken to your new Azure Service instance.

    Criar o serviço de bot do Azure

  9. Neste ponto, você precisa configurar um recurso chamado linha direta para permitir que o aplicativo cliente se comunique com esse serviço de bot.At this point you need to setup a feature called Direct Line to allow your client application to communicate with this Bot Service. Clique em canais e, na seção Adicionar um canal em destaque , clique em Configurar canal de linha direta.Click on Channels, then in the Add a featured channel section, click on Configure Direct Line channel.

    Criar o serviço de bot do Azure

  10. Nesta página, você encontrará as chaves secretas que permitirão que seu aplicativo cliente seja autenticado com o bot.In this page you will find the Secret keys that will allow your client app to authenticate with the bot. Clique no botão Mostrar e faça uma cópia de uma das chaves exibidas, pois você precisará dela posteriormente em seu projeto.Click on the Show button and take a copy of one of the displayed Keys, as you will need this later in your project.

    Criar o serviço de bot do Azure

Capítulo 3 – publicar o bot no serviço de bot do aplicativo Web do AzureChapter 3 – Publish the Bot to the Azure Web App Bot Service

Agora que seu serviço está pronto, você precisa publicar seu código de bot, que você criou anteriormente, para o serviço de bot do aplicativo Web criado recentemente.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.

Observação

Você precisará publicar o bot no serviço do Azure sempre que fizer alterações na solução/código de bot.You will have to publish your Bot to the Azure Service every time you make changes to the Bot solution / code.

  1. Volte para a solução do Visual Studio que você criou anteriormente.Go back to your Visual Studio Solution that you created previously.

  2. Clique com o botão direito do mouse no projeto MyBot , na Gerenciador de soluções e clique em publicar.Right-click on your MyBot project, in the Solution Explorer, then click on Publish.

    Publicar o bot no serviço de bot do aplicativo Web do Azure

  3. Na página escolher um destino de publicação , clique em serviço de aplicativo e selecione existente, por fim, clique em Criar perfil (talvez seja necessário clicar na seta suspensa junto com o botão publicar , se isso não estiver visível).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).

    Publicar o bot no serviço de bot do aplicativo Web do Azure

  4. Se você ainda não estiver conectado à sua conta da Microsoft, precisará fazê-lo aqui.If you are not yet logged in into your Microsoft Account, you have to do it here.

  5. Na página publicar , você verá que precisa definir a mesma assinatura que usou para a criação do serviço de bot do aplicativo Web .On the Publish page you will find you have to set the same Subscription that you used for the Web App Bot Service creation. Em seguida, defina a exibição como grupo de recursos e, na estrutura de pastas suspensa, selecione o grupo de recursos que você criou anteriormente.Then set the View as Resource Group and, in the drop down folder structure, select the Resource Group you have created previously. Clique em OK.Click OK.

    Publicar o bot no serviço de bot do aplicativo Web do Azure

  6. Agora, clique no botão publicar e aguarde até que o bot seja publicado (pode levar alguns minutos).Now click on the Publish button, and wait for the Bot to be published (it might take a few minutes).

    Publicar o bot no serviço de bot do aplicativo Web do Azure

Capítulo 4 – configurar o projeto do UnityChapter 4 – Set up the Unity project

A seguir está uma configuração típica para o desenvolvimento com realidade misturada e, como tal, é um bom modelo para outros projetos.The following is a typical set up for developing with mixed reality, and as such, is a good template for other projects.

  1. Abra o Unity e clique em novo.Open Unity and click New.

    Configurar o projeto do Unity

  2. Agora, você precisará fornecer um nome de projeto de Unity.You will now need to provide a Unity project name. Inserir bot do HoloLens.Insert HoloLens Bot. Verifique se o modelo de projeto está definido como 3D.Make sure the project template is set to 3D. Defina o local como algum lugar apropriado para você (Lembre-se de que, mais próximo de diretórios raiz é melhor).Set the Location to somewhere appropriate for you (remember, closer to root directories is better). Em seguida, clique em criar projeto.Then, click Create project.

    Configurar o projeto do Unity

  3. Com o Unity Open, vale a pena verificar se o Editor de script padrão está definido como Visual Studio.With Unity open, it is worth checking the default Script Editor is set to Visual Studio. Vá para Editar preferências de > e, em seguida, na nova janela, navegue até Ferramentas externas.Go to Edit > Preferences and then from the new window, navigate to External Tools. Altere o Editor de script externo para o Visual Studio 2017.Change External Script Editor to Visual Studio 2017. Feche a janela preferências .Close the Preferences window.

    Configurar o projeto do Unity

  4. Em seguida, vá para arquivo > configurações de Build e selecione plataforma universal do Windows e, em seguida, clique no botão alternar plataforma para aplicar sua seleção.Next, go to File > Build Settings and select Universal Windows Platform, then click on the Switch Platform button to apply your selection.

    Configurar o projeto do Unity

  5. Ainda no arquivo > configurações de compilação e certifique-se de que:While still in File > Build Settings and make sure that:

    1. O dispositivo de destino está definido como HoloLensTarget Device is set to HoloLens

      Para os headsets de imersão, defina dispositivo de destino para qualquer dispositivo.For the immersive headsets, set Target Device to Any Device.

    2. O tipo de compilação está definido como D3DBuild Type is set to D3D

    3. O SDK está definido para o mais recente instaladoSDK is set to Latest installed

    4. A versão do Visual Studio está definida para o mais recente instaladoVisual Studio Version is set to Latest installed

    5. Compilar e executar é definido como computador localBuild and Run is set to Local Machine

    6. Salve a cena e adicione-a à compilação.Save the scene and add it to the build.

      1. Faça isso selecionando Adicionar abrir cenas.Do this by selecting Add Open Scenes. Uma janela salvar será exibida.A save window will appear.

        Configurar o projeto do Unity

      2. Crie uma nova pasta para isso e qualquer cena futura, em seguida, selecione o botão nova pasta , para criar uma nova pasta, nomeie-a como cenas.Create a new folder for this, and any future, scene, then select the New folder button, to create a new folder, name it Scenes.

        Configurar o projeto do Unity

      3. Abra sua pasta de cenas recém-criada e, no campo nome do arquivo:, digite BotScene e clique em salvar.Open your newly created Scenes folder, and then in the File name: text field, type BotScene, then click on Save.

        Configurar o projeto do Unity

    7. As configurações restantes, em configurações de compilação, devem ser deixadas como padrão por enquanto.The remaining settings, in Build Settings, should be left as default for now.

  6. Na janela configurações de compilação , clique no botão configurações do Player , isso abrirá o painel relacionado no espaço onde o Inspetor está localizado.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.

    Configurar o projeto do Unity

  7. Nesse painel, algumas configurações precisam ser verificadas:In this panel, a few settings need to be verified:

    1. Na guia outras configurações :In the Other Settings tab:

      1. A versão de tempo de execução de script deve ser Experimental (NET 4,6 equivalente); alterar isso exigirá uma reinicialização do editor.Scripting Runtime Version should be Experimental (NET 4.6 Equivalent); changing this will require a restart of the Editor.

      2. O back-end de script deve ser .netScripting Backend should be .NET

      3. O nível de compatibilidade da API deve ser .NET 4,6API Compatibility Level should be .NET 4.6

        Configurar o projeto do Unity

    2. Na guia configurações de publicação , em recursos, marque:Within the Publishing Settings tab, under Capabilities, check:

      • InternetClientInternetClient

      • MicrofoneMicrophone

        Configurar o projeto do Unity

    3. Mais adiante no painel, em configurações de XR (encontradas abaixo de configurações de publicação), suporte à realidade virtual em escala, verifique se o SDK do Windows Mixed Reality foi adicionado.Further down the panel, in XR Settings (found below Publish Settings), tick Virtual Reality Supported, make sure the Windows Mixed Reality SDK is added.

      Configurar o projeto do Unity

  8. De volta nas configurações de Build , projetos do Unity C# não estão mais esmaecidos; Marque a caixa de seleção ao lado deste.Back in Build Settings Unity C# Projects is no longer greyed out; tick the checkbox next to this.

  9. Feche a janela Configurações de Build.Close the Build Settings window.

  10. Salve sua cena e projeto (arquivo > salvar cena/arquivo > salvar projeto).Save your scene and project (FILE > SAVE SCENE / FILE > SAVE PROJECT).

Capítulo 5 – configuração da câmeraChapter 5 – Camera setup

Importante

Se você quiser ignorar o componente de configuração do Unity deste curso e continuar diretamente no código, sinta-se à vontade para baixar este Azure-Mr-312-Package. unitypackage, importá-lo em seu projeto como um pacote personalizadoe, em seguida, continuar no capítulo 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. No painel hierarquia, selecione a câmera principal.In the Hierarchy panel, select the Main Camera.

  2. Depois de selecionado, você poderá ver todos os componentes da câmera principal no painel Inspetor.Once selected, you will be able to see all the components of the Main Camera in the Inspector panel.

    1. O objeto de câmera deve ser nomeado como a câmera principal (Observe a grafia)The Camera object must be named Main Camera (note the spelling)
    2. A marca da câmera principal deve ser definida como MainCamera (Observe a grafia)The Main Camera Tag must be set to MainCamera (note the spelling)
    3. Verifique se a posição de transformação está definida como 0, 0, 0Make sure the Transform Position is set to 0, 0, 0
    4. Defina limpar sinalizadores como cor sólida.Set Clear Flags to Solid Color.
    5. Defina a cor do plano de fundo do componente da câmera como preto, alfa 0 (código hex: #00000000)Set the Background Color of the Camera component to Black, Alpha 0 (Hex Code: #00000000)

    Configuração da câmera

Capítulo 6 – importar a biblioteca NewtonsoftChapter 6 – Import the Newtonsoft library

Para ajudá-lo a desserializar e serializar objetos recebidos e enviados ao serviço bot, você precisa baixar a biblioteca Newtonsoft .To help you deserialize and serialize objects received and sent to the Bot Service you need to download the Newtonsoft library. Você encontrará uma versão compatível já organizada com a estrutura de pasta do Unity correta aqui.You will find a compatible version already organized with the correct Unity folder structure here.

Para importar a biblioteca Newtonsoft para seu projeto, use o pacote do Unity que acompanha este curso.To import the Newtonsoft library into your project, use the Unity Package which came with this course.

  1. Adicione o . unitypackage ao Unity usando a Assets > opção de menu Import Package > pacote personalizado do pacote de importação de ativos.Add the .unitypackage to Unity by using the Assets > Import Package > Custom Package menu option.

    Importar a biblioteca Newtonsoft

  2. Na caixa Importar pacote de Unity que é exibida, verifique se tudo em (e incluindo) plug-ins está selecionado.In the Import Unity Package box that pops up, ensure everything under (and including) Plugins is selected.

    Importar a biblioteca Newtonsoft

  3. Clique no botão importar para adicionar os itens ao seu projeto.Click the Import button to add the items to your project.

  4. Vá para a pasta Newtonsoft em plug-ins na exibição de projeto e selecione o plug-in Newtonsoft.Go to the Newtonsoft folder under Plugins in the project view and select the Newtonsoft plugin.

  5. Com o plug-in Newtonsoft selecionado, verifique se qualquer plataforma está desmarcada e, em seguida, verifique se o WSAPlayer também está desmarcado e clique em aplicar.With the Newtonsoft plugin selected, ensure that Any Platform is unchecked, then ensure that WSAPlayer is also unchecked, then click Apply. Isso é apenas para confirmar que os arquivos estão configurados corretamente.This is just to confirm that the files are configured correctly.

    Observação

    Marcar esses plug-ins os configura para ser usado apenas no editor do Unity.Marking these plugins configures them to only be used in the Unity Editor. Há um conjunto diferente deles na pasta WSA que será usada depois que o projeto for exportado do Unity.There are a different set of them in the WSA folder which will be used after the project is exported from Unity.

  6. Em seguida, você precisa abrir a pasta WSA , dentro da pasta Newtonsoft .Next, you need to open the WSA folder, within the Newtonsoft folder. Você verá uma cópia do mesmo arquivo que acabou de configurar.You will see a copy of the same file you just configured. Selecione o arquivo e, no Inspetor, verifique seSelect the file, and then in the inspector, ensure that

    • Qualquer plataforma está desmarcadaAny Platform is unchecked
    • somente WSAPlayer está marcadoonly WSAPlayer is checked
    • Não processar está marcadoDont process is checked

Capítulo 7 – criar o BotTagChapter 7 – Create the BotTag

  1. Crie um novo objeto de marca chamado BotTag.Create a new Tag object called BotTag. Selecione a câmera principal na cena.Select the Main Camera in the scene. Clique no menu suspenso marca no painel inspetor.Click on the Tag drop down menu in the Inspector panel. Clique em adicionar marca.Click on Add Tag.

    Configuração da câmera

  2. Clique no + símbolo.Click on the + symbol. Nomeie a nova marca como BotTag, salve.Name the new Tag as BotTag, Save.

    Configuração da câmera

Aviso

Não aplique o BotTag à câmera principal.Do not apply the BotTag to the Main Camera. Se você tiver feito isso acidentalmente, certifique-se de alterar a marca da câmera principal de volta para MainCamera.If you have accidentally done this, make sure to change the Main Camera tag back to MainCamera.

Capítulo 8 – criar a classe BotObjectsChapter 8 – Create the BotObjects class

O primeiro script que você precisa criar é a classe BotObjects , que é uma classe vazia criada para que uma série de outros objetos de classe possa ser armazenada dentro do mesmo script e acessada por outros scripts na cena.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.

A criação dessa classe é puramente uma opção arquitetônica, esses objetos podem ser hospedados no script bot que você criará posteriormente neste curso.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.

Para criar esta classe:To create this class:

  1. Clique com o botão direito do mouse no painel Projeto e crie > pasta.Right-click in the Project panel, then Create > Folder. Nomeie a pasta scripts.Name the folder Scripts.

    Criar pasta de scripts.

  2. Clique duas vezes na pasta scripts para abri-la.Double-click on the Scripts folder to open it. Em seguida, dentro dessa pasta, clique com o botão direito do mouse e selecione criar > script C#.Then within that folder, right-click, and select Create > C# Script. Nomeie o script BotObjects.Name the script BotObjects.

  3. Clique duas vezes no novo script BotObjects para abri-lo com o Visual Studio.Double-click on the new BotObjects script to open it with Visual Studio.

  4. Exclua o conteúdo do script e substitua-o pelo código a seguir: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. Certifique-se de salvar suas alterações no Visual Studio antes de retornar ao Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Capítulo 9 – criar a classe GazeInputChapter 9 – Create the GazeInput class

A próxima classe que você vai criar é a classe GazeInput .The next class you are going to create is the GazeInput class. Essa classe é responsável por:This class is responsible for:

  • Criar um cursor que representará o olhar do Player.Creating a cursor that will represent the gaze of the player.
  • Detectar objetos atingidos pelo olhar do Player e manter uma referência a objetos detectados.Detecting objects hit by the gaze of the player, and holding a reference to detected objects.

Para criar esta classe:To create this class:

  1. Vá para a pasta scripts que você criou anteriormente.Go to the Scripts folder you created previously.

  2. Clique com o botão direito do mouse dentro da pasta, crie > script C#.Right-click inside the folder, Create > C# Script. Chame o script GazeInput.Call the script GazeInput.

  3. Clique duas vezes no novo script GazeInput para abri-lo com o Visual Studio.Double-click on the new GazeInput script to open it with Visual Studio.

  4. Insira a linha a seguir na parte superior do nome da classe: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. Em seguida, adicione as seguintes variáveis dentro da classe GazeInput , acima do método 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. O código para o método Start () deve ser adicionado.Code for Start() method should be added. Isso será chamado quando a classe for inicializada:This will be called when the class initializes:

        /// <summary>
        /// Start method used upon initialization.
        /// </summary>
        internal virtual void Start()
        {
            FocusedObject = null;
            Cursor = CreateCursor();
        }
    
  7. Implemente um método que criará uma instância e configurará o cursor olhar: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. Implemente os métodos que irão configurar o Raycast da câmera principal e acompanhará o objeto focalizado atual.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. Certifique-se de salvar suas alterações no Visual Studio antes de retornar ao Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Capítulo 10 – criar a classe botChapter 10 – Create the Bot class

O script que você vai criar agora é chamado de bot.The script you are going to create now is called Bot. Essa é a classe principal do seu aplicativo, armazena:This is the core class of your application, it stores:

  • Suas credenciais de bot do aplicativo WebYour Web App Bot credentials
  • O método que coleta os comandos de voz do usuárioThe method that collects the user voice commands
  • O método necessário para iniciar conversas com o bot do aplicativo WebThe method necessary to initiate conversations with your Web App Bot
  • O método necessário para enviar mensagens para o bot do aplicativo WebThe method necessary to send messages to your Web App Bot

Para enviar mensagens para o serviço bot, a corotina SendMessageToBot () criará uma atividade, que é um objeto reconhecido pela estrutura de bot como dados enviados pelo usuário.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.

Para criar esta classe:To create this class:

  1. Clique duas vezes na pasta scripts para abri-la.Double-click on the Scripts folder, to open it.

  2. Clique com o botão direito do mouse na pasta scripts , clique em criar > script C#.Right-click inside the Scripts folder, click Create > C# Script. Nomeie o script bot.Name the script Bot.

  3. Clique duas vezes no novo script para abri-lo com o Visual Studio.Double-click on the new script to open it with Visual Studio.

  4. Atualize os namespaces para que sejam iguais aos seguintes, na parte superior da classe 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. Dentro da classe bot , adicione as seguintes variáveis: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;
    

    Observação

    Certifique-se de inserir a chave secreta de bot na variável botSecret .Make sure you insert your Bot Secret Key into the botSecret variable. Você terá anotado sua chave secreta de bot no início deste curso, no capítulo 2, etapa 10.You will have noted your Bot Secret Key at the beginning of this course, in Chapter 2, step 10.

  6. O código para ativo () e Start () agora precisa ser adicionado.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. Adicione os dois manipuladores que são chamados pelas bibliotecas de fala quando a captura de voz começa e termina.Add the two handlers that are called by the speech libraries when voice capture begins and ends. O DictationRecognizer interromperá automaticamente a captura da voz do usuário quando o usuário parar de falar.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. O manipulador a seguir coleta o resultado da entrada de voz do usuário e chama a corrotina responsável por enviar a mensagem para o serviço de bot do aplicativo Web.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. A seguinte corrotina é chamada para iniciar uma conversa com o bot.The following coroutine is called to begin a conversation with the Bot. Você observará que, depois que a chamada de conversa for concluída, ela chamará o SendMessageToCoroutine () passando uma série de parâmetros que definirão a atividade a ser enviada ao serviço bot como uma mensagem vazia.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. Isso é feito para solicitar que o serviço de bot inicie a caixa de diálogo.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. A seguinte corrotina é chamada para criar a atividade a ser enviada ao serviço 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. A seguinte corrotina é chamada para solicitar uma resposta depois de enviar uma atividade para o serviço de 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. O último método a ser adicionado a essa classe é necessário para exibir a mensagem na cena: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;
        }
    

    Observação

    Você pode ver um erro no console do editor do Unity, sobre a ausência da classe SceneOrganiser .You may see an error within the Unity Editor Console, about missing the SceneOrganiser class. Desconsidere esta mensagem, pois você criará essa classe posteriormente no tutorial.Disregard this message, as you will create this class later in the tutorial.

  13. Certifique-se de salvar suas alterações no Visual Studio antes de retornar ao Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Capítulo 11 – criar a classe interaçõesChapter 11 – Create the Interactions class

A classe que você pretende criar agora é chamada de interações.The class you are going to create now is called Interactions. Essa classe é usada para detectar a entrada de toque do HoloLens do usuário.This class is used to detect the HoloLens Tap Input from the user.

Se o usuário tocar enquanto examina o objeto bot na cena e o bot estiver pronto para escutar entradas de voz, o objeto bot mudará de cor para vermelho e começará a escutar as entradas de voz.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.

Essa classe herda da classe GazeInput e, portanto, é capaz de fazer referência ao método Start () e às variáveis dessa classe, denotada pelo uso de 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.

Para criar esta classe:To create this class:

  1. Clique duas vezes na pasta scripts para abri-la.Double-click on the Scripts folder, to open it.

  2. Clique com o botão direito do mouse na pasta scripts , clique em criar > script C#.Right-click inside the Scripts folder, click Create > C# Script. Nomeie o script de interações.Name the script Interactions.

  3. Clique duas vezes no novo script para abri-lo com o Visual Studio.Double-click on the new script to open it with Visual Studio.

  4. Atualize os namespaces e a herança de classe para ser o mesmo que o seguinte, na parte superior da classe interações :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. Dentro da classe interações , adicione a seguinte variável:Inside the Interactions class add the following variable:

        /// <summary>
        /// Allows input recognition with the HoloLens
        /// </summary>
        private GestureRecognizer _gestureRecognizer;
    
  6. Em seguida, adicione o método 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. Adicione o manipulador que será disparado quando o usuário executar o gesto de toque na frente da câmera do HoloLensAdd 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. Certifique-se de salvar suas alterações no Visual Studio antes de retornar ao Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Capítulo 12 – criar a classe SceneOrganiserChapter 12 – Create the SceneOrganiser class

A última classe necessária neste laboratório é chamada de SceneOrganiser.The last class required in this Lab is called SceneOrganiser. Essa classe configurará a cena programaticamente, adicionando componentes e scripts à câmera principal e criando os objetos apropriados na cena.This class will setup the scene programmatically, by adding components and scripts to the Main Camera, and creating the appropriate objects in the scene.

Para criar esta classe:To create this class:

  1. Clique duas vezes na pasta scripts para abri-la.Double-click on the Scripts folder, to open it.

  2. Clique com o botão direito do mouse na pasta scripts , clique em criar > script C#.Right-click inside the Scripts folder, click Create > C# Script. Nomeie o script SceneOrganiser.Name the script SceneOrganiser.

  3. Clique duas vezes no novo script para abri-lo com o Visual Studio.Double-click on the new script to open it with Visual Studio.

  4. Dentro da classe SceneOrganiser , adicione as seguintes variáveis: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. Em seguida, adicione os métodos ativo () e Iniciar () :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. Adicione o seguinte método, responsável por criar o objeto bot na cena e configurar os parâmetros e os componentes: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. Adicione o seguinte método, responsável por criar o objeto de interface do usuário na cena, representando as respostas do bot: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. Certifique-se de salvar suas alterações no Visual Studio antes de retornar ao Unity.Be sure to save your changes in Visual Studio before returning to Unity.

  9. No editor do Unity, arraste o script SceneOrganiser da pasta scripts para a câmera principal.In the Unity Editor, drag the SceneOrganiser script from the Scripts folder to the Main Camera. O componente de Organizer de cena agora deve aparecer no objeto de câmera principal, conforme mostrado na imagem abaixo.The Scene Organiser component should now appear on the Main Camera object, as shown in the image below.

    Criar o serviço de bot do Azure

Capítulo 13 – antes de criarChapter 13 – Before building

Para executar um teste completo de seu aplicativo, você precisará Sideload-lo no seu HoloLens.To perform a thorough test of your application you will need to sideload it onto your HoloLens. Antes de fazer isso, verifique se:Before you do, ensure that:

  • Todas as configurações mencionadas no capítulo 4 são definidas corretamente.All the settings mentioned in the Chapter 4 are set correctly.
  • O script SceneOrganiser é anexado ao objeto da câmera principal .The script SceneOrganiser is attached to the Main Camera object.
  • Na classe bot , verifique se você inseriu a chave secreta de bot na variável botSecret .In the Bot class, make sure you have inserted your Bot Secret Key into the botSecret variable.

Capítulo 14 – criar e Sideloadr para o HoloLensChapter 14 – Build and Sideload to the HoloLens

Tudo o que é necessário para a seção do Unity deste projeto foi concluído, portanto, é hora de compilá-lo a partir do Unity.Everything needed for the Unity section of this project has now been completed, so it is time to build it from Unity.

  1. Navegue até configurações de compilação, arquivo > configurações de compilação....Navigate to Build Settings, File > Build Settings….

  2. Na janela configurações de compilação , clique em Compilar.From the Build Settings window, click Build.

    Compilando o aplicativo do Unity

  3. Se ainda não estiver, projetos do Tick Unity C#.If not already, tick Unity C# Projects.

  4. Clique em Compilar.Click Build. O Unity iniciará uma janela Explorador de arquivos , onde você precisará criar e, em seguida, selecionar uma pasta na qual o aplicativo será compilado.Unity will launch a File Explorer window, where you need to create and then select a folder to build the app into. Crie essa pasta agora e nomeie-a como aplicativo.Create that folder now, and name it App. Em seguida, com a pasta de aplicativo selecionada, clique em Selecionar pasta.Then with the App folder selected, click Select Folder.

  5. O Unity começará a criar seu projeto na pasta do aplicativo .Unity will begin building your project to the App folder.

  6. Depois que o Unity terminar a compilação (pode levar algum tempo), ele abrirá uma janela do Explorador de arquivos no local de sua compilação (verifique sua barra de tarefas, pois ela nem sempre aparecerá acima das janelas, mas o notificará sobre a adição de uma nova janela).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).

Capítulo 15 – implantar no HoloLensChapter 15 – Deploy to HoloLens

Para implantar no HoloLens:To deploy on HoloLens:

  1. Você precisará do endereço IP do seu HoloLens (para implantação remota) e para garantir que seu HoloLens esteja no modo de desenvolvedor.You will need the IP Address of your HoloLens (for Remote Deploy), and to ensure your HoloLens is in Developer Mode. Para fazer isso:To do this:

    1. Enquanto estiver desgastando seu HoloLens, abra as configurações.Whilst wearing your HoloLens, open the Settings.
    2. Vá para rede & Internet > Wi-Fi > opções avançadasGo to Network & Internet > Wi-Fi > Advanced Options
    3. Anote o endereço IPv4 .Note the IPv4 address.
    4. Em seguida, navegue de volta para configurações e, em seguida, atualize & > de segurança para desenvolvedoresNext, navigate back to Settings, and then to Update & Security > For Developers
    5. Defina o modo de desenvolvedor em.Set Developer Mode On.
  2. Navegue até sua nova compilação do Unity (a pasta do aplicativo ) e abra o arquivo de solução com o Visual Studio.Navigate to your new Unity build (the App folder) and open the solution file with Visual Studio.

  3. Na configuração da solução , selecione depurar.In the Solution Configuration select Debug.

  4. Na plataforma da solução, selecione x86, computador remoto.In the Solution Platform, select x86, Remote Machine.

    Implante a solução do Visual Studio.

  5. Vá para o menu Compilar e clique em implantar solução para Sideload o aplicativo ao seu HoloLens.Go to the Build menu and click on Deploy Solution, to sideload the application to your HoloLens.

  6. Seu aplicativo agora deve aparecer na lista de aplicativos instalados em seu HoloLens, pronto para ser iniciado!Your app should now appear in the list of installed apps on your HoloLens, ready to be launched!

    Observação

    Para implantar em headsets de imersão, defina a plataforma da solução como computador local e defina a configuração a ser depurada, com x86 como a plataforma.To deploy to immersive headset, set the Solution Platform to Local Machine, and set the Configuration to Debug, with x86 as the Platform. Em seguida, implante no computador local, usando o menu Compilar, selecionando implantar solução.Then deploy to the local machine, using the Build menu, selecting Deploy Solution.

Capítulo 16 – usando o aplicativo no HoloLensChapter 16 – Using the application on the HoloLens

  • Depois de iniciar o aplicativo, você verá o bot como uma esfera azul na frente de você.Once you have launched the application, you will see the Bot as a blue sphere in front of you.

  • Use o gesto de toque enquanto você estiver nuvens na esfera para iniciar uma conversa.Use the Tap Gesture while you are gazing at the sphere to initiate a conversation.

  • Aguarde até que a conversa seja iniciada (a interface do usuário exibirá uma mensagem quando ela ocorrer).Wait for the conversation to start (The UI will display a message when it happens). Depois de receber a mensagem introdutória do bot, toque novamente no bot para que ele se transforme em vermelho e comece a escutar sua voz.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.

  • Depois de parar de conversar, seu aplicativo enviará sua mensagem para o bot e você receberá uma resposta que será exibida na interface do usuário.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.

  • Repita o processo para enviar mais mensagens para o bot (você precisa tocar sempre que desejar receber uma mensagem).Repeat the process to send more messages to your Bot (you have to tap each time you want to sen a message).

Essa conversa demonstra como o bot pode reter informações (seu nome), enquanto fornece também informações conhecidas (como os itens que estão em estoque).This conversation demonstrates how the Bot can retain information (your name), whilst also providing known information (such as the items that are stocked).

Algumas perguntas a serem feitas ao bot:Some questions to ask the Bot:

what do you sell? 

how much are umbrellas?

how much are raincoats?

Seu aplicativo Web App bot (v4) concluídoYour finished Web App Bot (v4) application

Parabéns, você criou um aplicativo de realidade misturada que aproveita o bot do aplicativo Web do Azure, o Microsoft bot Framework v4.Congratulations, you built a mixed reality app that leverages the Azure Web App Bot, Microsoft Bot Framework v4.

Produto final

Exercícios de bônusBonus exercises

Exercício 1Exercise 1

A estrutura de conversa neste laboratório é muito básica.The conversation structure in this Lab is very basic. Use o Microsoft LUIS para dar aos seus recursos de reconhecimento de linguagem natural de bot.Use Microsoft LUIS to give your bot natural language understanding capabilities.

Exercício 2Exercise 2

Este exemplo não inclui o encerramento de uma conversa e a reinicialização de uma nova.This example does not include terminating a conversation and restarting a new one. Para que o recurso de bot seja concluído, tente implementar o fechamento na conversa.To make the Bot feature complete, try to implement closure to the conversation.