12个版本 (破坏性更改)
0.9.0 | 2024年7月4日 |
---|---|
0.8.2 | 2024年5月28日 |
0.6.0 | 2024年2月23日 |
1189 in 游戏开发
53 每月下载量
在bevy_replicon_attributes中使用
39KB
450 行
Bevy Replicon Repair
本crate扩展了bevy_replicon
,添加了客户端重新连接处理,以便客户端复制状态可以在重新连接时持续存在。
如果没有这个crate,当客户端断开连接时,您需要手动清理客户端上的所有bevy_replicon
复制的实体,因为这些实体将在重新连接时作为新实体复制。
重新连接处理
本crate不是重新连接处理的完整解决方案。如果客户端和服务器事件(直接消息)在断开连接时或之后发送,可能会失败。这意味着在断开连接后,任何与服务器事件(或与客户端发送事件到达服务器的预期)相关的客户端可能具有过时的状态。通常,您希望服务器向刚连接的客户端发送“初始化”消息,以传输客户端无法从复制中接收到的任何内容。
就客户端架构而言,您通常希望在等待所有初始化(或重新初始化)状态到达时将客户端置于加载屏幕中,以便用户无法与不完整的世界交互。您可以使用ServerInitTick
上的更改检测来检测服务器第一条复制消息的到达,并可以手动跟踪预期初始化消息的到达。
请注意,renet不支持自动重新连接。要重新连接客户端,您需要从服务器/后端获取一个全新的连接令牌,然后重新创建renet客户端和传输资源。
使用方法
注册用于复制的组件
我们将bevy_replicon
的组件注册API AppRuleExt
封装在我们自己的应用扩展AppReplicationRepairExt
中。
包装的API允许您定义一个自定义的'组件移除函数',该函数将在重新连接后的第一次服务器复制消息后调用客户端实体。该函数应移除在重新连接后未能复制的任何复制注册的组件。我们提供了一个默认函数 repair_component
,其行为符合您的预期。
以下是使用默认组件注册的示例
#[derive(Component)]
struct Health(usize);
fn setup_replication(app: &mut App)
{
// bevy_replicon equivalent: `app.replicate::<Health>();`
app.replicate_repair::<Health>();
}
请注意,如果您已经使用 bevy_replicon
的API注册了组件,您可以使用 add_replication_repair_fn
添加复制修复。
如果存在 ParentSyncPlugin
,则默认注册 bevy_replicon
组件 ParentSync
进行修复。
客户端
客户端必须包含 ClientPlugin
。
客户端插件包括一个 cleanup_prespawns
选项,用于 bevy_replicon
的客户端实体预映射功能的使用者。有关更多详细信息,请参阅文档。
fn setup_client(app: &mut App)
{
setup_replication(app); //replicate Health
app.insert_plugins(ClientPlugin{ cleanup_prespawns: true });
}
服务器
服务器必须包含 ServerPlugin
。
fn setup_server(app: &mut App)
{
setup_replication(app); //replicate Health
app.insert_plugins(ServerPlugin);
}
bevy_replicon
兼容性
bevy_replicon |
bevy_replicon_repair |
---|---|
0.27 | 0.9 - master |
0.26 | 0.8 |
0.25 | 0.7 |
0.23 | 0.5 |
0.21 | 0.4 |
0.19 | 0.1 - 0.3 |
依赖关系
~40–78MB
~1.5M SLoC