5 个不稳定版本
0.3.1 | 2024年4月11日 |
---|---|
0.3.0 | 2024年4月8日 |
0.2.0 | 2024年4月8日 |
0.1.1 | 2024年3月24日 |
0.1.0 | 2024年3月24日 |
#8 在 #webrtc
252 每月下载量
69KB
1.5K SLoC
bevy_rtc
bevy_rtc 是一个简单、多平台的 WebRTC 网络库,用于 Bevy 的客户端-服务器拓扑。
- 简单:不需要 WebRTC 知识
- 易于在网页上实现不可靠(类似 UDP)和可靠的(类似 TCP)网络
- Bevy 系统参数用于读取和写入数据包
- 推导宏用于创建协议
- 支持无界和有界缓冲区
- 轻松读取瞬时和平滑的延迟
快速入门
针对您的客户端
cargo add bevy_rtc -F client
针对您的服务器
cargo add bevy_rtc -F server
Bevy 版本支持
bevy | bevy_rtc |
---|---|
0.13 | 0.1-0.3, main |
< 0.13 | 不支持 |
Cargo 功能
所有功能都是可选的。
server
- 为服务器应用提供必要的网络功能client
- 为客户端应用提供必要的网络功能binary
- 以二进制形式发送网络数据包而不是 JSON(默认值)
[!IMPORTANT]
client
功能支持 WASM 和本地 目标。server
功能仅限 本地。服务器仅限本地,因为它是一个信令服务器(并且是其自身的第一个对等端)。虽然可以通过依赖外部 WebRTC 信令服务器实现 WASM 服务器,但(目前)WASM 类似于 JavaScript 是单线程的。如果您真的需要一个 WASM 服务器,我会接受 PR,但您可能不需要一个!
演示
提供了两个演示,一个是简单的 ping/pong 演示,另一个是绘画游戏。运行一个演示服务器,并运行任意数量的相应客户端。
- 服务器(仅限本地)
cargo run -p painting-server
- 客户端(仅限本地)
cargo run -p painting-client
- 客户端(Web)
cargo install wasm-server-runner
cd demos/painting-client
cargo run --target wasm32-unknown-unknown
说明
协议
将您的数据包定义放在共享位置。
#[derive(Payload)]
pub enum MyPacket {
Ping,
Pong
}
服务器
-
确保您的客户端具有
server
功能cargo add bevy_rtc -F server
-
将
RtcServerPlugin
添加到您的应用程序中。.add_plugins(RtcServerPlugin { port: 3536 })
-
注册您的协议为有界或无界。
- 有界协议将仅保留最近的 N 个接收到的有效载荷以供读取。
- 无界协议将使用可调整大小的缓冲区保留所有有效载荷。
仅在读取时才会由系统刷新有效载荷!
建议在服务器上保留您的协议为 有界。.// Only choose one! .add_bounded_protocol::<MyPacket>(5) // Only keep the most recent 5 payloads for reading .add_unbounded_protocol::<MyPacket>() // Keep all payloads until read
-
添加系统以读取和发送有效负载。
.add_systems( Update, |mut server: RtcServer<MyPacket>| { for (peer_id, packet) in server.read() { if let MyPacket::Ping = packet { server.reliable_to_peer(peer_id, MyPacket::Pong); } } })
需要帮助? 请参阅 ping-server 或 painting-server 源代码,或 提交问题。
客户端
-
请确保您的客户端具有
client
功能cargo add bevy_rtc -F client
-
将
RtcClientPlugin
添加到您的应用程序中。.add_plugins(RtcClientPlugin)
-
注册您的协议为有界或无界。
- 有界协议将仅保留最近的 N 个接收到的有效载荷以供读取。
- 无界协议将使用可调整大小的缓冲区保留所有有效载荷。
仅在读取时才会由系统刷新有效载荷!
建议在客户端保持协议 未限定.// Only choose one! .add_bounded_protocol::<MyPacket>(5) // Only keep the most recent 5 payloads for reading .add_unbounded_protocol::<MyPacket>() // Keep all payloads until read
-
添加系统以读取和发送有效负载。
.add_systems( Update, { |mut client: RtcClient<PingPayload>| { client.reliable_to_host(PingPayload::Ping); } } .run_if( // Only send every second, and if we are connected. on_timer(Duration::from_secs(1)).and_then( state_exists_and_equals(RtcClientStatus::Connected), ), ), ) .add_systems(Update, |mut client: RtcClient<PingPayload>| { for payload in client.read() { if let PingPayload::Pong = payload { info!("..Received pong!"); } } })
需要帮助? 请参阅 ping-client 或 ping-server 源代码,或 提交问题。
社区
所有 Loopy 项目和开发都在 Loopy Discord 中进行。Discord 对公众开放。
欢迎通过拉取请求进行贡献。适用 Rust 行为准则。
许可
根据以下任一项许可
- Apache License, Version 2.0 (LICENSE-APACHE 或 http://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
根据您的选择
贡献
除非您明确声明,否则您提交的任何有意包含在作品中的贡献(根据 Apache-2.0 许可定义),均应按上述方式双许可,不附加任何其他条款或条件。
依赖关系
~21–65MB
~1M SLoC