72 lines
2.1 KiB
C#
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);
|
|
}
|
|
}
|