Создание мультиплеера в Unity
Создание мультиплеерных игр всегда было сложной задачей. Однако, ситуация в Unity изменилась относительно недавно с появлением новой системы Unity Networking. Теперь Unity берет на себя решение большинства проблем, связанных с мультиплеером, значительно упрощая процесс разработки.
Настройка проекта
Создайте пустой объект, отвечающий за мультиплеер, и назовите его «Networking». Добавьте компоненты Network Manager и Network Manager HUD. Network Manager предоставляет возможности подключения к локальной сети, управления игрой и т.д. (NetworkInfo содержит информацию о Local Host, порте и т.п., но сейчас это пропустим). Network Manager HUD создает меню для подключения к общему серверу.
Префабы игроков
Создайте папку «Prefabs». Перетащите игрока в эту папку, создав префаб. Игрока со сцены можно удалить. Добавьте основную камеру (Main Camera), отодвиньте её, чтобы видеть всю сцену. Замените Skybox на Solid Color черного цвета.
Настройка игрока
При запуске игры появятся кнопки для создания сервера и подключения к нему. При попытке подключения возникнет ошибка: отсутствует объект Player Prefab. Переместите префаб игрока в поле Player Prefab в Network Manager. Возникнет еще одна ошибка: отсутствует компонент Network Identity. Добавьте этот компонент к префабу игрока. Выберите опцию Local Player Authority, чтобы игрок управлялся локально, а данные синхронизировались с сервером.
Точки появления игроков
Добавьте пустой объект «Spawn Position», установив его координаты (например, Z = -5). Дублируйте его, повернув второй объект на 180 градусов по оси Y, чтобы игроки смотрели друг на друга при появлении. Добавьте к обоим объектам компонент NetworkStartPosition. Выберите режим Round Robin для чередования позиций появления игроков. Установите значение Y для точек появления (например, Y = 1), чтобы игроки не появлялись в земле.
Запуск игры и исправление ошибок
Скомпилируйте и запустите игру. При подключении двух игроков обнаружится проблема: движение одного игрока дублируется для второго. Это происходит из-за того, что у обоих игроков один и тот же скрипт PlayerController. Также наблюдается ошибка с тремя аудио-лисенерами.
Создание скрипта PlayerSetup
Создайте новый скрипт PlayerSetup, наследующий от NetworkBehaviour. Создайте массив componentsToDisable, в который добавьте PlayerMotor, PlayerController, Camera и AudioListener. В функции Start проверяйте, является ли игрок локальным (isLocalPlayer). Если нет, отключайте компоненты из массива componentsToDisable. Добавьте поле sceneCamera для отключения основной камеры при игре и включения её при выходе из игры, используя функции OnEnable и OnDisable.
Результат
После внесения изменений, при запуске игры, движение одного игрока не будет дублироваться вторым. Камера и аудио-лисенер будут отключены для нелокальных игроков. Однако, синхронизация движения пока не работает и будет рассмотрена в следующем уроке.
В этом уроке создан базовый мультиплеер: несколько игроков могут подключаться к серверу и играть, но синхронизация движения пока отсутствует. Это будет реализовано в следующем уроке.