#interpolation #bevy-networking #snapshot #prediction #bevy #bevy-plugin #networking

bevy_replicon_snap

一个高级网络Crate,扩展了bevy_replicon crate,允许快照插值和客户端预测

5个版本

0.2.4 2024年7月21日
0.2.3 2024年6月22日
0.2.2 2024年6月22日
0.2.1 2024年3月24日
0.2.0 2024年3月9日

#304游戏开发

Download history 250/week @ 2024-06-20 13/week @ 2024-06-27 14/week @ 2024-07-04 95/week @ 2024-07-18 43/week @ 2024-07-25 22/week @ 2024-08-01 1/week @ 2024-08-08

161 每月下载

MIT 协议

36KB
399

CI crates.io

bevy_replicon_snap

Bevy游戏引擎中用于网络解决方案bevy_replicon快照插值插件。

此库是一个非常粗糙的概念验证,不适合用于生产游戏

功能

  • 基本但可定制的用于复制组件的快照插值
  • 客户端预测
    • 拥有者预测:实体拥有者的客户端进行预测,其他客户端进行插值

示例中,您可以找到bevy_repliconSimple Box示例的一个副本,共有3个版本:没有插值或预测、插值、预测。我建议您查看这些示例之间的差异,以更好地了解此插件的工作方式。

使用方法

设置

将bevy_replicon插件和此插件添加到您的bevy应用程序中。

插件需要知道最大服务器tick速率,以便估计快照之间的时间,因此需要在初始化时传入

const MAX_TICK_RATE: u16 = 30;

...

.add_plugins((
    DefaultPlugins,
    RepliconPlugins.build().set(ServerPlugin {
        tick_policy: TickPolicy::MaxTickRate(MAX_TICK_RATE),
        ..default()
    }),
    RepliconRenetPlugins,
    SnapshotInterpolationPlugin {
        max_tick_rate: MAX_TICK_RATE,
    },
))

...

插值

要允许组件进行插值,它需要实现以下特质:InterpolateSerializeDeserialize

此库为Interpolate提供了一个基本的derive宏,但对于复杂类型,您将需要自行实现。

use bevy_replicon_snap_macros::{Interpolate};

#[derive(Component, Deserialize, Serialize, Interpolate, Clone)]
struct PlayerPosition(Vec2);

接下来,您需要注册组件以进行插值

app.replicate_interpolated::<PlayerPosition>()

这也将组件注册为bevy_replicon的复制。

最后一步是将Interpolated组件添加到任何应进行插值的实体。

commands.spawn((
    PlayerPosition(Vec2::ZERO),
    Replicated,
    Interpolated,
    ...
));

客户端预测

要使用客户端预测,您需要为任何组件和事件组合实现 Predict 特性,以指定事件如何更改组件。然后,该库将使用此实现来生成相应的服务器和客户端系统,负责在客户端预测更改并确保服务器结果不同时进行纠正。上下文类型 T 可用于传递计算所需的任何上下文。

impl Predict<MoveDirection, MovementSystemContext> for PlayerPosition {
    fn apply_event(
        &mut self,
        event: &MoveDirection,
        delta_time: f32,
        context: &MovementSystemContext,
    ) {
        self.0 += event.0 * delta_time * context.move_speed;
    }
}

此外,您还需要将事件注册为预测事件,以及事件和组件组合。

app
  .replicate_interpolated::<PlayerPosition>()
  .add_client_predicted_event::<MoveDirection>(ChannelKind::Ordered)
  .predict_event_for_component::<MoveDirection, MovementSystemContext, PlayerPosition>()

最后,确保需要预测的实体具有 OwnerPredicted 组件。

commands.spawn((
    PlayerPosition(Vec2::ZERO),
    Replicated,
    OwnerPredicted,
    ...
));

替代方案

  • bevy_timewarp 一个出色的预测/回滚库,还集成了 bevy_replicon。

依赖关系

~41–77MB
~1.5M SLoC