Overview
CryoSite is an immersive, co-op VR shooter built for the Meta Quest 3 over an eight week development cycle. Developed by a team of 4 artists and 2 developers, the game drops players into a frozen, long-abandoned Arctic research facility emitting rogue signals. Players must work together and fight their way through hostile mobs to deploy a device that can wipe the facility off the map.
My role on this project centered on the core VR multiplayer utilizing Mirror and the Unity Relay system. I also worked on the implementation of the networked AI behavior.
The Challenge
Working with a team of 4 artists and developers, we were tasked with creating a VR shooter with a futuristic theme. We also added multiplayer support, allowing players to join and play together in real-time.
We faced challenges such as synchronizing player movements across multiple devices and implementing AI behaviors for enemies. We also had to ensure that the game was optimized for performance and that the multiplayer experience was smooth and enjoyable.
The primary hurdle of CryoSite was making two notoriously difficult features work together: standalone VR and multiplayer networking.
Because the game targets the Meta Quest 3 natively, we had to keep performance in mind to prevent framerate drops, which can cause motion sickness in VR. We had to make the player tracking data work with weapon interactions, and hostile enemy AI though Mirror, while keeping the game running at a stable framerate.
Tech Stack
- Engine: Unity
- Language: C#
- Hardware Target: Meta Quest 3 (Standalone)
- Networking: Mirror + Unity Relay Service
- VR SDK: XR Interaction Toolkit
Features
- Co-op Synchronization: Real-time synchronization of player head, left hand, and right hand positions.
- Networked Enemy AI: Hostile, mutated experiments that track, stalk, and attack players synchronously across all connected clients.
- VR Gunplay: Physics-based weapon handling, reloading, and shooting mechanics tailored for VR controllers.
- Unity Relay Integration: Peer-to-peer room joining without requiring players to configure port forwarding or external server hosting.
Technical Problems & Solutions
1. Synchronizing VR Avatars
- The Problem: In standard multiplayer, you only sync a single position and rotation per player. In VR, you have to sync three distinct moving targets per person (Head, Left Hand, Right Hand). Doing this naively with standard network transforms quickly took over our Unity Relay bandwidth, causing severe latency and jittery avatar movements that ruined immersion.
- The Solution: I implemented a custom serialization system for Mirror. Instead of sending raw vector data every frame, it compressed the transform data and used Linear Interpolation on the client side to predict and fill in the visual gaps between network syncs.
- The Result: We cut the network payload per player significantly, resulting in way smoother avatar movements even when players were moving their hands rapidly.
2. Networked Enemy AI
- The Problem: In multiplayer setups, AI logic frequently suffers from “host bias,” where enemies naturally default to tracking only the host machine’s player. This meant enemies would ignore client players, breaking the co-op dynamic and leaving client players with nothing to do.
- The Solution: I made a server-authoritative targeting system. The host device acts as the central brain, running the proximity and decision-making decisions to evaluate all players in real-time. Once a target is selected, the host broadcasts the AI state change across the network.
- The Result: Removed host-bias. This ensured that client players faced the same challenge as the host, delivering a chaotic co-op experience across all devices.
Lessons Learned
- VR Performance Constraints: This project brought up the importance of optimization from Day 1. Every script, polygon, and network packet matters when you are developing for standalone VR on the Meta Quest.
- The Nuances of Unity Relay: Working with Unity Relay gave me a good understanding of modern cloud-hosted relay networks. I learned how to manage session allocation IDs, handle connection timeouts, and make clean network handshakes.