Azure Bot in Unity

In questo semplice tutorial vedremo come integrare un Azure Bot all'interno di una applicazione sviluppata con il motore grafico Unity.
Il risultato finale sarà il seguente:

Il codice sorgente di questo esempio è disponibile su un repository github qui.
L'esempio è come si suol dire un esempio giocattolo, ovvero vuole solo dimostrare come integrare il servizio semplicemente.
Consideriamo un Azure Bot di tipo echo, ovvero un bot che ci restituisce lo stesso messaggio da noi inviato.

Per prima cosa cominciamo con il creare la risorsa su Azure.
Collegarsi al sito portal.azure.com e selezionare Crea una risorsa.

Cercare una risorsa di tipo Web App Bot e crearla.

Durante la creazione ci vengono richieste le seguenti informazioni:

  • Handle di bot
    Rappresenta un identificatore univoco del bot che stiamo creando.
    Inseriamo _botUnity

  • Sottoscrizione
    Rappresenta la sottoscrizione da utilizzare per il bot che stiamo creando

  • Gruppo di risorse
    Rappresenta un contenitore con risorse correlate per una soluzione Azure da noi organizzato
    Creiamo un gruppo di risorse test_unity

  • Località
    Decidiamo di salvare metadati in località vicine alla nostra posizione
    Scegliamo West Europe

  • Piano tariffario
    Definisce il piano di pagamento per l'utilizzo del servizio
    Scegliamo F0

  • Nome dell'app
    È il nome del servizio web raggiungibile all'indirizzo nomeapp.azurewebsites.net
    Scegliamo botUnity

  • Modello di bot
    Sono presenti due tipi di modelli di bot che sono echo bot e basic bot entrambi disponibili con un SDK in C# o Node.js
    Scegliamo echo bot in C#

  • Piano di servizio app/località
    Un'app web viene sempre eseguita in un piano di servizio app ovvero l'insieme delle risorse per la sua esecuzione
    Creiamo un nuovo piano di servizio sempre inWest Europe

  • Application Insights
    Permette di analizzare e monitorare l'applicazioe in termini di anomalie e utilizzo da parte degli utenti
    Scegliamo di disattivarlo

Una volta creata e distribuita la risorsa è possibile testarla direttamente via web tramite il portale di Azure

La risorsa è pronta e il bot è funzionante.
Prima di terminare dobbiamo definire un nuovo canale di comunicazione di tipo Direct Line e conservare la chiave segreta che lo identifica. Vediamo ora come impostare i componenti nella scena di Unity.
Essa contiene i seguenti gameobject:

  • Camera
    È un oggetto di default della scena di Unity utile per il render

  • EventSystem
    È responsabile di elaborare e gestire gli eventi all'interno di una scena

  • Canvas
    Rappresenta la tela sulla quale sono disegnati i diversi elementi dell'interfaccia utente

  • IputField - Canvas
    È il campo di testo nel quale inseriremo il messaggio rivolto al bot su Azure

  • Output - Canvas
    È la porzione di spazio nella quale sarà mostrato il messaggio proveniente dal bot

  • Button
    È il bottone che scatena la chiamata inviando il messaggiio al bot

  • BotLogo
    È l'icona del bot che si anima durante la ricezione del messaggio

  • AzureLogo
    È il logo di Azure

  • Application Insights
    Permette di analizzare e monitorare l'applicazioe in termini di anomalie e utilizzo da parte degli utenti
    Scegliamo di disattivarlo

La logica di funzionamento è la seguente.
Quando si effettua il clic sul pulsante Button è richiamata una funzione nel code-behind che si interfaccia con l'Azure bot.
Si ottiene la risposta e la si mostra a schermo interagendo con i componenti della UI. Un oggetto Button implementa il metodo On Click().
Si noti come all'evento On Click() sia stato associato il metodo BotManager.invia.
BotManager è una classe realizzata e assegnata come componente all'oggetto Button.

Analizziamo ora la classe BotManager.
Essa utilizza la libreria Microsoft.Bot.Connector.DirectLine che implementa classi per usare il Bot Framework Direct Line tramite REST API. Per maggiori informazioni vedere qui.
Di supporto sono dichiarate tre variabili:

  • DirectLineClient client
    Rapprenta il client che effettua la richiesta al bot.
    Per prima cosa il client deve essere autenticato e lo fa durante la creazione di questo oggetto passando per parametro la chiave segreta del bot.

  • Conversation conversation
    Rappresenta la conversazione che è sempre inizializzata esplicitamente dal Client con il suo metodo Conversations.StartConversationAsync()

  • string request
    Utile per salvare il messaggio di richiesta al bot

Con il metodo Start() possiamo esplicitare ciò che deve essere effettuato non appena sono caricati tutti gli elementi della scena.
Il metodo StartBotAsync(); effettua la creazione di un DirectLineClient e l'inizio di una Conversation.

Il metodo Invia(), che è quello che è chiamato quando si preme sul bottone di invio messaggio, avvia l'animazione del bot, acquisisce il messaggio da inviargli e chiama la funzione inviaAsync()

Nel metodo inviaAsync() bisogna costruire la richiesta da parte del client.
Si crea un oggetto Activity userMessage definendo che il messaggio appartiene al canale unity_channel, il testo della richiesta è quello salvato nella variabile request e il tipo di Activity è Message.
Effettuiamo una Post al bot tramite il metodo PostActivityAsync passandogli l'id della conversazione e la relativa attività appena creata.
A questo punto ci mettiamo in ascolto di una risposta da parte del bot con il metodo GetActivityAsync salvando la risposta in una variabile activitySet. Da quest'ultima è possibile ottenere il messaggio del bot.

Tutto è pronto per essere utilizzato.
Ci vediamo al prossimo tutorial!
Non scordare di seguirmi sui canali social!
👇

Riguardo me

Mario Cuomo
Unity Student Ambassadors & Microsoft Student Ambassadors