3个版本 (破坏性更新)

0.3.0 2024年7月20日
0.2.0 2024年7月10日
0.1.0 2024年7月8日

409游戏开发

Download history 240/week @ 2024-07-07 100/week @ 2024-07-14 41/week @ 2024-07-21 36/week @ 2024-07-28 4/week @ 2024-08-04

每月168次下载
用于 bevy_octopus_websocket

MIT/Apache

52KB
1K SLoC

crates.io MIT/Apache 2.0 crates.io CI Documentation

bevy_octopus

Bevy的低级别ECS驱动的网络插件。

使用方法

在Cargo.toml中添加以下内容

[dependencies]
bevy_octopus = { version = "0.3", "features" = ["serde_json", "bincode"]} # or your custom format

示例

use bevy::prelude::*;
use bevy_octopus::{
    prelude::*,
    transports::{tcp::TcpAddress, udp::UdpAddress},
};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct PlayerInformation {
    pub health: usize,
    pub position: (u32, u32, u32),
}

const TCP_CHANNEL: ChannelId = ChannelId("tcp");
const UDP_CHANNEL: ChannelId = ChannelId("udp");

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(OctopusPlugin)
        // UDP CHANNEL use json tranformer for PlayerInformation struct
        .add_transformer::<PlayerInformation, JsonTransformer>(UDP_CHANNEL)
        // TCP_CHANNEL use json tranformer for PlayerInformation struct
        .add_transformer::<PlayerInformation, BincodeTransformer>(TCP_CHANNEL)
        .add_systems(Startup, setup)
        .add_systems(Update, resend_udp_to_tcp)
        .observe(on_node_event)
        .run();
}

fn setup(mut commands: Commands) {
    // tcp client
    commands.spawn((
        NetworkBundle::new(TCP_CHANNEL),
        ClientNode(TcpAddress::new("127.0.0.1:4321")),
    ));

    // udp server
    commands.spawn((
        NetworkBundle::new(UDP_CHANNEL),
        ServerNode(UdpAddress::new("127.0.0.1:4002")),
    ));
}

pub fn on_node_event(trigger: Trigger<NetworkEvent>) {
    info!("{:?} trigger {:?}", trigger.entity(), trigger.event());
}

pub fn resend_udp_to_tcp(
    mut channel_recviced: EventReader<ReceiveChannelMessage<PlayerInformation>>,
    mut ev_send: EventWriter<SendChannelMessage<PlayerInformation>>,
) {
    for event in channel_recviced.read() {
        info!("recevice {:?}", event.message);
        if event.channel_id == UDP_CHANNEL {
            ev_send.send(SendChannelMessage {
                channel_id: TCP_CHANNEL,
                message: event.message.clone(),
            });
        }
    }
}

功能

ECS驱动的网络

每个网络节点都是一个组件,因此您可以轻松地使用Bevy ECS管理网络实体。

应用程序可以同时运行多个服务器和多个客户端。

灵活的网络协议解码器

您可以定义用于数据序列化和反序列化的通道转换器。

UDP通信类型

支持UDP 单播、广播、多播。示例

无tokio运行时

支持的网络协议

协议 服务器 客户端 带有SSL的服务器 带有SSL的客户端
UDP
TCP
WebSocket

网络组件

ServerNode ClientNode NetworkPeer
服务器
客户端
客户端会话

支持的版本

bevy bevy_octopus
0.14 0.2
0.13 0.1

许可证

此仓库中的所有代码均根据您选择的双授权

这意味着您可以选择您喜欢的许可证。

您的贡献

除非您明确表示,否则根据Apache-2.0许可证定义的,任何有意提交以包含在本作品中的贡献,都将根据上述方式进行双授权,无需任何额外的条款或条件。

依赖项

~24–65MB
~1M SLoC