Prácticas · Juego VR · Unity · 2026 Internship · VR Game · Unity · 2026

American Frisbee

Dos jugadores, una sala real, un disco que vuela en la realidad virtual. Two players, a real room, a disc flying through virtual reality.

Estadio de American Frisbee en Unity: gradas, campo, postes y marcadores
RolRole
Desarrollo VRVR Development
ContextoContext
Prácticas · I. OasisInternship · I. Oasis
PlataformaPlatform
PICO 4 · Quest 3
Stack
Unity 6 · C# · NGO
EstadoStatus
FinalizadoFinished

Qué What it es is 01

American Frisbee es un juego de realidad virtual multijugador diseñado para Location-Based Entertainment (LBE): toma las reglas del fútbol americano y sustituye el balón por un frisbee virtual. Los jugadores comparten un espacio físico real y se mueven de verdad por él para pasar, interceptar y marcar. American Frisbee is a multiplayer virtual reality game built for Location-Based Entertainment (LBE): it takes the rules of American football and swaps the ball for a virtual frisbee. Players share a real physical space and actually move around it to pass, intercept and score.

La regla que define toda la dinámica es simple: no puedes moverte si tienes el frisbee. Cada posesión se convierte en una secuencia de decisiones rápidas — pasar antes de que se agote el tiempo o los pases, mientras el equipo se recoloca para abrir líneas de pase. El concepto se diseñó para formato 3v3 en un espacio de 6×4 metros, escalable según el evento. The rule that defines the whole dynamic is simple: you can't move while holding the frisbee. Each possession becomes a sequence of fast decisions — pass before time or passes run out, while the team repositions to open passing lanes. The concept was designed for 3v3 in a 6×4-meter space, scalable per event.

Lo desarrollé durante mis prácticas en Immersive Oasis, usando Unity y Claude Code como copiloto. Cada jugador aparece en la posición física real del otro dentro del espacio compartido, lo que convierte la sala en un campo de juego real: no hay locomoción por mando, te mueves tú. I developed it during my internship at Immersive Oasis, using Unity with Claude Code as a copilot. Each player appears at the other's real physical position within the shared space, turning the room into an actual playing field: there's no controller locomotion — you move yourself.

Mecánicas y Mechanics & sistemas systems 02

El lanzamientoThe throw
El disco se agarra con la mano (solo contacto directo, sin agarre a distancia). Al soltarlo, un sistema propio calcula la velocidad lineal y angular promediando los últimos fotogramas con suavizado, porque el lanzamiento por defecto de Unity no funciona con un disco sincronizado en red. Esa velocidad se transmite al servidor para que el vuelo sea idéntico para ambos jugadores. The disc is grabbed by hand (direct contact only, no distance grab). On release, a custom system computes linear and angular velocity by averaging the last frames with smoothing, because Unity's default throw doesn't work with a network-synced disc. That velocity is sent to the server so the flight is identical for both players.
Aerodinámica del discoDisc aerodynamics
El frisbee no cae como una piedra: un sistema de física propio aplica sustentación según la orientación y la velocidad del disco, simulando cómo planea un frisbee real. Rebota contra las paredes y mantiene un vuelo creíble. The frisbee doesn't drop like a stone: a custom physics system applies lift based on the disc's orientation and speed, simulating how a real frisbee glides. It bounces off walls and keeps a believable flight.
Reglas del juegoGame rules
Touchdowns al agarrar el disco en la zona rival, field goals al pasarlo por los aros, y una regla de "no moverse con el disco" que detecta si el poseedor desplaza la cabeza demasiado (aviso a 25 cm, falta a 50 cm). Turnovers por tiempo de posesión, máximo de pases, disco al suelo o fuera de límites. Touchdowns when grabbing the disc in the rival zone, field goals when passing it through the hoops, and a "don't move with the disc" rule that detects if the holder shifts their head too far (warning at 25 cm, foul at 50 cm). Turnovers on possession timeout, max passes, disc on the ground or out of bounds.
Flujo de partidaMatch flow
Cuenta atrás → partida de 5 minutos (editable) → final con ganador o empate y opción de revancha. Equipos asignados automáticamente (rojo / azul) con avatares coloreados, y un modo admin con botones de pared para iniciar, recentrar, resetear y depurar durante el testing. Countdown → 5-minute match (editable) → ending with winner or draw and a rematch option. Teams assigned automatically (red / blue) with color-coded avatars, and an admin mode with wall buttons to start, recenter, reset and debug during testing.

Diseño de Game juego design 03

Antes de programar nada, escribí un documento de concepto completo que define el juego como producto: no solo las mecánicas, sino el formato de evento, la gamificación y hasta el modelo de negocio. Estas son algunas de las capas de diseño que contempla. Before writing any code, I authored a full concept document that defines the game as a product: not just mechanics, but event format, gamification and even the business model. Here are some of the design layers it covers.

DESIGN

Sistema de Possession posesiónsystem

Cada posesión dura máximo 2 minutos y 5 pases. Al quinto pase se fuerza un intento de field goal. La posesión cambia por tiempo, pases, robo, intercepción o tras anotar — cada caso con su propio comportamiento de pausa y reinicio. Each possession lasts max 2 minutes and 5 passes. On the fifth pass, a field goal attempt is forced. Possession changes on time, passes, steal, interception or after scoring — each with its own pause and reset behavior.

DESIGN

La The intercepcióninterception

La única jugada que no pausa el juego. Quien intercepta gana la excepción de poder correr libremente con el frisbee hacia la zona rival. Premia la lectura del juego y la anticipación, y crea los momentos más dramáticos de la partida. The only play that doesn't pause the game. Whoever intercepts earns the exception of running freely with the frisbee toward the rival zone. It rewards game-reading and anticipation, and creates the match's most dramatic moments.

DESIGN

Capas de Variety variedadlayers

Power-ups (turbo, imán, congelación, pase extra), tipos de frisbee (pesado, bumerán, magnético, estropeado) y seis variaciones de portería. Sistemas opcionales y configurables que cambian el ritmo y rejugabilidad sin tocar el núcleo. Power-ups (turbo, magnet, freeze, extra pass), frisbee types (heavy, boomerang, magnetic, faulty) and six goal variations. Optional, configurable systems that change pace and replayability without touching the core.

DESIGN

Modelo de Business negociomodel

El documento incluye un análisis de ROI: modos libre y torneo, escalas grande (festivales con patrocinador) y pequeña (eventos locales), modo espectador con grada virtual y un sistema de ranking y récords que incentiva la repetición. The document includes a ROI analysis: free and tournament modes, large scale (sponsored festivals) and small scale (local events), spectator mode with virtual stands, and a ranking and records system that drives replay.

Este documento de concepto fue el puente entre la fase de diseño y el desarrollo en Unity: muchas de sus reglas (posesión, intercepción, touchdowns, field goals, regla de no moverse) se implementaron después tal cual en el prototipo. This concept document was the bridge between the design phase and Unity development: many of its rules (possession, interception, touchdowns, field goals, no-moving rule) were later implemented as-is in the prototype.

Retos Technical técnicos challenges 04

El multijugador VR con tracking físico real plantea problemas que no aparecen en un juego normal. Estos son algunos de los que resolví: Real-tracked physical multiplayer VR raises problems that don't show up in a normal game. Here are some I solved:

01

Sincronizar un disco Syncing a disc en redover network

El componente de sincronización por defecto entraba en conflicto al transferir la propiedad del disco entre jugadores. Lo sustituí por un sistema propio basado en variables de red con permiso de escritura del propietario. The default sync component conflicted when transferring disc ownership between players. I replaced it with a custom system based on owner-writable network variables.

02

Disco Disc destroy + spawndestroy + spawn

En vez de teletransportar el disco al resetear, lo destruyo y lo vuelvo a crear. Así se eliminan estados obsoletos como agarres colgados o dobles touchdowns que aparecían con el enfoque anterior. Instead of teleporting the disc on reset, I destroy and respawn it. This eliminates stale states like hanging grabs or double touchdowns that appeared with the previous approach.

03

Alineación Physical física LBELBE alignment

Los dos jugadores comparten el límite físico real entre las dos PICO, así cada uno aparece en el otro headset exactamente donde está en la sala — sin código de alineación extra. La sala real ES el campo. Both players share the real physical boundary between the two PICO headsets, so each appears in the other's headset exactly where they are in the room — with no extra alignment code. The real room IS the field.

04

Shader de Custom muros de cristalglass shader

Las transparencias de los muros se ordenaban mal frente a la UI en VR estéreo. Escribí un shader propio que fuerza la escritura de profundidad, algo que el pipeline de render revertía por su cuenta. Wall transparency sorted incorrectly against the UI in stereo VR. I wrote a custom shader that forces depth writing, something the render pipeline kept reverting on its own.

05

Descubrimiento LAN LANdiscovery

Escribir una IP dentro de unas gafas VR es horrible. Implementé descubrimiento automático del anfitrión por broadcast UDP: enciendes, pulsas JOIN y conecta solo. Typing an IP inside a VR headset is awful. I implemented automatic host discovery via UDP broadcast: you power on, hit JOIN and it connects on its own.

06

Física sin Physics without empujonesshoving

En LBE el motor no debe empujar al jugador (rompería la sincronía con su cuerpo real). Eliminé las colisiones jugador↔mundo y mantuve solo las que la mecánica necesita: mano-disco y disco-mundo. In LBE the engine must not push the player (it would break sync with their real body). I removed player↔world collisions and kept only what the mechanics need: hand-disc and disc-world.

GaleríaGallery 05

↑ Capturas reales tomadas en las gafas (PICO 4). ↑ Real captures taken in-headset (PICO 4).

StackStack 06

MotorEngine
Unity 6URPC# / IL2CPPAndroid ARM64
VR / XR
PICO Integration SDKOpenXRXR Interaction ToolkitXR Hands
MultijugadorMultiplayer
Netcode for GameObjectsUnityTransport (UDP)LAN discovery propio
GráficosGraphics
Shader GlassWall propio (HLSL)glTFastEstadio low-poly
Audio y FXAudio & FX
Sonido, partículas y vibración generados proceduralmente en código — sin assets externos de audio. Sound, particles and haptics generated procedurally in code — no external audio assets.
CopilotoCopilot
Desarrollado con Claude Code como asistente de programación a lo largo de todo el proyecto. Developed with Claude Code as a programming assistant throughout the project.

Estado Current actual status 07

El producto quedó finalizado y listo. Se probó con partidas 1v1 y 2v2 en gafas reales (PICO 4 Ultra Enterprise en la oficina y Quest 3 en casa), y todo el sistema multijugador sobre red local funcionó correctamente, sin fallos mayores. Las mecánicas, las reglas y la interfaz quedaron implementadas y completas. The product was finished and ready. It was tested with 1v1 and 2v2 matches on real headsets (PICO 4 Ultra Enterprise at the office and Quest 3 at home), and the entire local-network multiplayer system worked correctly, with no major bugs. Mechanics, rules and UI were left fully implemented.

EstadoStatus
FinalizadoFinished
MultijugadorMultiplayer
1v1 y 2v2 en LAN1v1 & 2v2 over LAN
PruebasTesting
En gafas, sin fallosOn headsets, no bugs