#p2p #bevy #veilid #game #turnbased

nightly bevy_veilid

使用Veilid构建回合制P2P游戏

4个版本 (2个破坏性版本)

0.4.0 2024年7月9日
0.3.0 2024年5月7日
0.1.2 2023年11月9日
0.1.0 2023年11月6日

#407游戏开发

Download history 138/week @ 2024-05-06 6/week @ 2024-05-20 4/week @ 2024-06-10 116/week @ 2024-07-08 2/week @ 2024-07-15 52/week @ 2024-07-29

每月170次下载

Apache-2.0 和可能 GPL-3.0-only

220KB
546 代码行

bevy_veilid

Crates.io MIT/Apache 2.0 Crates.io Rust

使用Bevy和Veilid构建2人回合制P2P游戏

在Veilid的帮助下,构建具有匿名性的客户端的回合制P2P游戏。

https://github.com/stillonearth/bevy_veilid/assets/97428129/4c505eef-1dee-4ab4-b0e7-51262a3b3337

兼容性

Bevy版本 Veilid版本 bevy_veilid版本
0.11 0.2.4 0.1.0
0.11 0.2.5 0.1.2
0.12 0.3 0.2
0.13 0.3.2 0.3
0.14 0.3.3 0.4

📝功能

  • 事件驱动:读取和发送事件以与其他对等方通信
  • 回合制:无需时钟同步
  • 匿名:每次运行创建一个新的身份

👩‍💻 使用方法

有关基本示例,请参阅examples/pingpong

1. 定义要通过网络发送的消息

#[derive(Serialize, Deserialize, Debug, Clone, Default, Resource)]
struct SampleMessage {
    pub counter: i32,
    pub extra: String,
}

2. 将插件附加到Bevy

fn main() {

    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(VeilidPlugin::<SampleMessage>::default())
        .add_systems(
            Update,
            (
                on_ev_veilid_initialized,
                handle_ui_state,
                on_host_game,
                on_join_game,
                on_ev_awating_peer,
                on_ev_error,
                on_ev_veilid_message,
                on_ev_connected_peer,
                on_ev_change_counter,
            ),
        )
        .run();
}

3. 连接到系统

事件

  • EventConnectedPeer
  • EventError
  • EventAwaitingPeer
  • EventVeilidInitialized
  • EventReceiveMessage<SampleMessage>
  • EventSendMessage<SampleMessage>
  • EventMessageSent

资源

bevy_veilid 将将其注入Bevy

pub enum VeilidPluginStatus {
    Initializing,
    Initialized,
    ConnectedPeer,
    AwaitingPeer,
    Error,
}

💻 内部机制

完整的Veilid实例将在后台运行,设置在veilid_duplex中。 veilid_duplex 管理Veilid内部,并提供一个API,通过引用每个运行的独特dht_keys将消息发送给另一个对等方。

示例

  1. 通过增加/减少传递消息
  2. 在Bevy上的国际象棋

依赖项

~33–78MB
~1.5M SLoC