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 游戏开发
每月476次 下载
用于 lightyear_examples_common
2MB
37K SLoC
Lightyear
一个用于使用Bevy编写服务器权威多玩家游戏的库。通过WebTransport兼容wasm。
https://github.com/cBournhonesque/lightyear/assets/8112632/7b57d48a-d8b0-4cdd-a16f-f991a394c852
使用一个服务器和2个客户端的演示。实体在控制客户端上被预测(略微领先于服务器),在另一个客户端上被插值(略微落后于服务器)。服务器每秒只向客户端发送更新10次,但客户端仍然看到平滑的更新。
入门
您首先可以查看示例。
要快速入门,您可以遵循这个教程,它重新创建了simple_box示例。
您还可以在这个WIP书中找到更多信息。
特性
人体工程学
Lightyear 提供了一个简单的API来发送和接收消息,以及复制实体和组件
- 用户需要定义一个共享协议,该协议定义了所有可以通过网络发送的
Messages
、Components
、Inputs
,以及要使用的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
来与库交互(例如InputManager
,ConnectionManager
,TickManager
等)
内置功能
- 传输无关:Lightyear使用一个非常通用的Transport trait在网络中发送原始数据。该trait目前有几个实现
- UDP套接字
- WebTransport(使用QUIC):在原生和wasm上均可用!
- WebSocket:在原生和wasm上均可用!
- Steam:使用SteamWorks SDK通过Steam网络发送消息
- 序列化
- Lightyear使用
bincode
作为默认的序列化器,但你也可以提供自己的序列化函数
- Lightyear使用
- 消息传递
- Lightyear支持通过通道发送具有不同顺序和可靠性保证的数据包。
- 支持数据包分片(对于大于~1200字节的消息)
- 输入处理
- Lightyear对玩家输入(鼠标点击、键盘)有特殊处理。它们在每个tick都会在
Client
上缓冲,并且Lightyear确保客户端在tickN
上的输入将在服务器上tickN
时被处理。输入受到数据包丢失的保护:每个数据包都将包含最后几个帧的客户端输入。 - 使用
leafwing
功能,有一个与leafwing-input-manager
的特别集成,其中你的leafwing
输入被自动网络化!
- Lightyear对玩家输入(鼠标点击、键盘)有特殊处理。它们在每个tick都会在
- 世界复制
- 具有
Replicate
组件的实体将被自动复制到客户端。只有更改的组件才会通过网络发送。此功能与bevy_replicon提供的功能类似。
- 具有
- 高级复制
- 客户端预测:只需一行代码即可启用客户端预测并回滚,这样你的输入就可以感觉更加灵敏。
- 快照插值:只需一行代码即可启用快照插值,即使复制频率不高,实体也可以平滑插值。
- 客户端授权复制:您还可以将实体从客户端复制到服务器。实体的控制权可以在客户端和服务器之间转移。
- 预先生成预测实体:您可以在客户端首先生成预测实体,然后将控制权转移到服务器。这确保了实体可以立即生成,但仍将由服务器控制。
- 实体映射:Lightyear还支持复制包含对其他实体引用的组件/消息。实体将从本地World映射到远程World。
- 兴趣管理:Lightyear支持仅将World的一部分复制到客户端。通过使用
Rooms
,兴趣管理变得更加灵活。 - 输入延迟:您可以为输入延迟添加自定义的数量,以在更灵敏的游戏和更多预测错误之间做出权衡。
- 带宽管理:您可以为连接设置带宽上限。然后,消息将以优先级递减的顺序(您可以自行设置)发送,并采用优先级累积方案。
- 可配置
- Lightyear非常可配置:您可以选择输入缓冲区的大小、插值延迟的量、数据包发送速率等。所有配置都可通过
ClientConfig
和ServerConfig
结构体访问。
- Lightyear非常可配置:您可以选择输入缓冲区的大小、插值延迟的量、数据包发送速率等。所有配置都可通过
- 可观察性
- Lightyear 使用
tracing
和metrics
库来在大多数事件周围发出跨度(发送/接收消息等)。这些度量可以导出到 Prometheus 进行分析。
- Lightyear 使用
- 示例
- Lightyear 有大量示例演示所有这些功能,以及与其他 bevy 软件包(如
bevy_xpbd_2d
)的集成。
- Lightyear 有大量示例演示所有这些功能,以及与其他 bevy 软件包(如
支持的 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