Загрузка данных
using UnityEngine;
using Unity.Netcode;
using Unity.Services.Core;
using Unity.Services.Authentication;
using Unity.Services.Relay;
using Unity.Services.Relay.Models;
using Unity.Netcode.Transports.UTP;
using System.Threading.Tasks;
public class RelayManager : MonoBehaviour
{
public static RelayManager Instance { get; private set; }
private async void Awake()
{
// Реализация паттерна Singleton для удобного доступа из UI
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
await InitializeUGSAsync();
}
// Инициализация UGS и анонимный вход
private async Task InitializeUGSAsync()
{
try
{
await UnityServices.InitializeAsync();
if (!AuthenticationService.Instance.IsSignedIn)
{
await AuthenticationService.Instance.SignInAnonymouslyAsync();
Debug.Log("UGS: Анонимный вход выполнен успешно. ID: " + AuthenticationService.Instance.PlayerId);
}
}
catch (System.Exception e)
{
Debug.LogError($"Ошибка инициализации UGS: {e}");
}
}
// Создание хоста через Relay
public async Task<string> CreateRelayAsync(int maxPlayers = 2)
{
try
{
if (NetworkManager.Singleton == null)
{
Debug.LogError("NetworkManager отсутствует на сцене!");
return null;
}
// Создаем аллокацию (maxPlayers - 1, так как хост уже в счете)
Allocation allocation = await RelayService.Instance.CreateAllocationAsync(maxPlayers - 1);
string joinCode = await RelayService.Instance.GetJoinCodeAsync(allocation.AllocationId);
var transport = NetworkManager.Singleton.GetComponent<UnityTransport>();
if (transport == null)
{
Debug.LogError("Компонент UnityTransport не найден на объекте NetworkManager!");
return null;
}
transport.SetHostRelayData(
allocation.RelayServer.IpV4,
(ushort)allocation.RelayServer.Port,
allocation.AllocationIdBytes,
allocation.Key,
allocation.ConnectionData
);
NetworkManager.Singleton.StartHost();
Debug.Log("Хост успешно запущен. Код комнаты: " + joinCode);
return joinCode;
}
catch (RelayServiceException e)
{
Debug.LogError($"Ошибка Relay при создании: {e}");
return null;
}
}
// Подключение клиента по коду
public async void JoinRelayAsync(string joinCode)
0{
try
{
if (NetworkManager.Singleton == null)
{
Debug.LogError("NetworkManager отсутствует на сцене!");
return;
}
Debug.Log("Подключаемся к комнате с кодом: " + joinCode);
JoinAllocation joinAllocation = await RelayService.Instance.JoinAllocationAsync(joinCode);
var transport = NetworkManager.Singleton.GetComponent<UnityTransport>();
if (transport == null)
{
Debug.LogError("Компонент UnityTransport не найден на объекте NetworkManager!");
return;
}
transport.SetClientRelayData(
joinAllocation.RelayServer.IpV4,
(ushort)joinAllocation.RelayServer.Port,
joinAllocation.AllocationIdBytes,
joinAllocation.Key,
joinAllocation.ConnectionData,
joinAllocation.HostConnectionData
);
NetworkManager.Singleton.StartClient();
Debug.Log("Клиент успешно запускается...");
}
catch (RelayServiceException e)
{
Debug.LogError($"Ошибка Relay при подключении: {e}");
}
}
}