Unity
Cette page est traduite de l'anglais. En cas de différence, la page anglaise fait foi. Lire la page en anglais
Lingara.Embed est un paquet NuGet construit sur le cœur joueur de Lingara. Il contient la bibliothèque native de chacune des cinq plateformes prises en charge par les kits joueur : Windows, macOS, Linux, Android et iOS.
Installer le paquet
Unity ne lit pas les paquets NuGet par lui-même : installez donc d’abord NuGetForUnity. Ajoutez ensuite Lingara.Embed à Assets/packages.config, comme ci-dessous. NuGetForUnity restaure le paquet et place la bibliothèque native de chaque plateforme là où Unity l’attend.
Le composant d’exemple ci-dessous, LingaraEmbedBehaviour, ne fait pas partie du paquet : déposez son code source dans votre projet, placez-le sur un GameObject et écoutez ses événements C#. Il crée le client à son réveil et le libère lorsqu’il est détruit, lorsque le jeu se ferme, et avant que l’éditeur ne recharge vos scripts.
Obtenir des jetons depuis votre serveur
Le paquet ne détient jamais de secret. Lorsque le client a besoin d’un jeton, il le signale par un événement TokenNeeded. Le composant y répond avec une coroutine qui envoie une requête à la route de jetons de votre propre serveur, qui émet le jeton avec un kit serveur et répond avec le jeton et son expiration. Si votre serveur ne peut pas répondre, appelez TokenUnavailable afin que les appels en attente d’un jeton échouent immédiatement au lieu d’expirer.
Vider les événements dans Update
Le cœur exécute ses E/S réseau sur son propre thread. Dans Update, le composant vide ce qui est arrivé depuis la dernière frame, au plus 256 événements par frame, et distribue chacun : une demande de jeton, une réponse de PNJ en flux (voir Dialogue de PNJ), une mise à jour de pratique (voir résultats de pratique), un événement concernant le joueur, ou un échec.
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;
}
}
}