Lingara Lingara 說明文件 學習指南 API 程式庫 App 建立 嵌入 網頁版
語言: 粵語

Bevy

呢頁係由英文翻譯過嚟嘅。如果兩個版本有出入,以英文頁為準。 睇英文頁

bevy_lingara 係一個建基於 Lingara 玩家核心嘅 Bevy 外掛程式。將佢加入你個 App,話畀佢知點樣去你部伺服器攞權杖,然後就好似讀取普通 Bevy Message 咁讀取 Lingara 傳過嚟嘅嘢。

加入外掛程式

將呢個 crate 加入你嘅遊戲,然後將 LingaraPlugin 加入你個 App,再傳入一個 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);
    }
}