Lingara Lingara 說明文件 學習指南 API 函式庫 App 建立 嵌入 網頁版
語言: 客家話

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