Привет, юный создатель игр!
Представь, что ты играешь с друзьями в футбол во дворе. Что ты делаешь, когда хочешь передать мяч товарищу? Правильно - кричишь ему: "Вася, лови!" Или когда забиваешь гол - радуешься вместе: "Ура! Гол!"
В компьютерных играх все точно так же! Игроки хотят общаться, договариваться о стратегии, поздравлять друг друга с победой. Для этого в играх есть чат - это как рация, через которую все игроки могут разговаривать.
Сегодня мы начнем создавать такой чат в 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 = "";
}
}
Что происходит в этом коде?
[Header("UI элементы")]
- это как заголовки в тетради, которые помогают организовать кодTMP_InputField messageInput
- это поле, куда игрок вводит текст (как в мессенджере)Button sendButton
- кнопка "Отправить"ScrollRect chatScrollRect
- прокручиваемая область, где показываются сообщенияmessagePrefab
- шаблон, по которому создается каждое новое сообщение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;
}
Что происходит в этом коде?
[ServerRpc(RequireOwnership = false)]
- это говорит Unity: "Эта функция выполняется на сервере через RPC (Remote Procedure Call), и любой игрок может ее вызвать"SendMessageServerRpc
- игрок отправляет сообщение на серверReceiveMessageClientRpc
- сервер отправляет сообщение всем игрокамCreateMessageInChat
- создает сообщение на экране каждого игрока
Это как в школе: когда ты поднимаешь руку и говоришь что-то, учитель (сервер) слышит тебя и повторяет твои слова всему классу (всем игрокам).
Шаг 3: Создаем шаблон сообщения
Теперь нужно создать красивый шаблон для сообщений. В Unity:
Создай новый UI объект: UI → Text (TMP)
Назови его "MessagePrefab"
Настрой его внешний вид (шрифт, размер, цвет)
Перетащи этот объект в поле
messagePrefab
в компонентеChatSystem
Как использовать базовый чат в игре
-
Создай UI элементы в Unity:
Поле ввода (Input Field)
Кнопка "Отправить"
Прокручиваемая область для сообщений
Шаблон сообщения
Добавь компонент
ChatSystem
к объекту игрокаНастрой все поля в инспекторе Unity
Протестируй с несколькими игроками
Что мы создали
Теперь у тебя есть рабочий сетевой чат! Игроки могут:
Писать сообщения
Видеть сообщения друг друга
Отправлять сообщения нажатием Enter или кнопки
В следующей части мы добавим систему команд, эмодзи и форматирование текста, чтобы сделать чат еще более интересным и функциональным!
Продолжение следует...
redhurt96
Если это чат на фотоне или другом стеке, то наверно стоит это уточнить в статье) А то туториал для новичков, которые могут и не знать половину слов в статье: что за NetworkManager, откуда ServerRpc и тд
DrRen7
Это вроде как Netcode for GameObjects(
Unity.Netcode
) и да уточнить это точно надо)