Guide for Unity Unreal Godot
Unity

Unity guide

Multiplayer with nothing to configure — no server setup. Local mode starts a bundled host when you press Play. Drag-and-drop components handle input, movement, and facing.

Shipping com.khalm.nulltick  ·  Unity 6  ·  new Input System  ·  GameObject + ECS

The SDK comes from your account. Create one at app.nulltick.com — it’s free and takes one click, with no password to choose — and download the Unity package there. The same account holds the App ID and keys you’ll need when you go live.

Quickstart

Press Play and you're multiplayer

Fastest start: open Tools > NullTick > NullTick Hub. One window does the lot — it checks the plugin, creates a config, drops a connection into your scene, starts the server on your computer, and shows you rooms and live traffic. The steps below are the same thing by hand.

The same path by hand:

  1. Add a connection. Empty GameObject → Add Component > NullTick > NullTick Connection. Defaults are already right: Local, 127.0.0.1:9999, room 1, Connect On Start. On Play the bundled server starts (or is reused) automatically.

  2. Make a player. On your character, add three components from the same NullTick menu:

    • NullTick Player Controller — keyboard / mouse / gamepad. Style dropdown: First-person, Third-person, Top-down (mouse aim), Click to move, Top-down (hack & slash), or None (turn-based / your own input). Finds the connection, sets up a camera for the style, and adds jump for first/third-person.
    • NullTick Movement Sync — moves the object to match what the server decided.
    • NullTick Rotation Sync — turns the object to match server-agreed facing.
  3. Press Play. WASD moves, the camera works, and what you see is server-authoritative — not a local guess.

Prefer a ready-made rig? Tools > NullTick > Samples > Player Controller + Animator (drag-and-drop). For a full scene to poke at, import the demo games (below).

#1 gotcha — Input System. NullTick reads the new Input System only. In Project Settings > Player > Active Input Handling, pick Input System Package (or Both). Legacy-only projects won't see keyboard or mouse.

Local mode is Windows zero-setup. The bundled host is a Windows program. On macOS/Linux editors, use Live against a reachable server, or self-host (see connection notes below).

Install

Download it from your account

Start with an account. Sign in at app.nulltick.com and get the Unity package from there — it’s free, one click, and no password to choose. Your App ID and keys sit in the same place for when you point a build at a live server.

Once you have access, the package resolves from this address, and Unity’s Package Manager uses it to fetch and update:

https://github.com/notnullai/nulltick-unity-sdk.git

The package brings its own local server in Server~/, so Local mode starts a real host the moment your game connects — press Play and it works.

To update, press Update in the Package Manager. Don’t add the package a second time, and don’t put a version on the end of that address — the plain address always gives you the current release, and pinning one freezes you on a version that will never update.

Git URLs need git installed. Without it Unity reports "no git executable was found" — a tool you never chose to involve. Install git, restart Unity, and the URL resolves.

Sample content expects Unity 6000.x (URP). The Runtime depends on the Input System package. An optional Entities/ module needs com.unity.entities if you use the ECS path later.

Player

Controllers, movement & facing

You don't write netcode for locomotion. The Player Controller turns real speeds (units/s, deg/s) into server input; Movement Sync and Rotation Sync apply what the server decided. A player standing still sends almost nothing — no position updates, just an occasional keepalive.

A client cannot move itself. Your game sends rates, not coordinates; the server emits small movement steps everyone receives. Position is the server's own integral and speed is clamped server-side, so there's no coordinate on the movement wire to forge mid-game.

Styles cover FPS, third-person, top-down, click-to-move, and None for turn-based or fully custom input (see custom controllers when you need your own scheme).

Multiplayer

See a second player

Use Tools > NullTick > Two Players > Build and Launch Player 2 while the editor is playing — it builds and starts a second client for you. Once built, Launch Player 2 Again (no rebuild) is the fast path. Both clients share the local server and room, so they see each other move.

Two different computers can't use Local (the bundled host only answers this machine). Point the connection at a host you can reach, or link the project to a Live server from the Hub.

Demos

Try the genre demos

Five small finished games come with the package — optional, and nothing else needs them:

  • Arena — the playground: move, look, attack, respawn, gold, spawnable pet
  • Last Light — survival
  • Sprout Valley — farming
  • Tic-Tac-Toe — turn-based
  • Test Track — driving

Run Tools > NullTick > Import the demo games…, or pick Demo games under Samples in the Package Manager. They land in Assets/Samples/, and NullTick then offers to build their scenes — say yes and one opens ready to press Play. The scenes are built rather than shipped so they always match the components you have; open or rebuild any of them later from the Tools ▸ NullTick Demos menu the sample adds. To undo the import, delete the imported folder.

Rooms

Rooms & lobby

Rooms are who sees whom — a match, a lobby, a shard. One host runs many rooms. Join, create, and browse through the connection (or the editor dashboard):

C#
connection.JoinRoom(42);     // join (or create-on-first-join)
connection.CreateRoom();     // lobby picks the lowest free id
// Room list refresh is available from the API and the Hub

Everyone in a room sees everyone else's movement. Entity ids are unique within a room.

Messages

Chat, RPC & reliable events

Besides movement, NullTick has a reliable channel for chat, RPCs, and one-shot game events — delivered in order even when packets drop.

Rule of thumb: continuous values (health, gold) → network variables. Discrete moments (death, item granted, muzzle flash) → reliable events, not a whole entity.

Network variables

Health, gold & game state

Named values everyone in the room should agree on. Declare them once; clients track the server's values. Unchanged values send nothing.

  1. Declare a schema. Assets > Create > NullTick > Var Schema — rows of name, kind, and step (smallest change worth syncing).

  2. Bind it. Assign the schema on a NullTick Vars Binder (UI/animator with no code) or on the connection and read from scripts.

  3. Server writes, clients read. Players can't cheat their own health — authority stays on the server.

The same declaration order and steps must match on every build (schema fingerprint / hash).

Spawned objects

Pets, mounts & projectiles

Anything a player creates at runtime that lives longer than a moment and moves is a first-class networked object:

  1. Mark the prefab with NullTick Network Object and an Archetype number.

  2. Register it in a NullTick Object Registry (number → prefab) on your connection.

  3. Spawn by instantiating (or Spawn() / Despawn()). Follow Owner for pets; or drive with movement input like a player.

One-shots (hit sparks, muzzle flash) should be reliable events, not objects. Demo Arena's pet spawn is a live example.

Editor tools

NullTick Hub

Tools > NullTick > NullTick Hub is the one editor window, and it is where everything lives. It checks the plugin, creates a config, drops a connection into your scene and starts the local server — then stays useful while you play: the Server tab shows live traffic under Advanced, Messaging sends chat, and Rooms lists and creates rooms without a second Play session.

Production

Going live

You can't provision a managed server yet. Managed online hosting isn't available, so there is nothing for Live to point at unless you run a host yourself. Local mode works today — the bundled host starts on Play — and that is where testing belongs for now. (Our own showcases, like CapTown in the demos, run on hosts we operate.)

When managed hosting lands, leaving Local means switching the connection to Live: the Hub’s Production settings take a one-time link code from app.nulltick.com and fills host, App ID, and API key — no hand-copied secrets. The App ID ships in the build; the API key stays on the managed tier.

Scale

ECS / DOTS (optional)

For large entity counts, add com.unity.entities and use the NullTick Entities module. Tag entities with agent/input components; inject and drain systems run Burst-compiled. Prefer the GameObject path above until you need that scale.