Files
survival-game/Assets/Scripts/LobbyHandle.cs
2025-06-16 15:14:23 +02:00

72 lines
2.1 KiB
C#

using UnityEngine;
using Mirror;
using Steamworks;
public class LobbyHandle : MonoBehaviour
{
private NetworkManager networkManager;
public GameObject hostButton;
protected Callback<LobbyCreated_t> lobbyCreated;
protected Callback<GameLobbyJoinRequested_t> gameLobbyJoinRequested;
protected Callback<LobbyEnter_t> lobbyEnter;
private const string hostAddressKey = "hostAddress";
private void Start()
{
networkManager = GetComponent<NetworkManager>();
if (!SteamManager.Initialized)
{
Debug.LogError("Steamworks not initialized");
return;
}
lobbyCreated = Callback<LobbyCreated_t>.Create(OnLobbyCreated);
gameLobbyJoinRequested = Callback<GameLobbyJoinRequested_t>.Create(OnGameLobbyJoinRequested);
lobbyEnter = Callback<LobbyEnter_t>.Create(OnLobbyEnter);
}
public void HostLobby()
{
hostButton.SetActive(false);
SteamMatchmaking.CreateLobby(ELobbyType.k_ELobbyTypeFriendsOnly, networkManager.maxConnections);
}
private void OnLobbyCreated(LobbyCreated_t callback)
{
if (callback.m_eResult != EResult.k_EResultOK)
{
Debug.LogError("Failed to create lobby");
hostButton.SetActive(true);
return;
}
SteamMatchmaking.SetLobbyData(new CSteamID(callback.m_ulSteamIDLobby), hostAddressKey, SteamUser.GetSteamID().ToString());
networkManager.StartHost();
NetworkServer.SpawnObjects();
networkManager.ServerChangeScene("Game");
}
private void OnGameLobbyJoinRequested(GameLobbyJoinRequested_t callback)
{
SteamMatchmaking.JoinLobby(callback.m_steamIDLobby);
}
private void OnLobbyEnter(LobbyEnter_t callback)
{
if (NetworkServer.active)
{
return;
}
string hostAddress = SteamMatchmaking.GetLobbyData(new CSteamID(callback.m_ulSteamIDLobby), hostAddressKey);
networkManager.networkAddress = hostAddress;
networkManager.StartClient();
hostButton.SetActive(false);
}
}