Lingara Lingara 文档 学习指南 API 库 应用 构建 嵌入 网页版
语言: 中文简体

Bevy

本页译自英文。如两者有出入,以英文页面为准。 阅读英文页面

bevy_lingara 是构建在 Lingara 玩家核心之上的 Bevy 插件。把它添加到你的应用中,告诉它如何向你的服务器获取令牌,然后像读取普通的 Bevy Message 一样读取 Lingara 发送的内容。

添加插件

把这个 crate 添加到你的游戏中,然后把 LingaraPlugin 添加到你的应用中,并传入一个 LingaraConfig。

从你的服务器获取令牌

插件从不持有密钥。当它需要令牌时,会向你自己的服务器请求,服务器用服务器工具包签发一个令牌,并返回令牌及其过期时间。

有两种响应方式。常见情况下,把你的服务器的令牌路由以及你的会话所需的任何请求头交给配置,插件会替你调用它。或者不设置路由,自己响应每一条 LingaraTokenNeeded Message,用 ProvideToken 作答,使用你的游戏已有的任何登录方式。

每帧读取一次事件

核心在自己的线程上执行网络 I/O,从不调用你的代码。插件每帧清空一次它的队列,把到达的内容转换成 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);
    }
}