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.