Unity
Tämä sivu on käännetty englannista. Jos ne eroavat toisistaan, englanninkielinen sivu on oikea. Lue englanninkielinen sivu
Lingara.Embed on NuGet-paketti Lingaran pelaajaytimen päällä. Se sisältää natiivikirjaston jokaiselle viidestä alustasta, joita pelaajapaketit tukevat: Windows, macOS, Linux, Android ja iOS.
Asenna paketti
Unity ei lue NuGet-paketteja itsestään, joten asenna ensin NuGetForUnity. Lisää sitten Lingara.Embed tiedostoon Assets/packages.config alla olevan mallin mukaan. NuGetForUnity palauttaa paketin ja sijoittaa kunkin alustan natiivikirjaston sinne, missä Unity sitä odottaa.
Alla oleva esimerkkikomponentti, LingaraEmbedBehaviour, ei kuulu pakettiin: lisää sen lähdekoodi projektiisi, liitä se GameObjectiin ja kuuntele sen C#-tapahtumia. Se luo asiakkaan herätessään ja vapauttaa sen, kun se tuhotaan, kun peli suljetaan ja ennen kuin editori lataa skriptisi uudelleen.
Hae tunnukset palvelimeltasi
Paketti ei koskaan säilytä salaisuutta. Kun asiakas tarvitsee tunnuksen, se ilmoittaa siitä tapahtumalla TokenNeeded. Komponentti vastaa siihen korutiinilla, joka lähettää pyynnön oman palvelimesi tunnusreitille; palvelin luo tunnuksen palvelinpaketilla ja vastaa tunnuksella ja sen vanhenemisajalla. Jos palvelimesi ei pysty vastaamaan, kutsu TokenUnavailable, jotta tunnusta odottavat kutsut epäonnistuvat heti sen sijaan, että ne aikakatkaistaisiin.
Tyhjennä tapahtumat Updatessa
Ydin suorittaa verkko-I/O:nsa omassa säikeessään. Komponentti tyhjentää kohdassa Update sen, mitä on saapunut edellisen ruudunpäivityksen jälkeen, enintään 256 tapahtumaa ruudunpäivitystä kohden, ja välittää kunkin eteenpäin: tunnuspyynnön, virtautetun NPC-vastauksen (katso NPC-dialogit), harjoittelun päivityksen (katso harjoittelun tulokset), pelaajaa koskevan tapahtuman tai virheen.
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;
}
}
}