Lingara Lingara Documentazione Guide API Librerie App Crea Incorporare App web
Lingua: Italiano

Unity

Questa pagina è tradotta dall'inglese. Se le due versioni differiscono, fa fede la pagina in inglese. Leggi la pagina in inglese

Lingara.Embed è un pacchetto NuGet sopra il player core di Lingara. Contiene la libreria nativa per ciascuna delle cinque piattaforme supportate dai player kit: Windows, macOS, Linux, Android e iOS.

Installare il pacchetto

Unity non legge da solo i pacchetti NuGet, quindi installa prima NuGetForUnity. Poi aggiungi Lingara.Embed ad Assets/packages.config, come qui sotto. NuGetForUnity ripristina il pacchetto e colloca la libreria nativa di ogni piattaforma dove Unity se la aspetta.

Il componente di esempio qui sotto, LingaraEmbedBehaviour, non fa parte del pacchetto: aggiungi il suo sorgente al tuo progetto, mettilo su un GameObject e ascolta i suoi eventi C#. Crea il client quando si attiva e lo rilascia quando viene distrutto, quando il gioco si chiude e prima che l’editor ricarichi i tuoi script.

Ottenere i token dal tuo server

Il pacchetto non conserva mai un segreto. Quando il client ha bisogno di un token, lo segnala con un evento TokenNeeded. Il componente risponde con una coroutine che invia una richiesta alla route dei token del tuo server, che emette il token con un kit server e risponde con il token e la sua scadenza. Se il tuo server non può rispondere, chiama TokenUnavailable, così le chiamate in attesa di un token falliscono subito invece di andare in timeout.

Svuotare gli eventi in Update

Il core esegue il suo I/O di rete su un proprio thread. In Update, il componente svuota ciò che è arrivato dall’ultimo frame, al massimo 256 eventi per frame, e smista ciascuno: una richiesta di token, una risposta di un NPC in streaming (vedi Dialoghi con gli NPC), un aggiornamento della pratica (vedi risultati della pratica), un evento che riguarda il giocatore o un errore.

Unity

<?xml version="1.0" encoding="utf-8"?>
<!-- Assets/packages.config, after installing NuGetForUnity: it restores Lingara.Embed and places each platform's native library. -->
<packages>
  <package id="Lingara.Embed" version="0.1.0-alpha.6" manuallyInstalled="true" />
</packages>

Unity

[Serializable]
private struct Handoff { public string token; public string expires_at; }

// Your own server mints the token: never put a client secret in a game.
private IEnumerator FetchToken()
{
    using (var request = UnityWebRequest.PostWwwForm(tokenUrl, string.Empty))
    {
        yield return request.SendWebRequest();
        if (Client == null) yield break;
        if (request.result != UnityWebRequest.Result.Success)
        {
            Client.TokenUnavailable(request.error); // fail the waiting calls now
            yield break;
        }
        var handoff = JsonUtility.FromJson<Handoff>(request.downloadHandler.text);
        Client.ProvideToken(handoff.token, handoff.expires_at);
    }
}

Unity

private void Update()
{
    if (Client == null) return;
    events.Clear();
    Client.Drain(events); // at most 256 a frame; the rest wait for the next
    foreach (var e in events)
    {
        switch (e)
        {
            case EmbedEvent.TokenNeeded _: StartCoroutine(FetchToken()); break;
            case EmbedEvent.NpcTurn turn: NpcTurn?.Invoke(turn); break;
            case EmbedEvent.Practice practice: Practice?.Invoke(practice); break;
            case EmbedEvent.LingaraReceived received: LingaraReceived?.Invoke(received); break;
            case EmbedEvent.Failed failed: Failed?.Invoke(failed); break;
            case EmbedEvent.Log log: Debug.Log($"[lingara] {log.Level} {log.Target}: {log.Message}"); break;
        }
    }
}