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;
}
}
}