MR e Azure 312: Integrazione di botMR and Azure 312: Bot integration

Nota

Le esercitazioni di Mixed Reality Academy sono state progettate in base a HoloLens (prima generazione) e ai visori VR immersive di realtà mista.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. Pertanto, riteniamo importante lasciarle a disposizione degli sviluppatori a cui serve ancora materiale sussidiario per lo sviluppo di questi dispositivi.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. Queste esercitazioni non verranno aggiornate con i set di strumenti o le interazioni più recenti usati per HoloLens 2.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Rimarranno invariate per consentire di continuare a lavorare sui dispositivi supportati.They will be maintained to continue working on the supported devices. In futuro sarà disponibile una nuova serie di esercitazioni che illustrano come sviluppare per 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. Questo avviso verrà aggiornato con un collegamento a queste esercitazioni quando vengono pubblicate.This notice will be updated with a link to those tutorials when they are posted.

In questo corso si apprenderà come creare e distribuire un bot con Microsoft bot Framework V4 e come comunicare con esso tramite un'applicazione di realtà mista di Windows.In this course, you will learn how to create and deploy a bot using the Microsoft Bot Framework V4 and communicate with it through a Windows Mixed Reality application.

Microsoft bot Framework V4 è un set di API progettate per fornire agli sviluppatori gli strumenti necessari per creare un'applicazione bot estensibile e scalabile.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. Per ulteriori informazioni, visitare la pagina Microsoft bot Framework o il repository git V4.For more information, visit the Microsoft Bot Framework page or the V4 Git Repository.

Al termine di questo corso, sarà stata compilata un'applicazione di realtà mista di Windows, che sarà in grado di eseguire le operazioni seguenti:After completing this course, you will have built a Windows Mixed Reality application, which will be able to do the following:

  1. Usare un movimento Tap per avviare il bot in ascolto per la voce degli utenti.Use a Tap Gesture to start the bot listening for the users voice.
  2. Quando l'utente ha detto qualcosa, il bot tenterà di fornire una risposta.When the user has said something, the bot will attempt to provide a response.
  3. Visualizza la risposta dei bot come testo, posizionata vicino al bot, nella scena Unity.Display the bots reply as text, positioned near the bot, in the Unity Scene.

Nell'applicazione, spetta all'utente come integrare i risultati con la progettazione.In your application, it is up to you as to how you will integrate the results with your design. Questo corso è stato progettato per insegnare come integrare un servizio di Azure con il progetto Unity.This course is designed to teach you how to integrate an Azure Service with your Unity project. Per migliorare l'applicazione di realtà mista, è compito dell'utente sfruttare le conoscenze acquisite in questo corso.It is your job to use the knowledge you gain from this course to enhance your mixed reality application.

Supporto di dispositiviDevice support

CorsoCourse HoloLensHoloLens Visori VR immersiveImmersive headsets
MR e Azure 312: Integrazione di botMR and Azure 312: Bot integration ✔️✔️ ✔️✔️

Nota

Sebbene questo corso sia incentrato principalmente su HoloLens, è anche possibile applicare le informazioni apprese in questo corso agli auricolari per la realtà mista (VR) di 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. Poiché le cuffie immersive (VR) non hanno fotocamere accessibili, sarà necessaria una fotocamera esterna connessa al PC.Because immersive (VR) headsets do not have accessible cameras, you will need an external camera connected to your PC. Seguendo le istruzioni riportate in questo corso, vengono visualizzate le note sulle eventuali modifiche che potrebbero essere necessarie per supportare gli auricolari immersivi (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.

PrerequisitiPrerequisites

Nota

Questa esercitazione è progettata per gli sviluppatori che hanno esperienza di base con Unity e C#.This tutorial is designed for developers who have basic experience with Unity and C#. Tenere inoltre presente che i prerequisiti e le istruzioni scritte in questo documento rappresentano gli elementi testati e verificati al momento della stesura (luglio 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). È possibile utilizzare il software più recente, come indicato nell'articolo installare gli strumenti , ma non si presuppone che le informazioni in questo corso corrispondano perfettamente a quelle disponibili nel software più recente rispetto a quanto indicato di seguito.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.

Per questo corso è consigliabile usare i componenti hardware e software seguenti:We recommend the following hardware and software for this course:

Prima di iniziareBefore you start

  1. Per evitare che si verifichino problemi durante la compilazione di questo progetto, è consigliabile creare il progetto indicato in questa esercitazione in una cartella radice o quasi radice (i percorsi di cartella lunghi possono causare problemi in fase di compilazione).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. Configurare e testare il HoloLens.Set up and test your HoloLens. Se è necessario supporto per la configurazione di HoloLens, vedere l'articolo relativo alla configurazione di HoloLens.If you need support setting up your HoloLens, make sure to visit the HoloLens setup article.
  3. Quando si inizia a sviluppare una nuova app HoloLens, è consigliabile eseguire la taratura e l'ottimizzazione dei sensori, a volte può essere utile per eseguire queste attività per ogni utente.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).

Per informazioni sulla calibrazione, seguire questo collegamento all'articolo relativo alla calibrazione di HoloLens.For help on Calibration, please follow this link to the HoloLens Calibration article.

Per informazioni sull'ottimizzazione dei sensori, seguire questo collegamento all'articolo relativo all'ottimizzazione del sensore HoloLens.For help on Sensor Tuning, please follow this link to the HoloLens Sensor Tuning article.

Capitolo 1-creare l'applicazione botChapter 1 – Create the Bot application

Il primo passaggio consiste nel creare il bot come applicazione Web ASP.Net Core locale.The first step is to create your bot as a local ASP.Net Core Web application. Una volta completato e testato, sarà possibile pubblicarlo nel portale di Azure.Once you have finished and tested it, you will publish it to the Azure Portal.

  1. Aprire Visual Studio.Open Visual Studio. Creare un nuovo progetto, selezionare applicazione Web ASP NET Core come tipo di progetto (sarà presente nella sottosezione .NET Core) e denominarlo 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. Fare clic su OK.Click OK.

  2. Nella finestra che verrà visualizzata selezionare vuoto.In the Window that will appear select Empty. Assicurarsi anche che la destinazione sia impostata su ASP NET Core 2,0 e che l'autenticazione sia impostata su Nessuna autenticazione.Also make sure the target is set to ASP NET Core 2.0 and the Authentication is set to No Authentication. Fare clic su OK.Click OK.

    Creare l'applicazione bot

  3. La soluzione verrà aperta.The solution will now open. Fare clic con il pulsante destro del mouse su soluzione Mybot nel Esplora soluzioni e fare clic su Gestisci pacchetti NuGet per la soluzione.Right-click on Solution Mybot in the Solution Explorer and click on Manage NuGet Packages for Solution.

    Creare l'applicazione bot

  4. Nella scheda Sfoglia cercare Microsoft. bot. Builder. Integration. AspNet. Core (assicurarsi di includere la versione non definitiva selezionata).In the Browse tab, search for Microsoft.Bot.Builder.Integration.AspNet.Core (make sure you have Include pre-release checked). Selezionare la versione del pacchetto 4.0.1-Preview e selezionare le caselle di progetto.Select the package version 4.0.1-preview, and tick the project boxes. Quindi fare clic su Installa.Then click on Install. Sono ora installate le librerie necessarie per bot Framework V4.You have now installed the libraries needed for the Bot Framework v4. Chiudere la pagina NuGet.Close the NuGet page.

    Creare l'applicazione bot

  5. Fare clic con il pulsante destro del mouse sul progetto, MyBot, nella Esplora soluzioni e fare clic su Aggiungi | classe.Right-click on your Project, MyBot, in the Solution Explorer and click on Add | Class.

    Creare l'applicazione bot

  6. Assegnare alla classe il nome MyBot e fare clic su Aggiungi.Name the class MyBot and click on Add.

    Creare l'applicazione bot

  7. Ripetere il punto precedente per creare un'altra classe denominata ConversationContext.Repeat the previous point, to create another class named ConversationContext.

  8. Fare clic con il pulsante destro del mouse su wwwroot nel Esplora soluzioni e fare clic su Aggiungi | nuovo elemento.Right-click on wwwroot in the Solution Explorer and click on Add | New Item. Selezionare la pagina HTML (si troverà nella sottosezione Web).Select HTML Page (you will find it under the subsection Web). Denominare il file default.html.Name the file default.html. Scegliere Aggiungi.Click Add.

    Creare l'applicazione bot

  9. L'elenco di classi/oggetti nel Esplora soluzioni dovrebbe essere simile all'immagine seguente.The list of classes / objects in the Solution Explorer should look like the image below.

    Creare l'applicazione bot

  10. Fare doppio clic sulla classe ConversationContext .Double-click on the ConversationContext class. Questa classe è responsabile della conservazione delle variabili usate dal bot per mantenere il contesto della conversazione.This class is responsible for holding the variables used by the bot to maintain the context of the conversation. Questi valori del contesto di conversazione vengono mantenuti in un'istanza di questa classe, perché ogni istanza della classe MyBot verrà aggiornata ogni volta che viene ricevuta un'attività.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. Aggiungere il codice seguente alla classe:Add the following code to the class:

    namespace MyBot
    {
        public static class ConversationContext
        {
            internal static string userName;
    
            internal static string userMsg;
        }
    }
    
  11. Fare doppio clic sulla classe MyBot .Double-click on the MyBot class. Questa classe ospiterà i gestori chiamati da qualsiasi attività in ingresso dal cliente.This class will host the handlers called by any incoming activity from the customer. In questa classe verrà aggiunto il codice usato per compilare la conversazione tra il bot e il cliente.In this class you will add the code used to build the conversation between the bot and the customer. Come indicato in precedenza, un'istanza di questa classe viene inizializzata ogni volta che viene ricevuta un'attività.As mentioned earlier, an instance of this class is initialized each time an activity is received. Aggiungere il codice seguente a questa 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. Fare doppio clic sulla classe Startup .Double-click on the Startup class. Questa classe inizializza il bot.This class will initialize the bot. Aggiungere il codice seguente alla 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. Aprire il file della classe Program e verificare che il codice sia uguale a quello riportato di seguito: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. Ricordarsi di salvare le modifiche. a tale scopo, passare a file > Salva tutto, dalla barra degli strumenti nella parte superiore di Visual Studio.Remember to save your changes, to do so, go to File > Save All, from the toolbar at the top of Visual Studio.

Capitolo 2: creare il servizio Azure botChapter 2 - Create the Azure Bot Service

Ora che è stato compilato il codice per il bot, è necessario pubblicarlo in un'istanza del servizio bot app Web nel portale di 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. In questo capitolo viene illustrato come creare e configurare il servizio bot in Azure e quindi come pubblicarvi il codice.This Chapter will show you how to create and configure the Bot Service on Azure and then publish your code to it.

  1. Per prima cosa, accedere al portale di Azure ( https://portal.azure.com) .First, log in to the Azure Portal (https://portal.azure.com).

    1. Se non si dispone già di un account Azure, sarà necessario crearne uno.If you do not already have an Azure account, you will need to create one. Se si segue questa esercitazione in una classe o in una situazione di laboratorio, rivolgersi all'insegnante o a uno dei Proctor per ottenere assistenza nella configurazione del nuovo account.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. Una volta effettuato l'accesso, fare clic su Crea una risorsa nell'angolo in alto a sinistra e cercare bot app Web e premere invio.Once you are logged in, click on Create a resource in the top left corner, and search for Web App bot, and click Enter.

    Creare il servizio Azure bot

  3. La nuova pagina fornirà una descrizione del servizio bot per app Web .The new page will provide a description of the Web App Bot Service. Nella parte inferiore sinistra della pagina selezionare il pulsante Crea per creare un'associazione con il servizio.At the bottom left of this page, select the Create button, to create an association with this Service.

    Creare il servizio Azure bot

  4. Una volta fatto clic su Crea:Once you have clicked on Create:

    1. Inserire il nome desiderato per l'istanza del servizio.Insert your desired Name for this Service instance.

    2. Selezionare una Sottoscrizione.Select a Subscription.

    3. Scegliere un gruppo di risorse o crearne uno nuovo.Choose a Resource Group or create a new one. Un gruppo di risorse consente di monitorare, controllare l'accesso, effettuare il provisioning e gestire la fatturazione per una raccolta di asset di Azure.A resource group provides a way to monitor, control access, provision and manage billing for a collection of Azure assets. Si consiglia di lasciare tutti i servizi di Azure associati a un singolo progetto (ad esempio questi corsi) in un gruppo di risorse comune).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).

      Per altre informazioni sui gruppi di risorse di Azure, vedere il collegamento seguente.If you wish to read more about Azure Resource Groups, please follow this link

    4. Determinare il percorso del gruppo di risorse (se si sta creando un nuovo gruppo di risorse).Determine the Location for your resource group (if you are creating a new Resource Group). Il percorso dovrebbe trovarsi idealmente nell'area in cui verrà eseguita l'applicazione.The location would ideally be in the region where the application would run. Alcune risorse di Azure sono disponibili solo in determinate aree geografiche.Some Azure assets are only available in certain regions.

    5. Selezionare il piano tariffario appropriato. se è la prima volta che si crea un servizio bot app Web , è necessario che sia disponibile un livello gratuito (denominato F0)Select the Pricing Tier appropriate for you, if this is the first time creating a Web App Bot Service, a free tier (named F0) should be available to you

    6. Il nome dell'app può essere semplicemente lasciato lo stesso nome del bot.App name can just be left the same as the Bot name.

    7. Lasciare il modello bot come Basic (C#).Leave the Bot template as Basic (C#).

    8. Il piano/percorso di servizio app deve essere stato compilato automaticamente per l'account.App service plan/Location should have been auto-filled for your account.

    9. Impostare l' archiviazione di Azure che si vuole usare per ospitare il bot.Set the Azure Storage that you wish to use to host your Bot. Se non ne è già disponibile uno, è possibile crearlo qui.If you dont have one already, you can create it here.

    10. Sarà inoltre necessario confermare di aver compreso i termini e le condizioni applicati a questo servizio.You will also need to confirm that you have understood the Terms and Conditions applied to this Service.

    11. Fare clic su Crea.Click Create.

      Creare il servizio Azure bot

  5. Una volta fatto clic su Crea, sarà necessario attendere il completamento della creazione del servizio. l'operazione potrebbe richiedere un minuto.Once you have clicked on Create, you will have to wait for the Service to be created, this might take a minute.

  6. Dopo la creazione dell'istanza del servizio, verrà visualizzata una notifica nel portale.A notification will appear in the Portal once the Service instance is created.

    Creare il servizio Azure bot

  7. Fare clic sulla notifica per esplorare la nuova istanza del servizio.Click on the notification to explore your new Service instance.

    Creare il servizio Azure bot

  8. Fare clic sul pulsante Vai alla risorsa nella notifica per esplorare la nuova istanza del servizio.Click the Go to resource button in the notification to explore your new Service instance. Si verrà portati alla nuova istanza del servizio Azure.You will be taken to your new Azure Service instance.

    Creare il servizio Azure bot

  9. A questo punto è necessario configurare una funzionalità denominata Direct Line per consentire all'applicazione client di comunicare con questo servizio bot.At this point you need to setup a feature called Direct Line to allow your client application to communicate with this Bot Service. Fare clic su canali, quindi nella sezione Aggiungi un canale in primo piano fare clic su Configura canale linea diretta.Click on Channels, then in the Add a featured channel section, click on Configure Direct Line channel.

    Creare il servizio Azure bot

  10. In questa pagina sono disponibili le chiavi segrete che consentiranno all'app client di eseguire l'autenticazione con il bot.In this page you will find the Secret keys that will allow your client app to authenticate with the bot. Fare clic sul pulsante Mostra per eseguire una copia di una delle chiavi visualizzate, perché sarà necessario in un secondo momento nel progetto.Click on the Show button and take a copy of one of the displayed Keys, as you will need this later in your project.

    Creare il servizio Azure bot

Capitolo 3: pubblicare il bot nel servizio bot app Web di AzureChapter 3 – Publish the Bot to the Azure Web App Bot Service

Ora che il servizio è pronto, è necessario pubblicare il codice bot, che è stato compilato in precedenza, per il servizio bot app Web appena creato.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.

Nota

Sarà necessario pubblicare il bot nel servizio di Azure ogni volta che si apportano modifiche al codice o alla soluzione bot.You will have to publish your Bot to the Azure Service every time you make changes to the Bot solution / code.

  1. Tornare alla soluzione di Visual Studio creata in precedenza.Go back to your Visual Studio Solution that you created previously.

  2. Fare clic con il pulsante destro del mouse sul progetto MyBot , nel Esplora soluzioni, quindi fare clic su pubblica.Right-click on your MyBot project, in the Solution Explorer, then click on Publish.

    Pubblicare il bot nel servizio bot app Web di Azure

  3. Nella pagina selezionare una destinazione di pubblicazione fare clic su servizio app, quindi selezionare esistente, infine fare clic su Crea profilo . se non è visibile, potrebbe essere necessario fare clic sulla freccia a discesa insieme al pulsante pubblica .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).

    Pubblicare il bot nel servizio bot app Web di Azure

  4. Se non si è ancora connessi all'account Microsoft, è necessario eseguire questa operazione qui.If you are not yet logged in into your Microsoft Account, you have to do it here.

  5. Nella pagina pubblica si noterà che è necessario impostare la stessa sottoscrizione usata per la creazione del servizio bot per app 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. Impostare quindi la vista come gruppo di risorse e nella struttura di cartelle a discesa selezionare il gruppo di risorse creato in precedenza.Then set the View as Resource Group and, in the drop down folder structure, select the Resource Group you have created previously. Fare clic su OK.Click OK.

    Pubblicare il bot nel servizio bot app Web di Azure

  6. A questo punto fare clic sul pulsante pubblica e attendere che il bot venga pubblicato. potrebbero essere necessari alcuni minuti.Now click on the Publish button, and wait for the Bot to be published (it might take a few minutes).

    Pubblicare il bot nel servizio bot app Web di Azure

Capitolo 4: configurare il progetto UnityChapter 4 – Set up the Unity project

Di seguito è riportata una configurazione tipica per lo sviluppo con realtà mista e, di conseguenza, un modello valido per altri progetti.The following is a typical set up for developing with mixed reality, and as such, is a good template for other projects.

  1. Aprire Unity e fare clic su New.Open Unity and click New.

    Configurare il progetto Unity

  2. A questo punto sarà necessario specificare un nome di progetto Unity.You will now need to provide a Unity project name. Inserire il bot HoloLens.Insert HoloLens Bot. Verificare che il modello di progetto sia impostato su 3D.Make sure the project template is set to 3D. Impostare il percorso su un punto appropriato (ricordare che più vicino alle directory radice è migliore).Set the Location to somewhere appropriate for you (remember, closer to root directories is better). Fare quindi clic su Crea progetto.Then, click Create project.

    Configurare il progetto Unity

  3. Con Unity aperto, vale la pena controllare che l' editor di script predefinito sia impostato su Visual Studio.With Unity open, it is worth checking the default Script Editor is set to Visual Studio. Passare a Modifica preferenze > e quindi dalla nuova finestra passare a strumenti esterni.Go to Edit > Preferences and then from the new window, navigate to External Tools. Modificare l' editor di script esterno in Visual Studio 2017.Change External Script Editor to Visual Studio 2017. Chiudere la finestra delle Preferenze .Close the Preferences window.

    Configurare il progetto Unity

  4. Passare quindi a File > impostazioni di compilazione e selezionare piattaforma UWP (Universal Windows Platform), quindi fare clic sul pulsante Cambia piattaforma per applicare la selezione.Next, go to File > Build Settings and select Universal Windows Platform, then click on the Switch Platform button to apply your selection.

    Configurare il progetto Unity

  5. Sempre in File > impostazioni di compilazione e verificare che:While still in File > Build Settings and make sure that:

    1. Il dispositivo di destinazione è impostato su HoloLensTarget Device is set to HoloLens

      Per gli auricolari immersivi, impostare dispositivo di destinazione su qualsiasi dispositivo.For the immersive headsets, set Target Device to Any Device.

    2. Il tipo di compilazione è impostato su D3DBuild Type is set to D3D

    3. SDK è impostato sull' ultima versione installataSDK is set to Latest installed

    4. La versione di Visual Studio è impostata su installazione più recenteVisual Studio Version is set to Latest installed

    5. Compilazione ed esecuzione è impostato su computer localeBuild and Run is set to Local Machine

    6. Salvare la scena e aggiungerla alla compilazione.Save the scene and add it to the build.

      1. A tale scopo, selezionare Aggiungi scene aperte.Do this by selecting Add Open Scenes. Verrà visualizzata una finestra Salva.A save window will appear.

        Configurare il progetto Unity

      2. Creare una nuova cartella per questo e per eventuali scenari futuri, quindi selezionare il pulsante nuova cartella per creare una nuova cartella , assegnarle un nome.Create a new folder for this, and any future, scene, then select the New folder button, to create a new folder, name it Scenes.

        Configurare il progetto Unity

      3. Aprire la cartella Scenes appena creata e quindi nel campo nome file: testo digitare BotScene e quindi fare clic su Salva.Open your newly created Scenes folder, and then in the File name: text field, type BotScene, then click on Save.

        Configurare il progetto Unity

    7. Le impostazioni rimanenti, nelle impostazioni di compilazione, devono essere lasciate come predefinite per il momento.The remaining settings, in Build Settings, should be left as default for now.

  6. Nella finestra impostazioni di compilazione fare clic sul pulsante Impostazioni lettore . verrà aperto il pannello correlato nello spazio in cui si trova il controllo .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.

    Configurare il progetto Unity

  7. In questo pannello è necessario verificare alcune impostazioni:In this panel, a few settings need to be verified:

    1. Nella scheda altre impostazioni :In the Other Settings tab:

      1. La versione di runtime di scripting deve essere sperimentale (equivalente alla rete 4,6); per modificare questa operazione, è necessario riavviare l'editor.Scripting Runtime Version should be Experimental (NET 4.6 Equivalent); changing this will require a restart of the Editor.

      2. Il back-end di scripting deve essere .NETScripting Backend should be .NET

      3. Il livello di compatibilità API deve essere .NET 4,6API Compatibility Level should be .NET 4.6

        Configurare il progetto Unity

    2. Nella scheda impostazioni di pubblicazione , in funzionalità, selezionare:Within the Publishing Settings tab, under Capabilities, check:

      • InternetClientInternetClient

      • MicrofonoMicrophone

        Configurare il progetto Unity

    3. Nella parte inferiore del pannello, nelle impostazioni di XR (disponibili sotto le impostazioni di pubblicazione), verificare la realtà virtuale supportata, verificare che sia stato aggiunto Windows Mixed Reality SDK .Further down the panel, in XR Settings (found below Publish Settings), tick Virtual Reality Supported, make sure the Windows Mixed Reality SDK is added.

      Configurare il progetto Unity

  8. Nelle impostazioni di compilazione i progetti C# non sono più disattivati; Selezionare la casella di controllo accanto a questo.Back in Build Settings Unity C# Projects is no longer greyed out; tick the checkbox next to this.

  9. Chiudere la finestra Build Settings (Impostazioni di compilazione).Close the Build Settings window.

  10. Salvare la scena e il progetto (file > Salva scena/file > Salva progetto).Save your scene and project (FILE > SAVE SCENE / FILE > SAVE PROJECT).

Capitolo 5-configurazione della fotocameraChapter 5 – Camera setup

Importante

Se si vuole ignorare il componente di configurazione di Unity di questo corso e continuare direttamente con il codice, è possibile scaricare questo Azure-Mr-312-Package. file unitypackage Tools, importarlo nel progetto come pacchetto personalizzatoe continuare dal capitolo 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. Nel Pannello gerarchia selezionare la fotocamera principale.In the Hierarchy panel, select the Main Camera.

  2. Una volta selezionato, sarà possibile visualizzare tutti i componenti della fotocamera principale nel Pannello di controllo.Once selected, you will be able to see all the components of the Main Camera in the Inspector panel.

    1. L' oggetto fotocamera deve essere denominato Main camera (nota l'ortografia)The Camera object must be named Main Camera (note the spelling)
    2. Il tag della fotocamera principale deve essere impostato su MainCamera (annotare l'ortografia)The Main Camera Tag must be set to MainCamera (note the spelling)
    3. Assicurarsi che la posizione di trasformazione sia impostata su 0, 0, 0Make sure the Transform Position is set to 0, 0, 0
    4. Impostare Cancella flag su colore a tinta unita.Set Clear Flags to Solid Color.
    5. Imposta il colore di sfondo del componente della fotocamera su nero, alfa 0 (codice esadecimale: #00000000)Set the Background Color of the Camera component to Black, Alpha 0 (Hex Code: #00000000)

    Configurazione della fotocamera

Capitolo 6: importare la libreria NewtonsoftChapter 6 – Import the Newtonsoft library

Per semplificare la deserializzazione e la serializzazione degli oggetti ricevuti e inviati al servizio bot, è necessario scaricare la libreria Newtonsoft .To help you deserialize and serialize objects received and sent to the Bot Service you need to download the Newtonsoft library. È disponibile una versione compatibile già organizzata con la struttura di cartelle Unity corretta.You will find a compatible version already organized with the correct Unity folder structure here.

Per importare la libreria Newtonsoft nel progetto, usare il pacchetto Unity fornito con questo corso.To import the Newtonsoft library into your project, use the Unity Package which came with this course.

  1. Aggiungere il file unitypackage Tools a Unity usando l'opzione di menu Asset > Import Package > Custom Package .Add the .unitypackage to Unity by using the Assets > Import Package > Custom Package menu option.

    Importare la libreria Newtonsoft

  2. Nella casella Importa pacchetto Unity visualizzata verificare che siano selezionati tutti gli elementi in (e inclusi) plug -in.In the Import Unity Package box that pops up, ensure everything under (and including) Plugins is selected.

    Importare la libreria Newtonsoft

  3. Fare clic sul pulsante Importa per aggiungere gli elementi al progetto.Click the Import button to add the items to your project.

  4. Passare alla cartella Newtonsoft in plug -in nella visualizzazione del progetto e selezionare il plug-in Newtonsoft.Go to the Newtonsoft folder under Plugins in the project view and select the Newtonsoft plugin.

  5. Con il plug-in Newtonsoft selezionato, verificare che qualsiasi piattaforma sia deselezionata, quindi verificare che WSAPlayer sia deselezionata, quindi fare clic su applica.With the Newtonsoft plugin selected, ensure that Any Platform is unchecked, then ensure that WSAPlayer is also unchecked, then click Apply. Questa operazione è sufficiente per verificare che i file siano configurati correttamente.This is just to confirm that the files are configured correctly.

    Nota

    Contrassegnando questi plug-in, questi vengono configurati per essere usati solo nell'editor di Unity.Marking these plugins configures them to only be used in the Unity Editor. Nella cartella WSA è presente un set diverso che verrà usato dopo l'esportazione del progetto da Unity.There are a different set of them in the WSA folder which will be used after the project is exported from Unity.

  6. Successivamente, è necessario aprire la cartella WSA , all'interno della cartella Newtonsoft .Next, you need to open the WSA folder, within the Newtonsoft folder. Viene visualizzata una copia dello stesso file appena configurato.You will see a copy of the same file you just configured. Selezionare il file e quindi nel controllo verificare cheSelect the file, and then in the inspector, ensure that

    • Qualsiasi piattaforma è deselezionataAny Platform is unchecked
    • Verifica solo WSAPlayeronly WSAPlayer is checked
    • Il processo non è selezionatoDont process is checked

Capitolo 7: creare il BotTagChapter 7 – Create the BotTag

  1. Creare un nuovo oggetto tag denominato BotTag.Create a new Tag object called BotTag. Selezionare la fotocamera principale nella scena.Select the Main Camera in the scene. Fare clic sul menu a discesa Tag nel pannello Inspector.Click on the Tag drop down menu in the Inspector panel. Fare clic su Aggiungi tag.Click on Add Tag.

    Configurazione della fotocamera

  2. Fare clic sul + simbolo.Click on the + symbol. Denominare il nuovo tag come BotTag, Save.Name the new Tag as BotTag, Save.

    Configurazione della fotocamera

Avviso

Non applicare BotTag alla fotocamera principale.Do not apply the BotTag to the Main Camera. Se questa operazione è stata eseguita accidentalmente, assicurarsi di modificare di nuovo il tag della fotocamera principale in MainCamera.If you have accidentally done this, make sure to change the Main Camera tag back to MainCamera.

Capitolo 8: creare la classe BotObjectsChapter 8 – Create the BotObjects class

Il primo script che è necessario creare è la classe BotObjects , che è una classe vuota creata in modo che una serie di altri oggetti classe possa essere archiviata nello stesso script e accessibile da altri script nella scena.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.

La creazione di questa classe è puramente una scelta di architettura. questi oggetti possono invece essere ospitati nello script bot che verrà creato più avanti in questo corso.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.

Per creare questa classe:To create this class:

  1. Fare clic con il pulsante destro del mouse nel Pannello del progetto, quindi creare > cartella.Right-click in the Project panel, then Create > Folder. Denominare gli script della cartella.Name the folder Scripts.

    Crea cartella script.

  2. Fare doppio clic sulla cartella script per aprirla.Double-click on the Scripts folder to open it. Quindi, all'interno di tale cartella, fare clic con il pulsante destro del mouse e scegliere crea > script C#.Then within that folder, right-click, and select Create > C# Script. Denominare lo script BotObjects.Name the script BotObjects.

  3. Fare doppio clic sul nuovo script BotObjects per aprirlo con Visual Studio.Double-click on the new BotObjects script to open it with Visual Studio.

  4. Eliminare il contenuto dello script e sostituirlo con il codice seguente: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. Assicurarsi di salvare le modifiche in Visual Studio prima di tornare a Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Capitolo 9: creare la classe GazeInputChapter 9 – Create the GazeInput class

La classe successiva che si intende creare è la classe GazeInput .The next class you are going to create is the GazeInput class. Questa classe è responsabile di:This class is responsible for:

  • Creazione di un cursore che rappresenterà lo sguardo del lettore.Creating a cursor that will represent the gaze of the player.
  • Rilevamento degli oggetti colpiti dallo sguardo del lettore e mantenimento di un riferimento agli oggetti rilevati.Detecting objects hit by the gaze of the player, and holding a reference to detected objects.

Per creare questa classe:To create this class:

  1. Passare alla cartella Scripts creata in precedenza.Go to the Scripts folder you created previously.

  2. Fare clic con il pulsante destro del mouse all'interno della cartella, creare > script C#.Right-click inside the folder, Create > C# Script. Chiamare lo script GazeInput.Call the script GazeInput.

  3. Fare doppio clic sul nuovo script GazeInput per aprirlo con Visual Studio.Double-click on the new GazeInput script to open it with Visual Studio.

  4. Inserire la riga seguente direttamente sopra il nome della 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. Aggiungere quindi le variabili seguenti all'interno della classe GazeInput , sopra il metodo 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. È necessario aggiungere il codice per il metodo Start () .Code for Start() method should be added. Questa operazione verrà chiamata quando la classe inizializza:This will be called when the class initializes:

        /// <summary>
        /// Start method used upon initialization.
        /// </summary>
        internal virtual void Start()
        {
            FocusedObject = null;
            Cursor = CreateCursor();
        }
    
  7. Implementare un metodo che creerà un'istanza e configurerà il cursore di sguardi: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. Implementare i metodi per la configurazione di Raycast dalla fotocamera principale e per tenere traccia dell'oggetto attivo corrente.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. Assicurarsi di salvare le modifiche in Visual Studio prima di tornare a Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Capitolo 10: creare la classe botChapter 10 – Create the Bot class

Lo script che si intende creare è denominato bot.The script you are going to create now is called Bot. Questa è la classe principale dell'applicazione, che archivia:This is the core class of your application, it stores:

  • Credenziali bot dell'app WebYour Web App Bot credentials
  • Metodo che raccoglie i comandi vocali dell'utenteThe method that collects the user voice commands
  • Metodo necessario per avviare conversazioni con il bot dell'app WebThe method necessary to initiate conversations with your Web App Bot
  • Metodo necessario per inviare messaggi al bot dell'app WebThe method necessary to send messages to your Web App Bot

Per inviare messaggi al servizio bot, la coroutine SendMessageToBot () compilerà un'attività, ovvero un oggetto riconosciuto da bot Framework come dati inviati dall'utente.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.

Per creare questa classe:To create this class:

  1. Fare doppio clic sulla cartella Scripts per aprirla.Double-click on the Scripts folder, to open it.

  2. Fare clic con il pulsante destro del mouse nella cartella Scripts , quindi scegliere Crea > script C#.Right-click inside the Scripts folder, click Create > C# Script. Assegnare un nome al bot di script.Name the script Bot.

  3. Fare doppio clic sul nuovo script per aprirlo con Visual Studio.Double-click on the new script to open it with Visual Studio.

  4. Aggiornare gli spazi dei nomi in modo che siano uguali a quelli riportati di seguito, nella parte superiore della 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. All'interno della classe bot aggiungere le variabili seguenti: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;
    

    Nota

    Assicurarsi di inserire la chiave privata bot nella variabile botSecret .Make sure you insert your Bot Secret Key into the botSecret variable. Si noterà che la chiave privata del bot è stata annotata all'inizio di questo corso, nel capitolo 2, passaggio 10.You will have noted your Bot Secret Key at the beginning of this course, in Chapter 2, step 10.

  6. È necessario aggiungere il codice per sveglie () e Start () .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. Aggiungere i due gestori chiamati dalle librerie vocali quando l'acquisizione vocale inizia e termina.Add the two handlers that are called by the speech libraries when voice capture begins and ends. Il DictationRecognizer arresterà automaticamente l'acquisizione della voce utente quando l'utente smette di parlare.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. Il gestore seguente raccoglie il risultato dell'input vocale dell'utente e chiama la coroutine responsabile dell'invio del messaggio al servizio bot dell'app 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. La seguente coroutine viene chiamata per avviare una conversazione con il bot.The following coroutine is called to begin a conversation with the Bot. Si noterà che, al termine della chiamata di conversazione, viene chiamato SendMessageToCoroutine () passando una serie di parametri che imposteranno l'attività da inviare al servizio bot come messaggio vuoto.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. Questa operazione viene eseguita per richiedere al servizio bot di avviare il dialogo.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. La seguente coroutine viene chiamata per compilare l'attività da inviare al servizio 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. La seguente coroutine viene chiamata per richiedere una risposta dopo l'invio di un'attività al servizio 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. L'ultimo metodo da aggiungere a questa classe è necessario per visualizzare il messaggio nella scena: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;
        }
    

    Nota

    È possibile che venga visualizzato un errore nella console dell'editor di Unity, in cui manca la classe SceneOrganiser .You may see an error within the Unity Editor Console, about missing the SceneOrganiser class. Ignorare questo messaggio, in quanto la classe verrà creata più avanti nell'esercitazione.Disregard this message, as you will create this class later in the tutorial.

  13. Assicurarsi di salvare le modifiche in Visual Studio prima di tornare a Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Capitolo 11: creare la classe di interazioniChapter 11 – Create the Interactions class

La classe che si intende creare ora è chiamata interazioni.The class you are going to create now is called Interactions. Questa classe viene usata per rilevare l'input di HoloLens Tap dall'utente.This class is used to detect the HoloLens Tap Input from the user.

Se l'utente tocca osservando l'oggetto bot nella scena e il bot è pronto per l'ascolto degli input vocali, l'oggetto bot cambierà il colore in rosso e inizierà ad ascoltare gli input vocali.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.

Questa classe eredita dalla classe GazeInput ed è quindi in grado di fare riferimento al metodo Start () e alle variabili da tale classe, identificate dall'uso di 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.

Per creare questa classe:To create this class:

  1. Fare doppio clic sulla cartella Scripts per aprirla.Double-click on the Scripts folder, to open it.

  2. Fare clic con il pulsante destro del mouse nella cartella Scripts , quindi scegliere Crea > script C#.Right-click inside the Scripts folder, click Create > C# Script. Denominare le interazioni dello script.Name the script Interactions.

  3. Fare doppio clic sul nuovo script per aprirlo con Visual Studio.Double-click on the new script to open it with Visual Studio.

  4. Aggiornare gli spazi dei nomi e l'ereditarietà della classe in modo che corrispondano a quanto riportato di seguito, nella parte superiore della classe Interactions :Update the namespaces and the class inheritance to be the same as the following, at the top of the Interactions class:

    using UnityEngine.XR.WSA.Input;
    
    public class Interactions : GazeInput
    {
    
  5. All'interno della classe Interactions aggiungere la variabile seguente:Inside the Interactions class add the following variable:

        /// <summary>
        /// Allows input recognition with the HoloLens
        /// </summary>
        private GestureRecognizer _gestureRecognizer;
    
  6. Aggiungere quindi il metodo 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. Aggiungere il gestore che verrà attivato quando l'utente esegue il gesto Tap davanti alla fotocamera 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. Assicurarsi di salvare le modifiche in Visual Studio prima di tornare a Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Capitolo 12: creare la classe SceneOrganiserChapter 12 – Create the SceneOrganiser class

L'ultima classe richiesta in questo Lab è denominata SceneOrganiser.The last class required in this Lab is called SceneOrganiser. Questa classe imposta la scena a livello di codice, aggiungendo componenti e script alla fotocamera principale e creando gli oggetti appropriati nella scena.This class will setup the scene programmatically, by adding components and scripts to the Main Camera, and creating the appropriate objects in the scene.

Per creare questa classe:To create this class:

  1. Fare doppio clic sulla cartella Scripts per aprirla.Double-click on the Scripts folder, to open it.

  2. Fare clic con il pulsante destro del mouse nella cartella Scripts , quindi scegliere Crea > script C#.Right-click inside the Scripts folder, click Create > C# Script. Denominare lo script SceneOrganiser.Name the script SceneOrganiser.

  3. Fare doppio clic sul nuovo script per aprirlo con Visual Studio.Double-click on the new script to open it with Visual Studio.

  4. All'interno della classe SceneOrganiser aggiungere le variabili seguenti: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. Aggiungere quindi i metodi svegli () e Start () :Then add the Awake() and Start() methods:

        /// <summary>
        /// Called on Initialization
        /// </summary>
        private void Awake()
        {
            Instance = this;
        }
    
        /// <summary>
        /// Called immediately after Awake method
        /// </summary>
        void Start ()
        {
            // Add the GazeInput class to this object
            gameObject.AddComponent<GazeInput>();
    
            // Add the Interactions class to this object
            gameObject.AddComponent<Interactions>();
    
            // Create the Bot in the scene
            CreateBotInScene();
        }
    
  6. Aggiungere il metodo seguente, responsabile della creazione dell'oggetto bot nella scena e della configurazione dei parametri e dei componenti: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. Aggiungere il metodo seguente, responsabile della creazione dell'oggetto dell'interfaccia utente nella scena, che rappresenta le risposte dal 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. Assicurarsi di salvare le modifiche in Visual Studio prima di tornare a Unity.Be sure to save your changes in Visual Studio before returning to Unity.

  9. Nell'editor di Unity trascinare lo script SceneOrganiser dalla cartella Scripts alla fotocamera principale.In the Unity Editor, drag the SceneOrganiser script from the Scripts folder to the Main Camera. Il componente dell'organizzatore della scena dovrebbe essere ora visualizzato nell'oggetto principale della fotocamera, come illustrato nell'immagine seguente.The Scene Organiser component should now appear on the Main Camera object, as shown in the image below.

    Creare il servizio Azure bot

Capitolo 13: prima della compilazioneChapter 13 – Before building

Per eseguire un test completo dell'applicazione, è necessario sideload nel HoloLens.To perform a thorough test of your application you will need to sideload it onto your HoloLens. Prima di procedere, verificare quanto segue:Before you do, ensure that:

  • Tutte le impostazioni indicate nel capitolo 4 sono impostate correttamente.All the settings mentioned in the Chapter 4 are set correctly.
  • Lo script SceneOrganiser è associato all'oggetto principale della fotocamera .The script SceneOrganiser is attached to the Main Camera object.
  • Nella classe bot verificare di aver inserito la chiave privata bot nella variabile botSecret .In the Bot class, make sure you have inserted your Bot Secret Key into the botSecret variable.

Capitolo 14: compilare e sideload in HoloLensChapter 14 – Build and Sideload to the HoloLens

Tutti gli elementi necessari per la sezione Unity di questo progetto sono stati completati, quindi è giunto il momento di compilarli da Unity.Everything needed for the Unity section of this project has now been completed, so it is time to build it from Unity.

  1. Passare a impostazioni di compilazione, file > impostazioni di compilazione....Navigate to Build Settings, File > Build Settings….

  2. Nella finestra impostazioni di compilazione fare clic su Compila.From the Build Settings window, click Build.

    Compilazione dell'app da Unity

  3. Se non è già stato fatto, è necessario che i progetti C# Unity.If not already, tick Unity C# Projects.

  4. Fare clic su Compila.Click Build. Unity avvierà una finestra di Esplora file , in cui è necessario creare e quindi selezionare una cartella in cui compilare l'app.Unity will launch a File Explorer window, where you need to create and then select a folder to build the app into. Creare la cartella adesso e denominarla app.Create that folder now, and name it App. Quindi, con la cartella dell' app selezionata, fare clic su Seleziona cartella.Then with the App folder selected, click Select Folder.

  5. Unity inizierà a compilare il progetto nella cartella dell' app .Unity will begin building your project to the App folder.

  6. Una volta completata la compilazione di Unity (potrebbe richiedere del tempo), verrà aperta una finestra Esplora file nella posizione della compilazione (controllare la barra delle applicazioni, perché potrebbe non essere sempre visualizzata sopra le finestre, ma verrà inviata una notifica sull'aggiunta di una nuova finestra).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).

Capitolo 15: distribuire in HoloLensChapter 15 – Deploy to HoloLens

Per eseguire la distribuzione in HoloLens:To deploy on HoloLens:

  1. È necessario l'indirizzo IP del HoloLens (per la distribuzione remota) e per assicurarsi che il HoloLens sia in modalità sviluppatore.You will need the IP Address of your HoloLens (for Remote Deploy), and to ensure your HoloLens is in Developer Mode. Per eseguire questa operazione:To do this:

    1. Quando si indossa il HoloLens, aprire le Impostazioni.Whilst wearing your HoloLens, open the Settings.
    2. Passare a rete & Internet > Wi-Fi > opzioni avanzateGo to Network & Internet > Wi-Fi > Advanced Options
    3. Prendere nota dell'indirizzo IPv4 .Note the IPv4 address.
    4. Quindi, tornare a Settings (impostazioni) e quindi aggiornare & Security > per gli sviluppatoriNext, navigate back to Settings, and then to Update & Security > For Developers
    5. Impostare la modalità di sviluppo su.Set Developer Mode On.
  2. Passare alla nuova compilazione Unity (cartella app ) e aprire il file della soluzione con Visual Studio.Navigate to your new Unity build (the App folder) and open the solution file with Visual Studio.

  3. Nella configurazione della soluzione selezionare debug.In the Solution Configuration select Debug.

  4. Nella piattaforma soluzione selezionare x86, computer remoto.In the Solution Platform, select x86, Remote Machine.

    Distribuire la soluzione da Visual Studio.

  5. Passare al menu Compila e fare clic su Distribuisci soluzione per sideload l'applicazione in HoloLens.Go to the Build menu and click on Deploy Solution, to sideload the application to your HoloLens.

  6. L'app verrà visualizzata nell'elenco delle app installate nella HoloLens, pronta per l'avvio.Your app should now appear in the list of installed apps on your HoloLens, ready to be launched!

    Nota

    Per eseguire la distribuzione in un dispositivo headset immersivo, impostare la piattaforma della soluzione su computer locale e impostare la configurazione su debug, con x86 come piattaforma.To deploy to immersive headset, set the Solution Platform to Local Machine, and set the Configuration to Debug, with x86 as the Platform. Quindi eseguire la distribuzione nel computer locale, usando il menu Compila, selezionando Distribuisci soluzione.Then deploy to the local machine, using the Build menu, selecting Deploy Solution.

Capitolo 16: uso dell'applicazione in HoloLensChapter 16 – Using the application on the HoloLens

  • Una volta avviata l'applicazione, il bot viene visualizzato come una sfera blu davanti all'utente.Once you have launched the application, you will see the Bot as a blue sphere in front of you.

  • Usare il gesto Tap mentre si sta guardando la sfera per avviare una conversazione.Use the Tap Gesture while you are gazing at the sphere to initiate a conversation.

  • Attendere l'avvio della conversazione (l'interfaccia utente visualizzerà un messaggio quando si verifica).Wait for the conversation to start (The UI will display a message when it happens). Una volta ricevuto il messaggio introduttivo dal bot, toccare di nuovo sul bot in modo che diventi rosso e inizi ad ascoltare la voce.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.

  • Una volta terminata la conversazione, l'applicazione invierà il messaggio al bot e si riceverà immediatamente una risposta che verrà visualizzata nell'interfaccia utente.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.

  • Ripetere il processo per inviare altri messaggi al bot (è necessario toccare ogni volta che si desidera un messaggio).Repeat the process to send more messages to your Bot (you have to tap each time you want to sen a message).

In questa conversazione viene illustrato come il bot può conservare le informazioni (il nome), fornendo anche informazioni note, ad esempio gli elementi che sono disponibili.This conversation demonstrates how the Bot can retain information (your name), whilst also providing known information (such as the items that are stocked).

Domande per chiedere al bot:Some questions to ask the Bot:

what do you sell? 

how much are umbrellas?

how much are raincoats?

Applicazione bot (v4) per app Web completataYour finished Web App Bot (v4) application

Congratulazioni, è stata creata un'app per realtà mista che sfrutta il bot app Web di Azure, Microsoft bot Framework V4.Congratulations, you built a mixed reality app that leverages the Azure Web App Bot, Microsoft Bot Framework v4.

Prodotto finale

Esercizi aggiuntiviBonus exercises

Esercizio 1Exercise 1

La struttura di conversazione in questo Lab è molto semplice.The conversation structure in this Lab is very basic. Usare Microsoft LUIS per offrire al bot funzionalità di comprensione del linguaggio naturale.Use Microsoft LUIS to give your bot natural language understanding capabilities.

Esercizio 2Exercise 2

Questo esempio non include la terminazione di una conversazione e il riavvio di un nuovo.This example does not include terminating a conversation and restarting a new one. Per completare la funzionalità bot, provare a implementare la chiusura per la conversazione.To make the Bot feature complete, try to implement closure to the conversation.