Unity
Halaman ini diterjemahkan daripada bahasa Inggeris. Jika kedua-duanya berbeza, halaman bahasa Inggeris adalah yang betul. Baca halaman bahasa Inggeris
Lingara.Embed ialah pakej NuGet di atas teras pemain Lingara. Ia membawa pustaka asli untuk setiap satu daripada lima platform yang disokong oleh kit pemain: Windows, macOS, Linux, Android dan iOS.
Pasang pakej
Unity tidak membaca pakej NuGet dengan sendirinya, jadi pasang NuGetForUnity terlebih dahulu. Kemudian tambahkan Lingara.Embed pada Assets/packages.config, seperti di bawah. NuGetForUnity memulihkan pakej itu dan meletakkan pustaka asli setiap platform di tempat yang dijangka oleh Unity.
Komponen sampel di bawah, LingaraEmbedBehaviour, bukan sebahagian daripada pakej: letakkan sumbernya dalam projek anda, pasangkannya pada GameObject, dan dengar acara C# komponen itu. Ia mencipta klien apabila ia bangun dan melupuskannya apabila ia dimusnahkan, apabila permainan ditutup, dan sebelum editor memuat semula skrip anda.
Dapatkan token daripada pelayan anda
Pakej tidak pernah menyimpan rahsia. Apabila klien memerlukan token, ia menyatakannya dengan acara TokenNeeded. Komponen menjawabnya dengan coroutine yang menghantar ke laluan token pelayan anda sendiri, yang mencetak dengan kit pelayan dan menjawab dengan token serta tempoh tamatnya. Jika pelayan anda tidak dapat menjawab, panggil TokenUnavailable supaya panggilan yang menunggu token gagal serta-merta dan bukannya tamat masa.
Kosongkan acara dalam Update
Teras menjalankan I/O rangkaiannya pada benangnya sendiri. Dalam Update, komponen mengosongkan apa yang tiba sejak bingkai terakhir, paling banyak 256 acara satu bingkai, dan menghantar setiap satu: permintaan token, balasan NPC yang distrim (lihat dialog NPC), kemas kini latihan (lihat hasil latihan), acara tentang pemain, atau kegagalan.
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;
}
}
}