ZumbiPizza — Slice & Survive
A co-op pizza game with zombies built in Unity, with multiplayer via FishNet.
ZumbiPizza is a two-player co-op game made in Unity 6 (C#) where players bake pizzas inside a motorhome, deliver them to houses in a neighborhood and fight off the zombie horde drawn in by the smell, with server-authoritative multiplayer over LAN or Steam P2P using FishNet.
Unity 6 · C# · FishNet · Steamworks.NET · FishySteamworks · co-op multiplayer · first-person · URP · Cinemachine · vertical slice
What it is
Two players build pizzas in a motorhome, deliver them to houses in a neighborhood and survive the zombie horde attracted by the smell. The pitch from the design notes: Overcooked in a pizza motorhome, running from zombies that want a slice, not brains. The project is a vertical-slice prototype from a personal studio. It tests the loop of baking, delivering and throwing pizza at zombies, in local multiplayer (LAN) and over Steam.
Features
- Pizza pipeline as networked stations: ingredient box (flour) → mixing machine (dough) → assembly table (raw pizza) → oven (baked pizza, spawned as a grabbable network object). Each station only changes state on the server.
- Deliveries and score: deliver pizzas to customer houses and earn points (
DeliveryManager,CustomerHouse,ScoreManager,ScoreHud). - Drivable motorhome with a driver seat (
MotorhomeController,DriverSeat). - Zombie horde: a spawner that speeds up as the motorhome’s smell level rises, with a capped pool and chase AI.
- Pizza throwing: throw pizzas at zombies, with a dotted arc preview that turns red on collision, and a slow-motion effect when a zombie bites.
- Interaction and grab system:
IInteractable/IGrabbableinterfaces, an interaction manager and world hints. - Five play modes from the main menu: 2P local, LAN host/join, Steam host/join.
Tech stack
| Technology | Version | Used for |
|---|---|---|
| Unity | 6000.5.1f1 | Engine (ProjectSettings/ProjectVersion.txt) |
| FishNet | 4.7.2 (embedded) | Server-authoritative multiplayer (Packages/com.firstgeargames.fishnet) |
| Steamworks.NET | embedded | Steam API binding for the P2P transport (Packages/manifest.json) |
| FishySteamworks | in repo, Assets/_Game/Plugins/FishySteamworks |
FishNet transport over Steam P2P (App ID 480, SpaceWar) |
| Unity Input System | 1.19.0 | Player input |
| Universal Render Pipeline | 17.5.0 | Render pipeline |
| Cinemachine | 3.1.7 | First-person camera |
| MCP for Unity (Coplay) | local copy in Packages/com.coplaydev.unity-mcp |
Editor automation from an AI coding agent (see MCP_SETUP.md) |
Getting started
Requirements: Unity Hub with 6000.5.1f1 installed, and the Steam client running for the Steam modes (App ID 480, SpaceWar).
Once per machine, after cloning:
powershell -ExecutionPolicy Bypass -File scripts/setup-git.ps1
This registers Git LFS and Unity SmartMerge (merge.unityyamlmerge) to reduce merge conflicts in .unity, .prefab and .asset files.
Open the project in Unity Hub, wait for the Package Manager to import the embedded packages in Packages/, then press Play from Assets/Scenes/MainMenu.unity (index 0 in Build Settings).
Editor menu helpers (from FISHNET_SETUP.md):
- Zumbipizza → Setup FishNet (prefab + spawn list) creates
NetworkPlayerandDefaultPrefabObjects. - Zumbipizza → Setup MVP (Menu + Suburb) regenerates the scenes with the network bootstrap.
Usage
Main menu modes:
| Button | What it does |
|---|---|
| 2P LOCAL | Offline, loads WedScene (runs as a loopback host so networked gameplay still initializes) |
| HOST LAN | Host + local client, on Tugboat’s default port |
| ENTRAR LAN (join LAN) | Client, enter the host’s IP |
| HOST STEAM | P2P host, shows your SteamID64 on screen |
| ENTRAR STEAM (join Steam) | Client, paste the host’s SteamID64 |
Valve limitation: two instances on the same PC cannot connect to each other over Steam. Use LAN for local testing. Steam needs two machines (or two accounts on different machines).
| Key | Action |
|---|---|
| WASD | Move / drive |
| Mouse | Look |
| E | Interact / hold |
| F | Grab / release |
| Q | Throw pizza |
How it works
NetworkSessionBootstrap (a DontDestroyOnLoad object created in MainMenu) picks the transport: Tugboat for LAN/offline or FishySteamworks for Steam. It always switches scenes through FishNet’s SceneManager, never Unity’s, so remote clients receive the scene and PlayerSpawner fires (Assets/Scripts/Network/NetworkSessionBootstrap.cs).
The server is authoritative. Pizza assembly, throwing (PizzaThrower, through a ServerRpc with distance validation) and zombie spawning run only on the host, and NetworkObjects sync to clients (Assets/Scripts/Throw/PizzaThrower.cs). Players send input through ServerRpcs.
GameManager holds the gameplay references (motorhome, deliveries, zombie spawner, HUD) set up at scene boot (Assets/_Game/Scripts/Core/GameManager.cs). ZombieSpawner uses a simple timer that speeds up as the motorhome’s smell level rises, with a pool cap. A comment in the code marks it as a simplified version without scheduled waves (Assets/Scripts/Zombies/ZombieSpawner.cs).
Project structure
Assets/
Scenes/ MainMenu.unity, WedScene.unity
Scripts/
Interaction/ IInteractable, IGrabbable, InteractionManager, GrabManager
Network/ NetworkSessionBootstrap, GameplaySceneBootstrap, settings
Player/ FirstPersonController, Cinemachine first-person setup
Throw/ PizzaThrower, PizzaProjectile, ThrowPreview
UI/ MainMenuController, SlowMoController, FishNet debug menu
Zombies/ ZombieSpawner, ZombiePool, ZombieChaseAI
_Game/
Scripts/ Core, Pizza, Motorhome, World (deliveries), UI, Editor tools
Plugins/ FishySteamworks transport
Packages/ Embedded FishNet, Steamworks.NET, MCP for Unity
scripts/setup-git.ps1 Git LFS + Unity SmartMerge setup
vault/ Obsidian vault: game design document (Portuguese) and tasks
FISHNET_SETUP.md Multiplayer setup notes (Portuguese)
MCP_SETUP.md MCP for Unity setup notes (Portuguese)
Status
Working: main menu with the 5 modes (2P local, LAN host/join, Steam host/join), the bake → deliver → score loop, zombies spawning in response to smell, and throwing pizza at zombies.
Simplified on purpose (marked ponytail: in the code): ZombieSpawner is a timer + pool without scheduled waves or progressive difficulty. PizzaThrower has no aim-assist cone and no inventory slot system.
Not done yet (listed as next steps in FISHNET_SETUP.md): a native Steam lobby with friend invites, visible motorhome and zombie sync on the client, and “parrel sync” testing across two editors.
Design docs
The full game design document (in Portuguese) lives in the Obsidian vault under vault/zumbipizza/GDD/. It covers the overview, game loop, mechanics, co-op roles, world, systems (pizza assembly, deliveries, horde, random events, economy), UI, art, audio, MVP scope, roadmap and risks.
License
All rights reserved.



