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

Bevy

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

bevy_lingara は、Lingara のプレイヤーコア上に構築された Bevy プラグインです。アプリに追加し、トークンを得るためにあなたのサーバーへ到達する方法を伝えれば、Lingara が送るものを通常の Bevy Message として読み取れます。

プラグインを追加する

クレートをゲームに追加したら、LingaraPlugin を LingaraConfig とともにアプリに追加します。

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

プラグインはシークレットを保持しません。トークンが必要になると、プラグインはあなた自身のサーバーに要求し、サーバーは サーバーキット でトークンを発行して、トークンとその有効期限を返します。

応答する方法は 2 つあります。一般的なケースでは、設定にサーバーのトークンルートとセッションに必要なヘッダーを指定すれば、プラグインが代わりに呼び出します。あるいは、ルートを未設定のままにして、各 LingaraTokenNeeded Message に自分で ProvideToken で応答します。その際は、ゲームにすでにあるサインインの仕組みを使えます。

フレームごとに 1 回イベントを読み取る

コアはネットワーク I/O を専用のスレッドで実行し、あなたのコードを呼び出すことはありません。プラグインはフレームごとに 1 回キューを空にし、届いたものを、システムが他の Message と同じように読み取れる Message に変換します:

  • LingaraEventReceived:レッスンプランの準備が整ったなど、プレイヤーに関するイベント。
  • NpcTranscript:各キャラクターに付くコンポーネントで、返答がストリーミングされるにつれて伸びていきます(NPC との会話 を参照)。
  • PracticeFinished:練習セッションが終わったとき(練習の結果 を参照)。

フレームをブロックするものはありません。ネットワークが遅い場合は、Message が少し遅れて届くだけです。

Bevy

cargo add bevy_lingara@0.1.0-alpha.6

Bevy

/// The common case: the plugin POSTs to your own server's token route, with
/// your game's session as a header, and reads `{token, expires_at}`.
fn lingara_config(session_header: bevy_lingara::lingara_embed::Header) -> LingaraConfig {
    LingaraConfig::new()
        .token_endpoint("https://game.example.com/lingara-token", vec![session_header])
        .source_lang("en")
}

/// Or keep the session in ECS: leave the token endpoint unset, answer each
/// `LingaraTokenNeeded` with what your server returned.
fn answer_token_requests(mut needed: MessageReader<LingaraTokenNeeded>, mut provide: MessageWriter<ProvideToken>) {
    for _request in needed.read() {
        let (token, expires_at) = fetch_from_your_server();
        provide.write(ProvideToken::new(token, expires_at));
    }
}

Bevy

App::new()
    .add_plugins(DefaultPlugins)
    .add_plugins(LingaraPlugin::new(lingara_config(header)))
    .add_systems(Update, on_lingara_event)

/// The plugin drains Lingara's events once per frame: read them as Messages.
fn on_lingara_event(mut events: MessageReader<LingaraEventReceived>) {
    for LingaraEventReceived(event) in events.read() {
        info!("{}: {}", event.event_type, event.data_json);
    }
}