The Neo.Network module is a seamless network wrapper built on top of Mirror Networking. The library's core philosophy: your game works automatically as both single-player and multiplayer, with no code changes.
The library is kept to a minimal set of settings. If Mirror isn't installed in the project, the whole library compiles down to plain MonoBehaviour components.
You never need to write #if MIRROR in your own logic. The library's architecture solves synchronization through abstract components:
| NeoxiderTools component | With Mirror installed | Without Mirror (solo game) |
|---|---|---|
NeoNetworkComponent |
Base class: isNetworked, rate-limiting, late-join template | Plain MonoBehaviour |
NetworkSingleton<T> |
Inherits NetworkBehaviour, supports [SyncVar] |
Inherits MonoBehaviour, works as a regular script |
NetworkReactiveProperty |
Syncs data from [SyncVar] into No-Code events |
A plain UnityEvent-backed property |
NeoNetworkManager |
Wraps NetworkManager | A regular script (inactive) |
NetworkPropertySync |
Syncs any field via reflection (Float/Int/Bool/String/Vector3) | No-op |
NetworkActionRelay |
Multi-channel network UnityEvent broadcast (void/float/string) | A plain local event call |
NetworkContextActionRelay |
Contextual actions: Trigger(Collider) / Trigger() + target inside the networked player (no template reference) |
Local resolve, no networking |
NetworkOwnerFilter |
Filters by role (LocalPlayer/Server/Everyone) | Always passes (solo = allowed) |
NeoNetworkDiscovery |
LAN server discovery (wraps Mirror NetworkDiscovery) | N/A (requires Mirror) |
NeoLobbyManager |
Lobby + ready-checks (wraps Mirror NetworkRoomManager) | N/A (requires Mirror) |
NeoLobbyPlayer |
A lobby player with NoCode readiness | N/A (requires Mirror) |
NeoNetworkState |
Static IsServer/IsClient/IsHost/CanMutateState checks | Returns safe defaults |
If you're building a solo game, just remove the Mirror package. Every bit of your code that uses NetworkSingleton<T> automatically becomes a MonoBehaviour.
Building a multiplayer lobby is simple — it works right out of the box. The Host acts as both server and client (it plays the game and processes other players' logic at the same time).
- Create an empty scene object and add the
NeoNetworkManagercomponent. - Add the
Telepathy Transportcomponent (Mirror's default transport). - For a NoCode project, keep the player right in the scene: add a
NetworkIdentityto it, enable Use Scene Player Template onNeoNetworkManager, and assign that object as Scene Player Template. Leave Player Prefab empty.
Note
Use a regular Mirror Player Prefab only if the player doesn't depend on scene-level NoCode references. For an Inspector/UnityEvent workflow, the recommended path is the scene player template.
Server startup can be triggered from C# code or purely No-Code (a UI button → UnityEvent):
Just call the start method:
NeoNetworkManager.Singleton.StartHost();This automatically makes the player a Host. Its client connects locally to its own server.
NeoNetworkManager.Singleton.networkAddress = "127.0.0.1"; // Or the host's LAN IP
NeoNetworkManager.Singleton.StartClient();Tip
NeoNetworkManager exposes ready-made public methods StartHost(), StartClient(), StopHost() that you can wire directly to OnClick() buttons in a Unity Canvas without a single line of code!
NeoxiderTools' architecture is designed for Server-Authoritative flows (the server trusts only itself). You can easily build the following genres:
- How it's implemented:
Uses
RpgCharacter(network-adapted). Hits and damage go through the server APIDamage()/DamageType(). Resource, level, buff, and status state is broadcast to clients via snapshot sync and reactive properties. - Why it fits: Anti-cheat by design. A client can't grant itself infinite health locally, since the math runs on the Host.
- How it's implemented:
The
InventoryManagerinventory system runs throughNetworkSingleton. Players pick up weapons; the server checks item availability and spawns projectiles. - Why it fits: Automatic Transform and weapon-state sync with no hand-written RPC calls (via
NeoNetworkSpawner).
- How it's implemented:
Uses the
DialogueManagerandConditionManagersystems. A player pulls a lever in the scene, triggering aCommandto the Server. The server flips a global condition inConditionManager, and every client sees the door open. - Why it fits: The whole quest/state-machine stack already runs on the
Singleton<T>abstraction, which became network-aware.
NeoxiderTools ships with integration PlayMode tests. Spinning up a local host, spawning players, and verifying HasServerAuthority are all checked automatically using an in-memory transport (DummyTransport), keeping multiplayer stable even through aggressive refactors.
With the NetworkActionRelay, NetworkContextActionRelay, and NetworkOwnerFilter components you can build multiplayer without a single line of code:
- On the trigger:
PhysicsEvents3D(isNetworked=true),OnTriggerEnter → NetworkContextActionRelay.Trigger(Collider)(dynamic argument). NetworkContextActionRelay: Context = Event Argument, Root = Network Identity In Parents, Target = Child By NameSphere, Action = Set Active true, Scope = All Clients.- Result:
Sphereis enabled on the specific player whose collider entered the trigger, not on the scene template object.
- On the lever:
InteractiveObject(isNetworked=true),OnInteract → NetworkActionRelay.Trigger() NetworkActionRelay→ Channel "open", scope=AllClients →onTriggered → Animator.SetBool("isOpen", true)- Result: any player pulls the lever → everyone sees the door animation.
PhysicsEvents3D.OnTriggerEnter → NetworkOwnerFilter.Filter()(ServerOnly)onAllowed → InventoryComponent.AddItem()+Destroy(gameObject)- Result: only the server processes the item, no duplicates.
Counter (isNetworked=true)in the scene — a shared variable for everyone.PhysicsEvents3D.OnTriggerEnter → Counter.Add(1)— a Cmd to the server → Rpc to everyone.- A late-joining client sees the current value via
[SyncVar].
Tip
Every network component has server-side validation (rate-limiting, CanSpend checks, sender) and Late-Join sync via SyncVar. See NoCode Network Spec, Rules 8–10.
- NeoNetworkManager
- NetworkSingleton
- NetworkActionRelay
- NetworkContextActionRelay
- NetworkOwnerFilter
- NoCode Network Spec
- Lobby Page (
UIPage+ PageIdPageLobby): player list = one-row prefab +VerticalLayoutGroup; spawn a row perNeoLobbyManager.OnPlayerJoinedRoom, remove onOnPlayerLeftRoom(or rebuild onOnPlayerCountChanged). - Ready button →
NeoLobbyPlayer.ToggleReady()on the local player; bind the row highlight toOnReadyChanged. - Start:
NeoLobbyManager.OnAllPlayersReady→ enable the host's Start button → host calls the room-manager scene change;OnGameSceneLoaded→PM.I.ChangePageByName("PageGame"). - Names: add
NetworkPlayerNameto the player object and bindOnNameChangedto the row's TMP label. - Quick play: menu button →
NeoNetworkDiscovery.QuickPlay();OnQuickPlayResolved→ openPageLobby.