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