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

Download history 5/week @ 2024-04-17 1/week @ 2024-04-24 5/week @ 2024-05-01 3/week @ 2024-05-15 9/week @ 2024-05-22 1/week @ 2024-06-05 1/week @ 2024-06-26 19/week @ 2024-07-03

252 每月下载量

MIT/Apache

69KB
1.5K SLoC

bevy_rtc

MIT/Apache 2.0 crates.io docs.rs

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-serverpainting-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-clientping-server 源代码,或 提交问题

社区

所有 Loopy 项目和开发都在 Loopy Discord 中进行。Discord 对公众开放。

欢迎通过拉取请求进行贡献。适用 Rust 行为准则

许可

根据以下任一项许可

根据您的选择

贡献

除非您明确声明,否则您提交的任何有意包含在作品中的贡献(根据 Apache-2.0 许可定义),均应按上述方式双许可,不附加任何其他条款或条件。

依赖关系

~21–65MB
~1M SLoC