Привет, юный создатель игр!
Представь, что ты играешь с друзьями в футбол во дворе. Что ты делаешь, когда хочешь передать мяч товарищу? Правильно — кричишь ему: «Вася, лови!» Или когда забиваешь гол — радуешься вместе: «Ура! Гол!»
В компьютерных играх все точно так же! Игроки хотят общаться, договариваться о стратегии, поздравлять друг друга с победой. Для этого в играх есть чат — это как рация, через которую все игроки могут разговаривать.
Сегодня мы начнем создавать такой чат в 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 или кнопки
В следующей части мы добавим систему команд, эмодзи и форматирование текста, чтобы сделать чат еще более интересным и функциональным!
Продолжение следует…
ссылка на оригинал статьи https://habr.com/ru/articles/922740/
Добавить комментарий