Модуль Neo.Network — это бесшовная сетевая обертка поверх Mirror Networking. Главная философия библиотеки: Ваша игра работает автоматически как в синглплеере, так и в мультиплеере без изменения кода.
Библиотека сведена к минимальному количеству настроек. Если Mirror не установлен в проекте, вся библиотека компилируется в стандартные MonoBehaviour-компоненты.
Вам не нужно писать #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.
Создать мультиплеерное лобби очень просто, это работает прямо из "коробки". Хост выполняет роль и сервера, и клиента (то есть он играет и заодно обрабатывает логику других игроков).
- Создайте пустой объект на сцене и добавьте компонент
NeoNetworkManager. - Добавьте компонент
Telepathy Transport(стандартный транспорт Mirror). - Для 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 без строчки кода!
Архитектура NeoxiderTools разработана так, чтобы поддерживать Server-Authoritative (сервер доверяет только себе) подходы. Вы можете легко создавать следующие жанры:
- Как реализовано:
Используется
RpgCharacter(адаптирован для сети). Удары и урон обрабатываются через серверный APIDamage()/DamageType(). Состояние ресурсов, уровня, баффов и статусов рассылается клиентам snapshot-синхронизацией и реактивными свойствами. - Почему подходит: Защита от читеров. Клиент не может бессмертно подменить себе здоровье, так как вычисления идут у Хоста.
- Как реализовано:
Система инвентаря
InventoryManagerработает черезNetworkSingleton. Игроки подбирают оружие, сервер проверяет наличие предмета и спавнит снаряды. - Почему подходит: Автоматическая синхронизация Transform и состояния оружия без ручного написания RPC-вызовов (учитывая
NeoNetworkSpawner).
- Как реализовано:
Используется мощная система
DialogueManagerиConditionManager. Игрок может нажать рычаг на сцене, это вызоветCommandна Сервер. Сервер переключит глобальное условие вConditionManager, и все клиенты увидят, что дверь открылась. - Почему подходит: Вся стейт-машина квестов и состояний уже поддерживает абстракцию
Singleton<T>, которая стала сетевой.
Библиотека NeoxiderTools снабжена интеграционными PlayMode тестами. Разворачивание локального хоста, спавн игроков и проверка HasServerAuthority проверяется автоматически с использованием In-Memory транспорта (DummyTransport), что гарантирует стабильность работы мультиплеера даже во время агрессивного рефакторинга.
С новыми компонентами NetworkActionRelay, NetworkContextActionRelay и NetworkOwnerFilter можно сделать мультиплеер без единой строки кода:
- На триггере:
PhysicsEvents3D(isNetworked=true),OnTriggerEnter → NetworkContextActionRelay.Trigger(Collider)(динамический аргумент). NetworkContextActionRelay: Context = Event Argument, Root = Network Identity In Parents, Target = Child By NameSphere, Action = Set Active true, Scope = All Clients.- Результат: включается
Sphereу того игрока, чей коллайдер вошёл в триггер, а не у объекта из сценового шаблона.
- На рычаге:
InteractiveObject(isNetworked=true),OnInteract → NetworkActionRelay.Trigger() NetworkActionRelay→ Channel "open", scope=AllClients →onTriggered → Animator.SetBool("isOpen", true)- Результат: любой игрок дернет рычаг → все увидят анимацию двери.
PhysicsEvents3D.OnTriggerEnter → NetworkOwnerFilter.Filter()(ServerOnly)onAllowed → InventoryComponent.AddItem()+Destroy(gameObject)- Результат: только сервер обрабатывает предмет, дублей нет.
Counter (isNetworked=true)на сцене — общая переменная для всех.PhysicsEvents3D.OnTriggerEnter → Counter.Add(1)— Cmd на сервер → Rpc всем.- Late-join клиент увидит актуальное значение через
[SyncVar].
Tip
Все сетевые компоненты имеют серверную валидацию (rate-limiting, проверка CanSpend, sender) и Late-Join синхронизацию через SyncVar. См. NoCode Network Spec, Правила 8–10.