Skip to content

Latest commit

 

History

History
128 lines (94 loc) · 11.4 KB

File metadata and controls

128 lines (94 loc) · 11.4 KB

Интеграция Мультиплеера (Neo.Network)

Модуль Neo.Network — это бесшовная сетевая обертка поверх Mirror Networking. Главная философия библиотеки: Ваша игра работает автоматически как в синглплеере, так и в мультиплеере без изменения кода.

Библиотека сведена к минимальному количеству настроек. Если Mirror не установлен в проекте, вся библиотека компилируется в стандартные MonoBehaviour-компоненты.


1. Как это работает (Без лишних настроек)

Вам не нужно писать #if MIRROR в вашей логике. Архитектура библиотеки решает проблему синхронизации с помощью абстрактных компонентов:

Компонент Neoxider Tools Если установлен Mirror Если Mirror отсутствует (Соло игра)
NeoNetworkComponent Базовый класс: isNetworked, rate-limiting, late-join template Обычный MonoBehaviour
NetworkSingleton<T> Наследует NetworkBehaviour, поддерживает [SyncVar] Наследует MonoBehaviour, работает как обычный скрипт
NetworkReactiveProperty Синхронизирует данные из [SyncVar] в No-Code эвенты Обычное UnityEvent-свойство
NeoNetworkManager Обертка над NetworkManager Обычный скрипт (неактивен)
NetworkPropertySync Синхронизация любого поля через Reflection (Float/Int/Bool/String/Vector3) No-op
NetworkActionRelay Многоканальный сетевой broadcast UnityEvent (void/float/string) Обычный локальный вызов событий
NetworkContextActionRelay Контекстные действия: Trigger(Collider) / Trigger() + цель внутри сетевого игрока (без ссылки на template) Локальный резолв без сети
NetworkOwnerFilter Фильтр по роли (LocalPlayer/Server/Everyone) Всегда пропускает (solo = allowed)
NeoNetworkDiscovery LAN-обнаружение серверов (обёртка Mirror NetworkDiscovery) N/A (requires Mirror)
NeoLobbyManager Лобби + ready-проверка (обёртка Mirror NetworkRoomManager) N/A (requires Mirror)
NeoLobbyPlayer Игрок в лобби с NoCode готовностью N/A (requires Mirror)
NeoNetworkState Статические проверки IsServer/IsClient/IsHost/CanMutateState Возвращает безопасные значения по умолчанию

Деградация в синглплеер (Отказоустойчивость)

Если вы делаете соло-игру, просто удалите пакет Mirror. Весь ваш код, использующий NetworkSingleton<T>, автоматически преобразуется в MonoBehaviour.


2. Как создать Хоста и Клиентов (По умолчанию)

Создать мультиплеерное лобби очень просто, это работает прямо из "коробки". Хост выполняет роль и сервера, и клиента (то есть он играет и заодно обрабатывает логику других игроков).

Настройка сцены

  1. Создайте пустой объект на сцене и добавьте компонент NeoNetworkManager.
  2. Добавьте компонент Telepathy Transport (стандартный транспорт Mirror).
  3. Для NoCode-проекта оставьте игрока прямо в сцене: добавьте на него NetworkIdentity, включите Use Scene Player Template в NeoNetworkManager и назначьте этот объект в Scene Player Template. Поле Player Prefab оставьте пустым.

Note

Обычный Mirror Player Prefab используйте только если игрок не зависит от сценовых NoCode-ссылок. Для Inspector/UnityEvent workflow рекомендуемый путь — сценовый игрок-шаблон.

Подключение

Вызвать старт сервера можно как из C# кода, так и через No-Code (кнопку в UI -> UnityEvent):

Хост (Создатель игры)

Просто вызовите метод для старта:

NeoNetworkManager.Singleton.StartHost();

Это автоматически сделает игрока Хостом. Его клиент локально подключится к его же серверу.

Клиент (Подключающийся)

NeoNetworkManager.Singleton.networkAddress = "127.0.0.1"; // Или IP хоста по сети
NeoNetworkManager.Singleton.StartClient();

Tip

У компонента NeoNetworkManager есть готовые публичные методы StartHost(), StartClient(), StopHost(), которые можно назначать напрямую на кнопки OnClick() в Unity Canvas без строчки кода!


3. Примеры жанров игр, которые можно сделать на текущей архитектуре

Архитектура NeoxiderTools разработана так, чтобы поддерживать Server-Authoritative (сервер доверяет только себе) подходы. Вы можете легко создавать следующие жанры:

1. Кооперативные RPG / Выживалки (Valheim, Diablo)

  • Как реализовано: Используется RpgCharacter (адаптирован для сети). Удары и урон обрабатываются через серверный API Damage() / DamageType(). Состояние ресурсов, уровня, баффов и статусов рассылается клиентам snapshot-синхронизацией и реактивными свойствами.
  • Почему подходит: Защита от читеров. Клиент не может бессмертно подменить себе здоровье, так как вычисления идут у Хоста.

2. Сессионные Арена-Шутеры (Quake, CS:GO мини-режимы)

  • Как реализовано: Система инвентаря InventoryManager работает через NetworkSingleton. Игроки подбирают оружие, сервер проверяет наличие предмета и спавнит снаряды.
  • Почему подходит: Автоматическая синхронизация Transform и состояния оружия без ручного написания RPC-вызовов (учитывая NeoNetworkSpawner).

3. Парти-Игры (Among Us, Fall Guys)

  • Как реализовано: Используется мощная система DialogueManager и ConditionManager. Игрок может нажать рычаг на сцене, это вызовет Command на Сервер. Сервер переключит глобальное условие в ConditionManager, и все клиенты увидят, что дверь открылась.
  • Почему подходит: Вся стейт-машина квестов и состояний уже поддерживает абстракцию Singleton<T>, которая стала сетевой.

4. Тесты и надежность

Библиотека NeoxiderTools снабжена интеграционными PlayMode тестами. Разворачивание локального хоста, спавн игроков и проверка HasServerAuthority проверяется автоматически с использованием In-Memory транспорта (DummyTransport), что гарантирует стабильность работы мультиплеера даже во время агрессивного рефакторинга.


5. NoCode мультиплеер для любой механики

С новыми компонентами NetworkActionRelay, NetworkContextActionRelay и NetworkOwnerFilter можно сделать мультиплеер без единой строки кода:

Пример: Персональный pickup (дочерний объект у вошедшего игрока)

  1. На триггере: PhysicsEvents3D (isNetworked=true), OnTriggerEnter → NetworkContextActionRelay.Trigger(Collider) (динамический аргумент).
  2. NetworkContextActionRelay: Context = Event Argument, Root = Network Identity In Parents, Target = Child By Name Sphere, Action = Set Active true, Scope = All Clients.
  3. Результат: включается Sphere у того игрока, чей коллайдер вошёл в триггер, а не у объекта из сценового шаблона.

Пример: Двери / Рычаги

  1. На рычаге: InteractiveObject (isNetworked=true), OnInteract → NetworkActionRelay.Trigger()
  2. NetworkActionRelay → Channel "open", scope=AllClients → onTriggered → Animator.SetBool("isOpen", true)
  3. Результат: любой игрок дернет рычаг → все увидят анимацию двери.

Пример: Серверный подбор предмета

  1. PhysicsEvents3D.OnTriggerEnter → NetworkOwnerFilter.Filter() (ServerOnly)
  2. onAllowed → InventoryComponent.AddItem() + Destroy(gameObject)
  3. Результат: только сервер обрабатывает предмет, дублей нет.

Пример: Глобальный счёт

  1. Counter (isNetworked=true) на сцене — общая переменная для всех.
  2. PhysicsEvents3D.OnTriggerEnter → Counter.Add(1) — Cmd на сервер → Rpc всем.
  3. Late-join клиент увидит актуальное значение через [SyncVar].

Tip

Все сетевые компоненты имеют серверную валидацию (rate-limiting, проверка CanSpend, sender) и Late-Join синхронизацию через SyncVar. См. NoCode Network Spec, Правила 8–10.

См. также