Lingara Lingara Dokumentation Ratgeber API Bibliotheken Apps Erstellen Einbetten Web-App
Sprache: Deutsch

Unity

Diese Seite ist aus dem Englischen übersetzt. Wenn die beiden voneinander abweichen, ist die englische Seite maßgeblich. Englische Seite lesen

Lingara.Embed ist ein NuGet-Paket über dem Spieler-Kern von Lingara. Es enthält die native Bibliothek für jede der fünf Plattformen, die die Spieler-Kits unterstützen: Windows, macOS, Linux, Android und iOS.

Das Paket installieren

Unity liest NuGet-Pakete nicht von selbst, installieren Sie also zuerst NuGetForUnity. Fügen Sie dann Lingara.Embed zu Assets/packages.config hinzu, wie unten gezeigt. NuGetForUnity stellt das Paket wieder her und legt die native Bibliothek jeder Plattform dort ab, wo Unity sie erwartet.

Die Beispielkomponente unten, LingaraEmbedBehaviour, ist nicht Teil des Pakets: Legen Sie ihren Quellcode in Ihr Projekt, setzen Sie sie auf ein GameObject und hören Sie auf ihre C#-Events. Sie erstellt den Client, wenn sie aufwacht, und gibt ihn frei, wenn sie zerstört wird, wenn das Spiel beendet wird und bevor der Editor Ihre Skripte neu lädt.

Tokens von Ihrem Server erhalten

Das Paket hält nie ein Secret. Wenn der Client ein Token braucht, meldet er das mit einem TokenNeeded-Event. Die Komponente beantwortet es mit einer Coroutine, die einen POST an die Token-Route Ihres eigenen Servers sendet; dieser stellt mit einem Server-Kit aus und antwortet mit dem Token und seinem Ablaufzeitpunkt. Kann Ihr Server nicht antworten, rufen Sie TokenUnavailable auf, damit die Aufrufe, die auf ein Token warten, sofort fehlschlagen, statt in ein Timeout zu laufen.

Events in Update leeren

Der Kern führt seine Netzwerk-I/O in einem eigenen Thread aus. In Update leert die Komponente, was seit dem letzten Frame angekommen ist, höchstens 256 Events pro Frame, und verteilt jedes: eine Token-Anfrage, eine gestreamte NPC-Antwort (siehe NPC-Dialoge), eine Übungsaktualisierung (siehe Übungsergebnisse), ein Event zum Spieler oder einen Fehlschlag.

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;
        }
    }
}