#transport #networking #gamedev #multiplayer-game

renet_steam

renet crate 的 steam 传输:适用于多人游戏的服务器/客户端网络库

2 个版本

0.0.2 2024年7月20日
0.0.1 2024年2月22日

#1458 in 网络编程

Download history 1/week @ 2024-06-08 116/week @ 2024-07-20 17/week @ 2024-07-27

133 每月下载量

MIT/Apache

160KB
3K SLoC

Renet Steam

Latest version Documentation MIT Apache

使用 steamworks-rs 的 renet crate 传输层。

用法

此 crate 添加了 SteamServerTransportSteamClientTransport 以替换 renet 默认的传输层

服务器

// Setup steam client
let (steam_client, single) = Client::init_app(480).unwrap();
steam_client.networking_utils().init_relay_network_access();

// Create renet server
let connection_config = ConnectionConfig::default();
let mut server: RenetServer = RenetServer::new(connection_config);

// Create steam transport
let access_permission = AccessPermission::Public;
let steam_transport_config = SteamServerConfig {
    max_clients: 10,
    access_permission,
};
let mut steam_transport = SteamServerTransport::new(&steam_client, steam_transport_config).unwrap();

// Your gameplay loop
loop {
    let delta_time = Duration::from_millis(16);

    single.run_callbacks(); // Update steam callbacks
   
    server.update(delta_time);
    steam_transport.update(&mut server);

    // Handle connect/disconnect events
    while let Some(event) = server.get_event() {
        match event {
            ServerEvent::ClientConnected { client_id } => {
                println!("Client {} connected.", client_id)
            }
            ServerEvent::ClientDisconnected { client_id, reason } => {
                println!("Client {} disconnected: {}", client_id, reason);
            }
        }
    }

    // Code for sending/receiving messages can go here
    // Check the examples/demos 

    steam_transport.send_packets(&mut server);
    thread::sleep(delta_time);
}

客户端

// Setup steam client
let (steam_client, single) = Client::init_app(480).unwrap();
steam_client.networking_utils().init_relay_network_access();

// Create renet client
let connection_config = ConnectionConfig::default();
let mut client = RenetClient::new(connection_config);

// Create steam transport
let server_steam_id = SteamId::from_raw(0); // Here goes the steam id of the host
let mut steam_transport = SteamClientTransport::new(&steam_client, &server_steam_id).unwrap();

// Your gameplay loop
loop {
    let delta_time = Duration::from_millis(16);

    single.run_callbacks(); // Update steam callbacks
    client.update(delta_time);
    steam_transport.update(&mut client);

    // Code for sending/receiving messages can go here
    // Check the examples/demos 

    steam_transport.send_packets(&mut client).unwrap();
    thread::sleep(delta_time);
}

示例

您可以使用 steam echo 示例进行测试(steam 需要在后台运行)

  • 服务器: cargo run --example echo server
  • 客户端: cargo run --example echo client [HOST_STEAM_ID]

服务器启动时,HOST_STEAM_ID 将打印在控制台中。

您还可以使用 steam 休息室运行 echo 示例。只有连接到休息室的 steam 用户才能连接到服务器。在 echo 示例中,他们首先尝试连接到 steam 休息室,然后连接到 renet 服务器

  • 服务器: cargo run --example echo server lobby
  • 客户端: cargo run --example echo client [HOST_STEAM_ID] [LOBBY_ID]

休息室 ID 将在服务器启动时打印到控制台中。

Bevy

如果您使用 bevy,您可以使用 bevy 功能,而不是使用 bevy_renet 中的默认传输,您可以使用 SteamServerPluginSteamClientPlugin,设置应该类似。

您可以在 Bevy 示例 中查看如何使用默认和 steam 传输,并使用功能标志在它们之间切换。

依赖关系

~14–20MB
~205K SLoC