← Назад к вопросам

Какие технологии использовал для клиент-серверной коммуникации?

1.8 Middle🔥 172 комментариев
#Сеть и мультиплеер

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Технологии клиент-серверной коммуникации в Unity

В зависимости от требований проекта (реализм, масштаб, бюджет) я использовал различные технологии, разделяя их на две основные категории: низкоуровневые решения для максимального контроля и производительности, и готовые высокоуровневые решения для быстрой разработки и стандартизации.


1. Низкоуровневые решения (Socket-level communication)

Для проектов, где критична скорость (например, многопользовательские экшн-игры, ММО прототипы) или необходим уникальный протокол, я работал напрямую с сокетами.

  • TCP через System.Net.Sockets: Для надежной, упорядоченной передачи данных (например, чат, важные игровые события). Реализация включает управление потоками, сериализацию/десериализацию пакетов и heartbeat для проверки соединения.

    // Пример отправки структурированного сообщения по TCP
    public void SendPlayerPosition(Vector3 position, int playerId) {
        byte[] idBytes = BitConverter.GetBytes(playerId);
        byte[] xBytes = BitConverter.GetBytes(position.x);
        byte[] yBytes = BitConverter.GetBytes(position.y);
        byte[] zBytes = BitConverter.GetBytes(position.z);
        
        byte[] packet = new byte[idBytes.Length + xBytes.Length + yBytes.Length + zBytes.Length];
        // ... сборка пакета с заголовком (например, тип сообщения)
        networkStream.Write(packet, 0, packet.Length);
    }
    
  • UDP через System.Net.Sockets: Для массовой передачи быстрых, но потенциально потерянных данных (например, позиции множества объектов в PvP). Здесь ключевую роль играет собственная система снапшотов, компенсации лагов (lag compensation) и прогнозирования (client-side prediction).

    // UDP менее надежен, поэтому пакеты часто включают временные метки
    public void SendSnapshot(List<PlayerSnapshot> snapshot) {
        using (MemoryStream ms = new MemoryStream()) {
            BinaryWriter writer = new BinaryWriter(ms);
            writer.Write(DateTime.UtcNow.Ticks); // Timestamp для синхронизации
            foreach (var player in snapshot) {
                writer.Write(player.id);
                writer.Write(player.position.x);
                // ... другие данные
            }
            udpClient.Send(ms.ToArray(), ms.Length);
        }
    }
    
  • WebSocket (например, через библиотеку WebsocketSharp): Для проектов, требующих постоянного двустороннего соединения с веб-сервером (например, браузерные игры, коммуникация с веб-API в реальном времени).


2. Готовые высокоуровневые решения и фреймворки

Для большинства проектов, особенно где важна скорость разработки и стандартизация сетевого кода, я использовал специализированные фреймворки.

  • Unity Netcode (MLAPI / Netcode for GameObjects): Стандартный выбор для новых проектов на Unity, особенно с поддержкой серверных моделей (dedicated server, client-host). Интегрирован с Unity, предоставляет готовые компоненты (NetworkTransform, NetworkObject), систему RPC (Remote Procedure Calls) и NetworkVariables. Отлично подходит для кооперативных игр, шутеров среднего масштаба.

    // Пример Netcode RPC
    [ServerRpc]
    public void FireWeaponServerRpc(Vector3 direction) {
        // Логика проверки и применения выстрела на сервере
        PlayFireEffectClientRpc(direction); // Транслируем эффект всем клиентам
    }
    
    [ClientRpc]
    public void PlayFireEffectClientRpc(Vector3 direction) {
        Instantiate(bulletEffect, transform.position, Quaternion.LookRotation(direction));
    }
    
  • Photon Unity Networking (PUN / Fusion): Использовал для проектов, требующих быстрого запуска матчмейкинга и комнат без написания собственного серверного кода. Photon предоставляет мощные релейные (relay) серверы, что идеально для парных или небольших командных PvP игр. Fusion добавляет продвинутую степую предсказания и реконсиляции состояния, что критично для конкурентных проектов.

  • Mirror Networking: Мощный, высокопроизводительный и открытый фреймворк. Использовал его, когда нужна была глубокая оптимизация и полный контроль над сетевым кодом, близкий к низкоуровневому, но с более удобным API (например, собственная система интересов объектов, сложная логика авторитета).

  • REST API через HTTP (UnityWebRequest): Для всех не-реалтайм коммуникаций: аутентификация, загрузка профилей, покупки в магазине, получение статических данных (списки уровней, статистика). Часто комбинируется с реалтайм-технологиями в одном проекте.

    // Пример получения данных через REST
    async void LoadUserProfile() {
        using (UnityWebRequest request = UnityWebRequest.Get("https://api.game.com/user/profile")) {
            request.SetRequestHeader("Authorization", "Bearer " + authToken);
            await request.SendWebRequest();
            if (request.result == UnityWebRequest.Result.Success) {
                UserProfile profile = JsonUtility.FromJson<UserProfile>(request.downloadHandler.text);
                // ... обработка данных
            }
        }
    }
    

Ключевые принципы и общие технологии

Независимо от выбранного транспорта, я всегда применяю следующие практики и инструменты:

  • Сериализация: Для эффективной передачи данных использую BinaryFormatter (для низкоуровневых сокетов), JsonUtility или Newtonsoft.Json (для REST, некоторых сообщений WebSocket), или специализированные библиотеки как FlatBuffers для минимального оверхеда.
  • Протоколы безопасности: Все внешние коммуникации (особенно REST) защищаются через SSL/TLS. Для аутентификации реализуются схемы с токенами (JWT).
  • Оптимизация трафика: Регулярно применяю дельта-компрессию (отправка только изменений), квантование данных (уменьшение точности чисел для позиций), пакетную отправку (batch) и интерполяцию на клиенте для сглаживания.

Выбор технологии всегда является компромиссом между производительностью, скоростью разработки, стоимостью инфраструктуры и требованиями геймдиза. Для гиперказуальных PvP проектов я чаще выбираю Photon или Netcode, для сложных ММО прототипов – низкоуровневые решения с UDP/TCP гибридом, а для игр с смешанной коммуникацией (реалтайм + данные) – комбинацию Netcode/WebSocket и REST API.

Какие технологии использовал для клиент-серверной коммуникации? | PrepBro