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 日 |
144 在 #web-rtc 中排名
每月下载量 71
用于 bevy_rtc
9KB
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,版本2.0 (LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一
贡献
除非您明确声明,否则您有意提交给作品的所有贡献,如Apache-2.0许可证中定义,应如上所述双重许可,不附加任何其他条款或条件。
依赖关系
~245–690KB
~16K SLoC