Lingara Lingara 說明文件 學習指南 API 函式庫 App 建立 嵌入 網頁版
語言: 客家話

Bevy

這頁係對英文翻譯過來个。若係兩片無共樣,以英文頁為準。 看英文頁

bevy_lingara 係一隻建立在 Lingara 玩家核心頂高个 Bevy 外掛程式。將佢加入你个應用程式,同佢講愛仰般到你个伺服器拿權杖,再將 Lingara 送來个東西當做普通个 Bevy Message 來讀。

加入外掛程式

將這隻 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);
    }
}