Unity
本頁譯自英文。如兩者有出入,以英文頁面為準。 閱讀英文頁面
Lingara.Embed 是建構在 Lingara 玩家核心之上的 NuGet 套件。它為玩家套件支援的五個平台分別附帶原生程式庫:Windows、macOS、Linux、Android 和 iOS。
安裝 NuGet 套件
Unity 本身不會讀取 NuGet 套件,所以先安裝 NuGetForUnity。然後依照下方所示,把 Lingara.Embed 加入 Assets/packages.config。NuGetForUnity 會還原該套件,並把每個平台的原生程式庫放到 Unity 預期的位置。
下方的範例元件 LingaraEmbedBehaviour 不屬於該套件:把它的原始碼放入你的專案,掛到一個 GameObject 上,並監聽它的 C# 事件。它在喚醒時建立用戶端,並在被銷毀時、遊戲結束時以及編輯器重新載入你的指令碼之前釋放用戶端。
從你的伺服器取得權杖
該套件從不持有密鑰。當用戶端需要權杖時,會透過 TokenNeeded 事件告知。元件用一個協同程式回應它,該協同程式向你自己伺服器的權杖路由傳送 POST 要求,伺服器用伺服器套件核發權杖,並回傳權杖及其到期時間。如果你的伺服器無法回應,請呼叫 TokenUnavailable,讓等待權杖的呼叫立即失敗,而不是等到逾時。
在 Update 中清空事件
核心在自己的執行緒上執行網路 I/O。在 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;
}
}
}