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);
    }
}