Блог онлайн школы Пиксель

Уроки Unity 3D для детей: пошаговая инструкция о том, как сделать мультиплеер в Юнити

Школа программирования «Пиксель» продолжает бесплатный курс по Юнити для желающих освоить искусство разработки игр. Курс по созданию игры на Юнити поможет школьнику овладеть информацией о геймдеве и научиться делать игры.

Сегодняшнее занятие по программированию для детей в Unity посвящено мультиплееру: это подскажет, как изобрести многопользовательскую игру — а значит, весело проводить время с друзьями. Осталось включить программу и следовать плану обучения Unity.

Обучение по созданию игр на Unity: делаем уровень


Начинаем обучение разработке на Unity. Воспроизведем тестовый уровень. Добавляем Plane и опускаем на 0.5. Игрок отображается в виде куба. Переименуем его и создадим папку с материалами. Далее перекрашиваем игрока в красный цвет и переносим новый материал на объект.

Уровень в Unity для мультиплеера

Программирование Юнити для детей: подключение пакетов


Открываем Package Manager. Переключаем на Unity Registry, в поиске ищем Netcode for GameObjects. Этот набор инструментов понадобится для внедрения мультиплеера. Дожидаемся установки. Добавляем Multiplayer Tools — пакет, который облегчает разработку мультиплеера.

Подключение пакетов для мультиплеера Unity

Создание Network Manager в процессе обучения Unity для детей 


Переходим на сцену. Создаем пустой объект и называем Network Manager. Далее подключаем скрипт Network Manager и выбираем Unity Transport как тип передачи данных. В скрипте следует подключить префаб игрового персонажа, так что сначала сделаем его.

Подключаем префаб для мультиплеера в Юнити

Unity-обучение бесплатно: префаб игрока


Делаем папку Scripts, в ней — скрипт Player Control. Напишем функцию Move, отвечающую за перемещение, и зададим вектор направления.

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

Префаб игрока для мультиплеера в Юнити

Переходим в Unity и переносим скрипт на игрока. Далее создаем папку prefubs, где будем хранить префаб. Переносим туда объект, а со сцены удаляем.

Для объявления игрока объектом, необходимым для передачи по сети, добавляем к нему скрипт Network Object. Подключаем префаб к Network Manager в поле Player Prefub, внедряем в список Network Prefabs. Player Prefub назначится любому, кто присоединится к игре. Список нужен для регистрации префабов, что участвуют в сетевом взаимодействии.

Префаб игрока для мультиплеера в Юнити

Сборка игры в ходе обучения по разработке игр в Unity


Далее настроим сборку игры. Переходим в build settings и нажимаем на Add Open Scenes, чтобы добавить открытые сцены в сборку. Выбираем Player Settings и выставляем оконный режим игры. Проверяем. У Network Manager нажимаем на кнопку Start Host. Появляется игрок, являющийся сервером, к которому подключаются другие игроки — клиенты.

Управление не работает — идем в скрипт управления персонажем. Проблема выявлена: нужно было вызвать метод передвижения в Update. Запускаем, выбираем Network Manager и спавним игрока в качестве хоста. Передвижение работает.

Создание мультиплеерной игры в Юнити

Создание интерфейса по уроку программирования в Юнити


Делаем интерфейс для сетевого подключения в игре. Формируем канвас. В канвасе создаем пустой объект и называем Network Manager UI.

Переместимся к канвасу, нажав по нему двойным щелчком мыши. Перейдем в 2D-режим. Растянем NetworkManagerUI по канвасу и привяжем к центру: нажмем на иконку с зажатыми клавишами Shift и Alt.

Добавим кнопки интерфейсу. Button text mesh pro требует импорта компонентов. Привяжем кнопку к правой стороне экрана и отодвинем от края. Переименуем ее и перепишем текст. Затем копируем готовую кнопку, меняем текст и название.

Теперь напишем скрипт для работы кнопок. 

Создание скриптов для кнопок в мультиплеере Юнити

Переходим в Scripts и создаем скрипт NetworkManagerUI. Удаляем ненужное. Объявляем поля для кнопок. Сделаем их приватными, а чтобы привязать их через Unity, добавим serializeField.

Объявляем функцию Awake, которая вызывается один раз сразу после создания объекта. По нажатию на кнопку Host будем спавнить хоста — игрока, к ПК которого присоединяются остальные. Копируем и меняем код для подключения клиента.

Если при написании кода автоматически не подключились библиотеки — делаем это вручную. Идем в Unity и присоединяем скрипт к объекту. К самому скрипту подключаем соответствующие кнопки.

Соберем проект, запустим и сохраним на рабочем столе. В оконной версии игры зайдем как хост, а в Юнити подключимся как клиент. Как хост, так и клиент подключились и видят друг друга. Однако нет раздельного управления.

Проверка мультиплеера на Юнити

Обучение Unity: разделение управления и установка доверия клиенту


Добавим на игрока Player Transform и уберем из синхронизации лишние компоненты. Нужно передавать по сети только необходимые данные: так увеличивается скорость передачи и уменьшается вероятность ошибок.

Перейдем в Player Control, в Update напишем условие. Если объекту не принадлежит скрипт, который он хочет выполнить, выходим. Чтобы код сработал, будем наследовать класс Player Control от NetworkBehaviour, а еще подключим библиотеку NetCode. Сохраняем и переходим в Unity.

Собираем игру заново. Заходим за хоста — управление работает. Запускаем в Юнити и заходим за клиента. Управление разделилось, но клиент не управляется.

Разделение управления и установка доверия клиенту в игре Юнити

Для решения проблемы напишем скрипт ClientNetworkTransform. Удаляем лишнее и переопределяем метод OnIsServerAuthoritative. Вместо true метод будет возвращать false. Таким образом объявляем, что доверяем клиенту, и он сам может управлять собственными данными по перемещению.

Для соревновательной игры метод не подойдет: увеличивается шанс читерства со стороны клиента посредством отправки поддельных данных.

Поменяем наследуемый класс на NetworkTransform. Сохраняем и идем в Unity. После выбираем префаб игрока и удаляем с него NetworkTransform. На его место ставим ClientNetworkTransform и не забываем убрать лишнюю синхронизацию данных.

Доработки мультиплеера в Юнити

Собираем проект — все работает.

Мультиплеер в Unity готов

Обучение Unity 3D: что дальше


Урок по Юнити на тему мультиплеера окончен. Помните, что добавление мультиплеера для каждой игры требует вдумчивого подхода и зависит от конкретных потребностей.

Подробную информацию о Netcode for GameObjects можно получить, изучив его документацию и руководство Unity.

Другие уроки по обучению Unity онлайн — в плейлисте школы «Пиксель». Бесплатный курс по Юнити 3д в видеороликах поможет познакомиться с платформой, освоить язык С# (Си Шарп) и получить ответы на вопросы:

  • с чего начать онлайн-обучение Си Шарп;
  • чему учат на курсах по Юнити 3д;
  • как стать разработчиком с Unity-обучением.


Хотите глубже разобраться в Юнити — записывайтесь на курс по Unity школы программирования «Пиксель». Учим детей10–14 лет смотреть на игры глазами инженера-разработчика и знакомим с IT-терминологией. Пройдя курс обучения Unity, ребенок обретет базу знаний по кодингу и научится конструировать 2D- и 3D-игры. Обучение на разработчика игр на Unity подарит увлекательное хобби и будущее любимое дело жизни.

Скрипты к уроки Unity 3D для детей:


NetworkManagerUI

using Unity.Netcode;
using UnityEngine;
using UnityEngine.UI;

public class NetworkManagerUI : MonoBehaviour
{
    [SerializeField] private Button hostButton;
    [SerializeField] private Button clientButton;

    private void Awake()
    {

        hostButton.onClick.AddListener(call: (() =>
        {
            NetworkManager.Singleton.StartHost();
        }));

        clientButton.onClick.AddListener(call: (() =>
        {
            NetworkManager.Singleton.StartClient();
        }));
    }
}

Player Control

using Unity.Netcode;
using UnityEngine;

public class PlayerControl : NetworkBehaviour
{
    void Update()
    {
        if (!IsOwner) return;
        Move(); 
    }

    private void Move()
    {
        Vector3 moveDirection = new Vector3(0, 0, 0);

        if (Input.GetKey(KeyCode.W)) moveDirection.z = +1f;
        if (Input.GetKey(KeyCode.A)) moveDirection.x = -1f;
        if (Input.GetKey(KeyCode.S)) moveDirection.z = -1f;
        if (Input.GetKey(KeyCode.D)) moveDirection.x = +1f;

        float moveSpeed = 3;
        transform.position += moveSpeed * Time.deltaTime * moveDirection;
    }
}

ClientNetworkTransform

using System.Collections;
using System.Collections.Generic;
using Unity.Netcode.Components;
using UnityEngine;

public class ClientNetworkTransform : NetworkTransform
{
    protected override bool OnIsServerAuthoritative()
    {
        return false;
    }
}



2023-01-25 08:43 Бесплатные видеоуроки Unity для детей