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.6Bevy
/// 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);
}
}