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

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

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

Сегодня мы начнем создавать такой чат в 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 или кнопки

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


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

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


  1. redhurt96
    02.07.2025 13:40

    Если это чат на фотоне или другом стеке, то наверно стоит это уточнить в статье) А то туториал для новичков, которые могут и не знать половину слов в статье: что за NetworkManager, откуда ServerRpc и тд


    1. DrRen7
      02.07.2025 13:40

      Это вроде как Netcode for GameObjects(Unity.Netcode) и да уточнить это точно надо)


  1. ArtMan99
    02.07.2025 13:40

    Информативненько, спасибо