2 个版本
0.0.2 | 2024年7月20日 |
---|---|
0.0.1 | 2024年2月22日 |
#1458 in 网络编程
133 每月下载量
160KB
3K SLoC
Renet Steam
使用 steamworks-rs 的 renet crate 传输层。
用法
此 crate 添加了 SteamServerTransport
和 SteamClientTransport
以替换 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
中的默认传输,您可以使用 SteamServerPlugin
和 SteamClientPlugin
,设置应该类似。
您可以在 Bevy 示例 中查看如何使用默认和 steam 传输,并使用功能标志在它们之间切换。
依赖关系
~14–20MB
~205K SLoC