Сетевой чат в Unity: Часть 1 — Основы и простой интерфейс

от автора

Привет, юный создатель игр!

Представь, что ты играешь с друзьями в футбол во дворе. Что ты делаешь, когда хочешь передать мяч товарищу? Правильно — кричишь ему: «Вася, лови!» Или когда забиваешь гол — радуешься вместе: «Ура! Гол!»

В компьютерных играх все точно так же! Игроки хотят общаться, договариваться о стратегии, поздравлять друг друга с победой. Для этого в играх есть чат — это как рация, через которую все игроки могут разговаривать.

Сегодня мы начнем создавать такой чат в Unity, чтобы твои игроки могли общаться в реальном времени!


Что такое сетевой чат?

Представь, что у тебя есть большая комната с множеством телефонов. Каждый игрок берет один телефон, и когда кто-то говорит в свой телефон, все остальные слышат его голос. Это и есть сетевой чат!

В Unity это работает так:

  • Один игрок пишет сообщение

  • Unity отправляет это сообщение всем остальным игрокам

  • Все видят сообщение на своих экранах


Создаем простой чат: Пошаговое руководство

Шаг 1: Создаем интерфейс чата

Сначала нам нужно создать «окошко» для чата на экране. Это как доска в классе, на которой можно писать сообщения.

Создай новый скрипт ChatSystem.cs:

using Unity.Netcode; using UnityEngine; using UnityEngine.UI; using TMPro; using System.Collections.Generic;  public class ChatSystem : NetworkBehaviour {     [Header("UI элементы")]     public TMP_InputField messageInput;        // Поле для ввода сообщения     public Button sendButton;                  // Кнопка "Отправить"     public ScrollRect chatScrollRect;          // Прокручиваемая область чата     public GameObject messagePrefab;           // Шаблон сообщения     public Transform messageContainer;         // Контейнер для сообщений          [Header("Настройки")]     public int maxMessages = 50;               // Максимум сообщений в чате          private List<GameObject> messageObjects = new List<GameObject>();          void Start()     {         // Подписываемся на нажатие кнопки "Отправить"         sendButton.onClick.AddListener(SendMessage);                  // Подписываемся на нажатие Enter в поле ввода         messageInput.onSubmit.AddListener((_) => SendMessage());     }          void SendMessage()     {         // Проверяем, что поле не пустое         if (string.IsNullOrEmpty(messageInput.text))             return;                      // Проверяем, что игрок подключен к сети         if (!IsClient)         {             Debug.LogWarning("Нельзя отправить сообщение без подключения к сети!");             return;         }                      // Отправляем сообщение на сервер         SendMessageServerRpc(messageInput.text);                  // Очищаем поле ввода         messageInput.text = "";     } } 

Что происходит в этом коде?

  1. [Header("UI элементы")] — это как заголовки в тетради, которые помогают организовать код

  2. TMP_InputField messageInput — это поле, куда игрок вводит текст (как в мессенджере)

  3. Button sendButton — кнопка «Отправить»

  4. ScrollRect chatScrollRect — прокручиваемая область, где показываются сообщения

  5. messagePrefab — шаблон, по которому создается каждое новое сообщение

  6. messageContainer — место, куда добавляются все сообщения

В функции Start() мы говорим Unity: «Когда игрок нажмет кнопку или Enter, выполни функцию SendMessage()«


Шаг 2: Отправляем сообщения на сервер

Теперь добавим функцию, которая отправляет сообщение всем игрокам:

[ServerRpc(RequireOwnership = false)] private void SendMessageServerRpc(string message, ServerRpcParams serverRpcParams = default) {     // Получаем ID игрока, который отправил сообщение     var clientId = serverRpcParams.Receive.SenderClientId;          // Отправляем сообщение всем клиентам     ReceiveMessageClientRpc(message, clientId); }  [ClientRpc] private void ReceiveMessageClientRpc(string message, ulong senderId) {     // Создаем новое сообщение в чате     CreateMessageInChat(message, senderId); }  private void CreateMessageInChat(string message, ulong senderId) {     // Проверяем, что шаблон сообщения существует     if (messagePrefab == null)     {         Debug.LogError("MessagePrefab не назначен!");         return;     }          // Проверяем, что контейнер существует     if (messageContainer == null)     {         Debug.LogError("MessageContainer не назначен!");         return;     }          // Создаем новый объект сообщения     GameObject messageObj = Instantiate(messagePrefab, messageContainer);          // Находим текстовый компонент в сообщении     TMP_Text messageText = messageObj.GetComponentInChildren<TMP_Text>();          // Проверяем, что текстовый компонент найден     if (messageText == null)     {         Debug.LogError("TMP_Text компонент не найден в MessagePrefab!");         Destroy(messageObj);         return;     }          // Формируем текст сообщения     string playerName;     if (NetworkManager.Singleton != null && NetworkManager.Singleton.LocalClientId == senderId)     {         playerName = "Ты";     }     else     {         playerName = $"Игрок {senderId}";     }     messageText.text = $"{playerName}: {message}";          // Добавляем сообщение в список     messageObjects.Add(messageObj);          // Удаляем старые сообщения, если их слишком много     if (messageObjects.Count > maxMessages)     {         GameObject oldMessage = messageObjects[0];         messageObjects.RemoveAt(0);         Destroy(oldMessage);     }          // Прокручиваем чат вниз, чтобы показать новое сообщение     Canvas.ForceUpdateCanvases();     chatScrollRect.verticalNormalizedPosition = 0f; } 

Что происходит в этом коде?

  1. [ServerRpc(RequireOwnership = false)] — это говорит Unity: «Эта функция выполняется на сервере через RPC (Remote Procedure Call), и любой игрок может ее вызвать»

  2. SendMessageServerRpc — игрок отправляет сообщение на сервер

  3. ReceiveMessageClientRpc — сервер отправляет сообщение всем игрокам

  4. CreateMessageInChat — создает сообщение на экране каждого игрока

Это как в школе: когда ты поднимаешь руку и говоришь что-то, учитель (сервер) слышит тебя и повторяет твои слова всему классу (всем игрокам).


Шаг 3: Создаем шаблон сообщения

Теперь нужно создать красивый шаблон для сообщений. В Unity:

  1. Создай новый UI объект: UI → Text (TMP)

  2. Назови его «MessagePrefab»

  3. Настрой его внешний вид (шрифт, размер, цвет)

  4. Перетащи этот объект в поле messagePrefab в компоненте ChatSystem


Как использовать базовый чат в игре

  1. Создай UI элементы в Unity:

    • Поле ввода (Input Field)

    • Кнопка «Отправить»

    • Прокручиваемая область для сообщений

    • Шаблон сообщения

  2. Добавь компонент ChatSystem к объекту игрока

  3. Настрой все поля в инспекторе Unity

  4. Протестируй с несколькими игроками


Что мы создали

Теперь у тебя есть рабочий сетевой чат! Игроки могут:

  • Писать сообщения

  • Видеть сообщения друг друга

  • Отправлять сообщения нажатием Enter или кнопки

В следующей части мы добавим систему команд, эмодзи и форматирование текста, чтобы сделать чат еще более интересным и функциональным!


Продолжение следует…


ссылка на оригинал статьи https://habr.com/ru/articles/922740/