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 在 游戏开发
161 每月下载
36KB
399 行
bevy_replicon_snap
Bevy游戏引擎中用于网络解决方案bevy_replicon
的快照插值插件。
此库是一个非常粗糙的概念验证,不适合用于生产游戏
功能
- 基本但可定制的用于复制组件的快照插值
- 客户端预测
- 拥有者预测:实体拥有者的客户端进行预测,其他客户端进行插值
在示例中,您可以找到bevy_replicon
的Simple 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,
},
))
...
插值
要允许组件进行插值,它需要实现以下特质:Interpolate
、Serialize
和Deserialize
。
此库为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