#web-rtc #bevy #networking

bevy_rtc_macros

为 Bevy 设计的基于 WebRTC 的客户端-服务器库

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 中排名

Download history 9/week @ 2024-04-15 9/week @ 2024-04-29 4/week @ 2024-05-13 15/week @ 2024-05-20 5/week @ 2024-06-03 4/week @ 2024-06-10 13/week @ 2024-07-01 61/week @ 2024-07-29

每月下载量 71
用于 bevy_rtc

MIT/Apache

9KB

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许可证中定义,应如上所述双重许可,不附加任何其他条款或条件。

依赖关系

~245–690KB
~16K SLoC