Unity
Deze pagina is vertaald uit het Engels. Als de twee verschillen, is de Engelse pagina juist. Lees de Engelse pagina
Lingara.Embed is een NuGet-pakket bovenop de spelerkern van Lingara. Het bevat de native bibliotheek voor elk van de vijf platforms die de spelerkits ondersteunen: Windows, macOS, Linux, Android en iOS.
Het pakket installeren
Unity leest NuGet-pakketten niet uit zichzelf, dus installeer eerst NuGetForUnity. Voeg daarna Lingara.Embed toe aan Assets/packages.config, zoals hieronder. NuGetForUnity herstelt het pakket en zet de native bibliotheek van elk platform waar Unity die verwacht.
Het voorbeeldcomponent hieronder, LingaraEmbedBehaviour, maakt geen deel uit van het pakket: zet de broncode ervan in je project, plaats het op een GameObject en luister naar de C#-events ervan. Het maakt de client aan wanneer het ontwaakt en ruimt hem op wanneer het wordt vernietigd, wanneer de game afsluit en voordat de editor je scripts opnieuw laadt.
Tokens van je server krijgen
Het pakket bewaart nooit een secret. Wanneer de client een token nodig heeft, meldt hij dat met een TokenNeeded-event. Het component beantwoordt dat met een coroutine die een POST doet naar de tokenroute van je eigen server, die het token uitgeeft met een serverkit en antwoordt met het token en de vervaltijd. Als je server niet kan antwoorden, roep dan TokenUnavailable aan, zodat de aanroepen die op een token wachten meteen mislukken in plaats van te verlopen.
Events leeghalen in Update
De kern voert zijn netwerk-I/O uit op een eigen thread. In Update haalt het component leeg wat er sinds het vorige frame is binnengekomen, maximaal 256 events per frame, en verwerkt elk: een tokenverzoek, een gestreamd NPC-antwoord (zie NPC-dialoog), een oefenupdate (zie oefenresultaten), een event over de speler, of een mislukking.
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;
}
}
}