Lingara Lingara ドキュメント 学習ガイド API ライブラリ アプリ 作成 埋め込み ウェブ版
言語: 日本語

Unity

このページは英語から翻訳されています。内容に相違がある場合は、英語のページが正しい内容です。 英語のページを読む

Lingara.Embed は、Lingara のプレイヤーコア上に構築された NuGet パッケージです。プレイヤーキットがサポートする 5 つのプラットフォーム、Windows、macOS、Linux、Android、iOS それぞれのネイティブライブラリを含んでいます。

パッケージをインストールする

Unity はそれだけでは NuGet パッケージを読み込まないため、まず NuGetForUnity をインストールします。次に、以下のように Lingara.Embed を Assets/packages.config に追加します。NuGetForUnity がパッケージを復元し、各プラットフォームのネイティブライブラリを Unity が想定する場所に配置します。

以下のサンプルコンポーネント LingaraEmbedBehaviour はパッケージには含まれていません。そのソースをプロジェクトに入れ、GameObject に付けて、その C# イベントをリッスンしてください。このコンポーネントは、起動時にクライアントを作成し、破棄されたとき、ゲームが終了したとき、そしてエディターがスクリプトを再読み込みする前に、クライアントを破棄します。

サーバーからトークンを取得する

パッケージはシークレットを保持しません。クライアントはトークンが必要になると、TokenNeeded イベントでそれを知らせます。コンポーネントは、あなた自身のサーバーのトークンルートに POST するコルーチンで応答し、サーバーは サーバーキット で発行して、トークンとその有効期限を返します。サーバーが応答できない場合は TokenUnavailable を呼び出してください。そうすれば、トークンを待っている呼び出しはタイムアウトを待たずにただちに失敗します。

Update でイベントを取り出す

コアはネットワーク I/O を専用のスレッドで実行します。Update の中で、コンポーネントは前のフレーム以降に届いたものを 1 フレームあたり最大 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;
        }
    }
}