Unity
این صفحه از انگلیسی ترجمه شده است. اگر این دو با هم تفاوت داشته باشند، صفحهٔ انگلیسی درست است. خواندن صفحهٔ انگلیسی
Lingara.Embed یک بستهٔ NuGet است که روی هستهٔ بازیکن Lingara ساخته شده است. این بسته کتابخانهٔ بومی هر یک از پنج پلتفرمی را که کیتهای بازیکن پشتیبانی میکنند در خود دارد: Windows، macOS، Linux، Android و iOS.
نصب بسته
Unity بستههای NuGet را بهتنهایی نمیخواند، پس ابتدا NuGetForUnity را نصب کنید. سپس Lingara.Embed را مانند نمونهٔ پایین به Assets/packages.config اضافه کنید. NuGetForUnity بسته را بازیابی میکند و کتابخانهٔ بومی هر پلتفرم را همان جایی قرار میدهد که Unity انتظار دارد.
مؤلفهٔ نمونهٔ پایین، LingaraEmbedBehaviour، بخشی از بسته نیست: کد منبع آن را در پروژهٔ خود بگذارید، آن را روی یک GameObject قرار دهید و به رویدادهای C# آن گوش دهید. این مؤلفه هنگام بیدار شدن کلاینت را میسازد و هنگام نابود شدن، هنگام خروج از بازی و پیش از آنکه ویرایشگر اسکریپتهای شما را دوباره بارگذاری کند آن را آزاد میکند.
گرفتن توکن از سرور شما
بسته هرگز رمزی نگه نمیدارد. وقتی کلاینت به توکن نیاز دارد، این را با رویداد TokenNeeded اعلام میکند. مؤلفه با یک coroutine به آن پاسخ میدهد که به مسیر توکن سرور خودتان درخواست میفرستد، که با یک کیت سرور توکن صادر میکند و با توکن و زمان انقضای آن پاسخ میدهد. اگر سرور شما نتواند پاسخ دهد، TokenUnavailable را فراخوانی کنید تا فراخوانیهایی که منتظر توکن هستند بهجای تمام شدن مهلتشان فوراً شکست بخورند.
خالی کردن رویدادها در Update
هسته ورودی/خروجی شبکهٔ خود را روی رشتهٔ اجرایی خودش اجرا میکند. در Update، مؤلفه آنچه را از فریم قبل رسیده خالی میکند، حداکثر 256 رویداد در هر فریم، و هر کدام را توزیع میکند: یک درخواست توکن، یک پاسخ جریانی NPC (نگاه کنید به گفتوگوی NPC)، یک بهروزرسانی تمرین (نگاه کنید به نتایج تمرین)، رویدادی دربارهٔ بازیکن، یا یک شکست.
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;
}
}
}