Загрузка данных


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}");
        }
    }
}