Unity
這頁是對英文翻譯過來的。若兩篇無仝,以英文頁為準。 看英文頁
Lingara.Embed 是一个建立佇 Lingara 玩家核心頂懸的 NuGet 套件包。伊紮著玩家套件支援的五个平台逐个的原生函式庫:Windows、macOS、Linux、Android 佮 iOS。
安裝套件包
Unity 本身袂讀 NuGet 套件包,所以先安裝 NuGetForUnity。了後照下跤的款,共 Lingara.Embed 加入去 Assets/packages.config。NuGetForUnity 會還原套件包,閣共逐个平台的原生函式庫囥佇 Unity 期待的所在。
下跤的範例元件 LingaraEmbedBehaviour 毋是套件包的一部份:共伊的原始碼囥入去你的專案,掛佇一个 GameObject 頂懸,閣聽伊的 C# 事件。伊醒起來的時建立用戶端,佇伊予人銷毀的時、遊戲結束的時,佮編輯器重新載入你的指令碼進前,共用戶端釋放。
對你的伺服器提權杖
套件包從來袂保管密鑰。用戶端需要權杖的時,會用一个 TokenNeeded 事件講出來。元件用一个協程回應伊,送請求去你家己伺服器的權杖路由;你的伺服器用一个伺服器套件簽發,閣用權杖佮伊的到期時間來回應。若你的伺服器無法度回應,就呼叫 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;
}
}
}