Unity
Esta página é uma tradução do inglês. Se as duas diferirem, a página em inglês é a correta. Ler a página em inglês
Lingara.Embed é um pacote NuGet sobre o núcleo de jogador do Lingara. Contém a biblioteca nativa de cada uma das cinco plataformas que os kits de jogador suportam: Windows, macOS, Linux, Android e iOS.
Instalar o pacote
O Unity não lê pacotes NuGet por si só, por isso instale primeiro o NuGetForUnity. Depois, adicione Lingara.Embed a Assets/packages.config, como abaixo. O NuGetForUnity restaura o pacote e coloca a biblioteca nativa de cada plataforma onde o Unity a espera.
O componente de exemplo abaixo, LingaraEmbedBehaviour, não faz parte do pacote: coloque o seu código-fonte no seu projeto, adicione-o a um GameObject e ouça os seus eventos C#. Cria o cliente quando acorda e liberta-o quando é destruído, quando o jogo termina e antes de o editor recarregar os seus scripts.
Obter tokens do seu servidor
O pacote nunca guarda um segredo. Quando o cliente precisa de um token, indica-o com um evento TokenNeeded. O componente responde-lhe com uma corrotina que faz um pedido à rota de tokens do seu próprio servidor, que emite com um kit de servidor e responde com o token e a sua validade. Se o seu servidor não puder responder, chame TokenUnavailable para que as chamadas que aguardam um token falhem de imediato em vez de esgotarem o tempo limite.
Esvaziar os eventos em Update
O núcleo executa a sua E/S de rede no seu próprio thread. Em Update, o componente esvazia o que chegou desde o último frame, no máximo 256 eventos por frame, e despacha cada um: um pedido de token, uma resposta de NPC em streaming (consulte Diálogo com NPC), uma atualização da prática (consulte resultados da prática), um evento sobre o jogador ou uma falha.
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;
}
}
}