An online co-op horror FPS made in Unity 6. Your team is bound by an invisible "collar": if anyone strays more than 30 m from the group for 5 seconds, the whole team is thrown back to the last checkpoint. Push through hospital and lab labyrinths together, fight off zombies, a grabbing creature and magicians, and lift fallen teammates with telekinesis to bring them back to life.
- The collar:
- Distance to the team is tracked all the time. From 25 m you get a danger warning; past 30 m a 5-second countdown starts.
- Lose it and the team resets to the last checkpoint.
- World markers show where your teammates are.
- Death isn't game over:
- A downed player's body can be lifted with telekinesis, carried, thrown with a charged throw and caught mid-air, then brought to a revive station.
- Aiming at a body lifts it from a few metres away, and while throwing, an arc shows where the body will land.
- While down, the player spectates the team.
- A full team wipe shows a team-wipe screen and resets to the checkpoint.
- Enemies:
- Zombies, including ambush spawns.
- A creature ("creep") that grabs a player and drags them away.
- Magicians that attack at range.
- Movement: FPS gunplay, plus a switch to third-person parkour (with a double jump) and climbing on marked surfaces.
- Levels: hospital wings and lab shafts, partly generated by editor tools from ASCII layouts, with synced traps (sweeping lasers, blinking platforms).
- Flow:
- Menu (title screen, room browser) → Lobby (ready-up, character/skin choice with a live 3D preview) → Game.
- A pause menu and settings (video, sound, controls with key rebinding) are available throughout.
- A hospital intro cutscene (
Hospitalstart+ Timeline) is in progress.
Status: playable prototype. The full co-op loop, three enemy types, pickups, traps and sound effects work. The whole UI was redesigned in September 2026, and Windows builds were made. The levels are assembled from store art, and some test scenes and debug logging remain (see Known leftovers).
| Area | What it uses |
|---|---|
| Engine | Unity 6 (6000.0.32f1), URP 17 |
| Networking | Photon Fusion 2 (2.1.1) in Shared mode, with the master client in charge of shared world state. Own code uses about 60 [Networked] properties, 21 RPCs and master-client checks throughout. |
| Multiplayer framework | Clean Multiplayer Pro (connection, rooms, chat), heavily integrated. Its menus were replaced by the game's own UI. |
| UI | The game's own UI kit on uGUI + TextMesh Pro, with the Knewave and Coming Soon fonts |
| FPS framework | Cowsins FPS Engine (weapons, movement, interaction), bridged to the network |
| AI | Emerald AI (enemies), Unity AI Navigation |
| Characters | Malbers Animations (third-person/parkour controller), Animation Rigging |
| Rendering | FlatKit stylized shading, post-processing |
| Other | Input System, Cinemachine 3, Splines, ProBuilder, Timeline, Newtonsoft JSON; ParrelSync for multi-editor testing |
All of the integration and game code lives in Assets/_Integration/: 173 C# scripts, about 44k lines.
| System | Key scripts |
|---|---|
| The collar: team-distance rule, checkpoints, wipe screen, world markers | Multiplayer/TeamDistanceManager.cs, Multiplayer/NetworkCheckpoint.cs, TeamWipePanel.cs, WorldMarkerHud.cs |
| Down / carry / revive / spectate loop | PlayerDownState.cs, ReviveStation.cs, SpectatorController.cs, PlayerRagdoll.cs |
| Body telekinesis: lift, carry, charged throw with a predicted landing arc, mid-air catch; all tuning in one asset | BodyTelekinesis.cs, ThrowTrajectory.cs, BodyCarryHud.cs, PlayerTuning.cs |
| Networked FPS player (single-player FPS asset turned multiplayer, including damage routing) | FpsNetworkBridge.cs, RemoteWeaponVisual.cs |
| Lobby, ready-up, character/skin selection with a live 3D preview on a turntable | Multiplayer/LobbyController.cs, Multiplayer/LobbyPlayer.cs, CharacterSelection.cs, CharacterPreviewStage.cs |
| Redesigned UI: shared kit and theme (hand-drawn sprites, two fonts), title screen, room browser, lobby roster, pause menu, loading screen, error popup | UI/Core/UiKit.cs, UiTheme.cs, UI/Screens/MenuFlow.cs, RoomBrowserView.cs, LobbyView.cs, PauseController.cs, UI/Session/LoadingOverlayView.cs, ErrorPopupView.cs |
| One HUD for both controllers (first-person Cowsins, third-person Malbers), full-screen moments, world-space pickup labels | UI/Hud/HudRoot.cs, CowsinsHudSource.cs, MalbersPromptSource.cs, UI/Hud/Moments/MomentDirector.cs, UI/World/WorldUiDirector.cs, PickupLabel.cs |
| Settings (video, sound, look sensitivity, key rebinding) applied to whichever controller is live | Settings/GameSettings.cs, Settings/LocalPlayerSettings.cs, UI/Screens/SettingsView.cs |
| UI gallery: every designed screen state built from mock data and captured to PNG from the editor or the command line | UI/Gallery/UiScenarios.cs, UI/Editor/UiGalleryTools.cs, UiBatch.cs, UiThemeBuilder.cs |
| Session and loading: every machine starts loading a new scene at the same time, the connection survives long loads, and reflection probes render gradually after a load | Multiplayer/CollarSceneManager.cs, Multiplayer/CloudKeepAlive.cs, ReflectionProbeScheduler.cs |
| Host-simulated enemies that every client can resolve locally | Multiplayer/NetworkWorldActor.cs |
| Enemies | ZombieEnemy.cs, ZombieAmbushSpawner.cs, CreepGrabEnemy.cs, MagicianEnemy.cs |
| Networked pickups, VFX and traps | NetworkWeaponPickup.cs, NetworkVfxRelay.cs, NetworkedSweepingLaser.cs, NetworkedBlinkingPlatform.cs |
| First-person ↔ third-person parkour switching | DualPlayerController.cs, MalbersClimbable.cs |
| Audio (SFX library, occlusion) | Audio/GameSfx.cs, Audio/WorldAudioOccluder.cs, Editor/SfxLibraryBuilder.cs |
| Level generators | Editor/HospitalWingBuilder.cs, Editor/LabShaftBuilder.cs, Editor/GrandShaftBuilder.cs |
Integration changes to store assets:
- Cowsins:
Bullet,ExplosiveBarrel,WeaponPickeable,InteractManager,PlayerStats - Emerald AI:
EmeraldHealth - Clean Multiplayer Pro:
FusionConnection,InGame_Manager,ChatPlayer
These scripts were changed to call into the game's own code.
Own animation work: Assets/MyAnims/ holds character animations I made with the iClone / Character Creator pipeline. This repository only includes the ones the scenes use; the full library is in the separate Animation-Library repo.
Assets/_Integration/Multiplayer/TeamDistanceManager.cs: the core collar mechanic. It tracks team distance with a danger zone, a grace timer and a synchronized team reset to the last checkpoint.Assets/_Integration/FpsNetworkBridge.cs: wraps a single-player FPS framework into a networked player, including routing damage to the right authority.Assets/_Integration/Multiplayer/NetworkWorldActor.cs: the master client simulates the enemies. Each client finds its local copy of a scene object from a hash of its scene path, so scene-placed actors need no manual network IDs.Assets/_Integration/Editor/HospitalWingBuilder.cs: builds a hospital wing from an ASCII map, working out walls, corners and doors automatically.Assets/_Integration/PlayerDownState.cs+ReviveStation.cs: the carry-to-revive loop, where one player physically carries another's body across the level.Assets/_Integration/ThrowTrajectory.cs: the aiming arc is simulated with the same gravity and launch velocity as the real throw and stops at the first wall or floor, so the preview shows where the body will actually land.Assets/_Integration/UI/Hud/HudRoot.cs: each player has two controllers (Cowsins in first person, Malbers in third), and each came with its own HUD. This single HUD replaces both. It reads their data and events rather than their UI.Assets/_Integration/Multiplayer/CloudKeepAlive.cs: loading the game scene can freeze the main thread for over 15 seconds, and Photon drops a client that goes quiet for about ten. This attaches Photon's background keep-alive to the client Fusion creates, so a slow load no longer ends the session.Assets/_Integration/Multiplayer/CollarSceneManager.cs: Fusion started the host's own scene load in the same call that announced the scene change. The host then froze for seconds before the change reached anyone else, so joining players loaded only after the host had finished. This scene manager waits a fraction of a second so the change goes out first, and every machine loads at the same time.Assets/_Integration/ReflectionProbeScheduler.cs: the game level has 58 realtime reflection probes. Each renders the whole level six times, and they all rendered on the first frame after the load. This switches them to on-demand rendering at runtime, caps their resolution, and renders them one at a time, nearest first, without changing the scene file.
| # | Scene | Purpose |
|---|---|---|
| 0 | Assets/Scenes/Menu.unity |
Main menu, room browser |
| 1 | Assets/Scenes/Game.unity |
The co-op level (hospital and lab labyrinths) |
| 2 | Assets/Scenes/Lobby.unity |
Ready-up and character selection |
| – | Assets/Scenes/Hospitalstart.unity |
Work-in-progress hospital intro cutscene (not in the build yet) |
Scenes are loaded by name. The lobby starts the match through Fusion's networked scene load, so every client follows the master client.
| Asset | Used for |
|---|---|
| Cowsins FPS Engine | Weapons, FPS movement, interaction |
| Emerald AI | Enemy AI |
| Malbers Animations | Third-person / parkour controller and animations |
| Clean Multiplayer Pro + Photon Fusion 2 | Multiplayer connection, rooms, chat and networking (its menus are replaced by the game's own UI) |
| FlatKit | Stylized shading |
| Modular Tunels, ToonScapes, Hivemind Horror Hospital, CatStudio mining tunnel, AK Studio Art | Level art (tunnels, hospital, labs) |
| Creep Horror Creature, Scary Zombie Pack | Enemy models |
| RVFX Blood, Gabriel Aguiar VFX, Lite Magic Pack | Visual effects |
Meshy AI imports (Assets/MeshyImports) |
AI-generated models |
| TextMesh Pro; Knewave and Coming Soon fonts (Google Fonts) | UI text and lettering |
This public repository is a showcase. It contains the documentation and the 173 source files I wrote for this project. The complete project, including licensed third-party assets that cannot be redistributed, is kept in a private repository.
Copyright © Omer Avcioglu (McHunter Studio). All rights reserved. Viewing only; see LICENSE.