using System.Collections; using System.Collections.Generic; using Unity.Services.Authentication; using Unity.Services.Core; using Unity.Services.Lobbies.Models; using Unity.Services.Lobbies; using UnityEngine; using Unity.Netcode.Transports.UTP; using Unity.Netcode; using Unity.Services.Relay.Models; using Unity.Services.Relay; using Unity.Networking.Transport.Relay; using System; public class ConnectionManager : MonoBehaviour { public static ConnectionManager Instance { get; private set; } private void Awake() { if (Instance == null) Instance = this; } private Lobby hostLobby; private float heartbeatTimer; public async void Start() { await UnityServices.InitializeAsync(); AuthenticationService.Instance.SignedIn += () => { Debug.Log("signed in " + AuthenticationService.Instance.PlayerId); }; await AuthenticationService.Instance.SignInAnonymouslyAsync(); GameManager.Instance.Loaded(); } private void Update() { HandleLobbyHeartbeat(); } private async void HandleLobbyHeartbeat() { if (hostLobby != null) { heartbeatTimer -= Time.deltaTime; if (heartbeatTimer < 0f) { float heartbeatTimerMax = 15f; heartbeatTimer = heartbeatTimerMax; await LobbyService.Instance.SendHeartbeatPingAsync(hostLobby.Id); } } } public async void JoinLocation(Action onJoin) { try { QueryLobbiesOptions queryOptions = new QueryLobbiesOptions { Filters = new List { new QueryFilter(QueryFilter.FieldOptions.Name, "LOCATIONSñ", QueryFilter.OpOptions.EQ) } }; QueryResponse response = await LobbyService.Instance.QueryLobbiesAsync(queryOptions); if (response.Results.Count == 0) { Debug.LogError("No lobby found"); return; } Lobby lobby = response.Results[0]; Lobby joinedLobby = await LobbyService.Instance.JoinLobbyByIdAsync(lobby.Id); string joinCode = joinedLobby.Data["joinCode"].Value; JoinAllocation joinAllocation = await RelayService.Instance.JoinAllocationAsync(joinCode); RelayServerData relayServerData = new RelayServerData(joinAllocation, "dtls"); NetworkManager.Singleton.GetComponent().SetRelayServerData(relayServerData); NetworkManager.Singleton.StartClient(); onJoin?.Invoke(); } catch (LobbyServiceException ex) { Debug.Log(ex); } } public async void CreateLobby(string lobbyName, int maxPlayers, bool isPrivate, Action onCreated) { try { Allocation allocation = await RelayService.Instance.CreateAllocationAsync(maxPlayers); string joinCode = await RelayService.Instance.GetJoinCodeAsync(allocation.AllocationId); CreateLobbyOptions options = new CreateLobbyOptions { IsPrivate = isPrivate, Data = new Dictionary { { "joinCode", new DataObject(DataObject.VisibilityOptions.Member, joinCode) } } }; hostLobby = await LobbyService.Instance.CreateLobbyAsync(lobbyName, maxPlayers, options); Debug.Log(joinCode); RelayServerData relayServerData = new RelayServerData(allocation, "dtls"); NetworkManager.Singleton.GetComponent().SetRelayServerData(relayServerData); NetworkManager.Singleton.StartHost(); onCreated?.Invoke(); } catch (LobbyServiceException ex) { Debug.Log(ex); } } private async void ListLobbies() { QueryLobbiesOptions options = new QueryLobbiesOptions() { Count = 25, Filters = new List() { new QueryFilter(QueryFilter.FieldOptions.AvailableSlots, "0", QueryFilter.OpOptions.GT) }, Order = new List() { new QueryOrder(false, QueryOrder.FieldOptions.Created) } }; QueryResponse lobbies = await Lobbies.Instance.QueryLobbiesAsync(); foreach (var lobbie in lobbies.Results) { Debug.Log($"{lobbie.Name} (${lobbie.Id})"); } } private void JoinLobby() { /// LobbyService.Instance.JoinLobbyByIdAsync("tst"); } }