using UnityEngine; using Mirror; using Steamworks; public class LobbyHandle : MonoBehaviour { private NetworkManager networkManager; public GameObject hostButton; protected Callback lobbyCreated; protected Callback gameLobbyJoinRequested; protected Callback lobbyEnter; private const string hostAddressKey = "hostAddress"; private void Start() { networkManager = GetComponent(); if (!SteamManager.Initialized) { Debug.LogError("Steamworks not initialized"); return; } lobbyCreated = Callback.Create(OnLobbyCreated); gameLobbyJoinRequested = Callback.Create(OnGameLobbyJoinRequested); lobbyEnter = Callback.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); } }