27个版本 (16个重大更改)

0.17.0 2024年8月17日
0.16.3 2024年7月14日
0.12.0 2024年3月13日
0.5.1 2023年12月25日
0.1.0 2023年2月4日

#93 in 游戏开发

Download history 95/week @ 2024-05-04 205/week @ 2024-05-11 80/week @ 2024-05-18 24/week @ 2024-05-25 21/week @ 2024-06-01 25/week @ 2024-06-08 24/week @ 2024-06-15 35/week @ 2024-06-22 15/week @ 2024-06-29 445/week @ 2024-07-06 233/week @ 2024-07-13 42/week @ 2024-07-20 89/week @ 2024-07-27 89/week @ 2024-08-03 116/week @ 2024-08-10 178/week @ 2024-08-17

每月476次 下载
用于 lightyear_examples_common

MIT/Apache

2MB
37K SLoC

Lightyear

crates.io docs.rs codecov

一个用于使用Bevy编写服务器权威多玩家游戏的库。通过WebTransport兼容wasm。

https://github.com/cBournhonesque/lightyear/assets/8112632/7b57d48a-d8b0-4cdd-a16f-f991a394c852

使用一个服务器和2个客户端的演示。实体在控制客户端上被预测(略微领先于服务器),在另一个客户端上被插值(略微落后于服务器)。服务器每秒只向客户端发送更新10次,但客户端仍然看到平滑的更新。

入门

您首先可以查看示例

要快速入门,您可以遵循这个教程,它重新创建了simple_box示例。

您还可以在这个WIP书中找到更多信息。

特性

人体工程学

Lightyear 提供了一个简单的API来发送和接收消息,以及复制实体和组件

  • 用户需要定义一个共享协议,该协议定义了所有可以通过网络发送的 MessagesComponentsInputs,以及要使用的 Channels
// messages
app.add_message::<Message1>(ChannelDirection::Bidirectional);

// inputs
app.add_plugins(InputPlugin::<Inputs>::default());

// components
app.register_component::<PlayerId>(ChannelDirection::ServerToClient)
    .add_prediction(ComponentSyncMode::Once)
    .add_interpolation(ComponentSyncMode::Once);
    
// channels
app.add_channel::<Channel1>(ChannelSettings {
    mode: ChannelMode::OrderedReliable(ReliableSettings::default()),
    ..default()
});
  • 为了启用复制,用户只需将 Replicate 包添加到需要复制的实体上。
  • 所有网络相关的事件都可以通过bevy的Events访问:例如EventReader<MessageEvent<MyMessage>>或者EventReader<EntitySpawnEvent>
  • 我提供了一定数量的bevy Resources来与库交互(例如InputManagerConnectionManagerTickManager等)

内置功能

  • 传输无关:Lightyear使用一个非常通用的Transport trait在网络中发送原始数据。该trait目前有几个实现
    • UDP套接字
    • WebTransport(使用QUIC):在原生和wasm上均可用!
    • WebSocket:在原生和wasm上均可用!
    • Steam:使用SteamWorks SDK通过Steam网络发送消息
  • 序列化
    • Lightyear使用bincode作为默认的序列化器,但你也可以提供自己的序列化函数
  • 消息传递
    • Lightyear支持通过通道发送具有不同顺序和可靠性保证的数据包。
    • 支持数据包分片(对于大于~1200字节的消息)
  • 输入处理
    • Lightyear对玩家输入(鼠标点击、键盘)有特殊处理。它们在每个tick都会在Client上缓冲,并且Lightyear确保客户端在tick N上的输入将在服务器上tick N时被处理。输入受到数据包丢失的保护:每个数据包都将包含最后几个帧的客户端输入。
    • 使用leafwing功能,有一个与leafwing-input-manager的特别集成,其中你的leafwing输入被自动网络化!
  • 世界复制
    • 具有Replicate组件的实体将被自动复制到客户端。只有更改的组件才会通过网络发送。此功能与bevy_replicon提供的功能类似。
  • 高级复制
    • 客户端预测:只需一行代码即可启用客户端预测并回滚,这样你的输入就可以感觉更加灵敏。
    • 快照插值:只需一行代码即可启用快照插值,即使复制频率不高,实体也可以平滑插值。
    • 客户端授权复制:您还可以将实体从客户端复制到服务器。实体的控制权可以在客户端和服务器之间转移。
    • 预先生成预测实体:您可以在客户端首先生成预测实体,然后将控制权转移到服务器。这确保了实体可以立即生成,但仍将由服务器控制。
    • 实体映射:Lightyear还支持复制包含对其他实体引用的组件/消息。实体将从本地World映射到远程World。
    • 兴趣管理:Lightyear支持仅将World的一部分复制到客户端。通过使用Rooms,兴趣管理变得更加灵活。
    • 输入延迟:您可以为输入延迟添加自定义的数量,以在更灵敏的游戏和更多预测错误之间做出权衡。
    • 带宽管理:您可以为连接设置带宽上限。然后,消息将以优先级递减的顺序(您可以自行设置)发送,并采用优先级累积方案。
  • 可配置
    • Lightyear非常可配置:您可以选择输入缓冲区的大小、插值延迟的量、数据包发送速率等。所有配置都可通过ClientConfigServerConfig结构体访问。
  • 可观察性
    • Lightyear 使用 tracingmetrics 库来在大多数事件周围发出跨度(发送/接收消息等)。这些度量可以导出到 Prometheus 进行分析。
  • 示例
    • Lightyear 有大量示例演示所有这些功能,以及与其他 bevy 软件包(如 bevy_xpbd_2d)的集成。

支持的 bevy 版本

Lightyear Bevy
0.16-0.17 0.14
0.10-0.15 0.13
0.1-0.9 0.12

依赖项

~45–91MB
~1.5M SLoC