Unity
Ukurasa huu umetafsiriwa kutoka Kiingereza. Ikiwa hizi mbili zinatofautiana, ukurasa wa Kiingereza ndio sahihi. Soma ukurasa wa Kiingereza
Lingara.Embed ni kifurushi cha NuGet juu ya kiini cha mchezaji cha Lingara. Kinabeba maktaba ya native kwa kila moja ya mifumo mitano ambayo vifurushi vya mchezaji vinaiunga mkono: Windows, macOS, Linux, Android na iOS.
Sakinisha kifurushi
Unity haisomi vifurushi vya NuGet yenyewe, kwa hivyo sakinisha NuGetForUnity kwanza. Kisha ongeza Lingara.Embed kwenye Assets/packages.config, kama ilivyo hapa chini. NuGetForUnity hurejesha kifurushi na huweka maktaba ya native ya kila mfumo mahali Unity inapoitarajia.
Kijenzi (component) cha mfano kilicho hapa chini, LingaraEmbedBehaviour, si sehemu ya kifurushi: weka msimbo wake chanzo kwenye mradi wako, kiweke kwenye GameObject, na usikilize matukio yake ya C#. Huunda mteja kinapoamka na humtupa kinapoharibiwa, mchezo unapofungwa, na kabla kihariri hakijapakia upya hati zako.
Pata tokeni kutoka kwa seva yako
Kifurushi hakishikilii siri kamwe. Mteja anapohitaji tokeni, husema hivyo kwa tukio la TokenNeeded. Kijenzi hulijibu kwa coroutine inayotuma kwa njia ya tokeni (token route) ya seva yako mwenyewe, ambayo hutengeneza tokeni kwa kifurushi cha seva na kujibu kwa tokeni na muda wake wa kuisha. Ikiwa seva yako haiwezi kujibu, ita TokenUnavailable ili miito inayosubiri tokeni ishindwe mara moja badala ya kuisha muda.
Maliza matukio ndani ya Update
Kiini huendesha I/O yake ya mtandao kwenye thread yake yenyewe. Ndani ya Update, kijenzi humaliza kilichowasili tangu fremu iliyopita, hadi matukio 256 kwa fremu, na hupeleka kila moja: ombi la tokeni, jibu la NPC linalotiririshwa (tazama mazungumzo ya NPC), sasisho la mazoezi (tazama matokeo ya mazoezi), tukio kuhusu mchezaji, au kushindwa.
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;
}
}
}