← All side projects
Game2026 · In progress

ZumbiPizza — Slice & Survive

A co-op pizza game with zombies built in Unity, with multiplayer via FishNet.

ZumbiPizza — Slice & Survive: project cover image
TypeGame
StatusIn progress
Year2026
Stackunity, csharp, fishnet, multiplayer, steamworks

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 / IGrabbable interfaces, 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):

  1. Zumbipizza → Setup FishNet (prefab + spawn list) creates NetworkPlayer and DefaultPrefabObjects.
  2. 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.

More side projects