A cross-platform accessible virtual reality boxing application designed to provide inclusive physical activity experiences for blind and low vision users. This project implements a research-informed approach to VR accessibility, leveraging spatial audio, haptic feedback systems, and adaptive interaction paradigms.
Developed by: xAbility Design Lab, University of Illinois Urbana-Champaign
This repository contains the complete implementation of an accessible VR boxing game that eliminates visual dependencies through systematic application of non-visual interaction modalities. The system architecture emphasizes modular design patterns, allowing for extensible accessibility features and cross-platform deployment across OpenXR-compatible VR devices.
- Unity Engine: 2022.3 LTS with Universal Render Pipeline
- XR Framework: OpenXR 1.0+ with provider-agnostic implementation
- Audio Engine: Unity's 3D Audio system with custom spatial processing
- Haptic System: Native XR controller haptics with extensible feedback patterns
- Build Targets: Meta Quest 2/3, PC VR (SteamVR), Android VR
Unity Editor: 2022.3.x LTS or newer
.NET Framework: 4.8+
OpenXR Plugin: 1.4.0+
XR Interaction Toolkit: 2.3.0+
TextMeshPro: 3.0.6+
OpenXR Runtime: 1.0+
Minimum RAM: 4GB
Storage: 2GB available space
VR Headset: OpenXR compatible device
The application follows a modular architecture with clear separation of concerns:
Assets/Scripts/
├── AttackLogic/ # Combat mechanics and physics
├── BackgroundAudio/ # Ambient audio and spatial soundscapes
├── Gameplay/ # Game state management and progression
├── Menu/ # UI accessibility and navigation
├── PlayerCues/ # Non-visual feedback systems
└── Tutorial/ # Guided onboarding sequences
Singleton pattern implementation managing global game state with three distinct modes:
- LevelProgression: Adaptive difficulty scaling
- Manual: User-controlled parameter adjustment
- HardSurvival: Fixed high-difficulty challenges
Spatial Audio Engine
- 3D positional audio with HRTF processing
- Dynamic range compression for hearing aid compatibility
- Directional audio cues with configurable intensity
Haptic Feedback Framework
- Pattern-based vibration sequences
- Velocity-sensitive impact feedback
- Contextual haptic notifications
Non-Visual Navigation
- Audio-first menu systems
- Spatial UI with consistent positioning
- Voice-guided interactions
Physics-Based Interaction
- Velocity estimation for punch detection (
VelocityEstimator.cs) - Collision-based impact calculation
- Realistic boxing mechanics with accessibility adaptations
Enemy AI System
- Predictable attack patterns for accessibility
- Audio-telegraphed movements
- Adjustable reaction times
BoxingRing.unity: Main gameplay environmentTutorialScene.unity: Onboarding and training module
Assets/
├── Animations/ # Character and UI animations
├── Materials/ # PBR materials and shaders
├── Models/ # 3D assets and meshes
├── Prefabs/ # Reusable game objects
├── Sounds/ # Audio assets and spatial clips
└── Settings/ # Configuration profiles
- Clone Repository
git clone https://github.com/xability/punch-pulse.git
cd punch-pulse- Unity Project Setup
# Open Unity Hub
# Add project from disk
# Select Unity 2022.3.x LTS- Package Dependencies Ensure the following packages are installed via Package Manager:
- OpenXR Plugin
- XR Interaction Toolkit
- XR Plugin Management
- TextMeshPro
- Build Configuration
Platform: Android (Meta Quest) or PC (Windows/Linux)
Rendering: Universal Render Pipeline
Color Space: Linear
Graphics API: Vulkan (Android) / DirectX 11 (PC)
- Unity Test Framework integration
- Component-level test coverage
- Accessibility feature validation
- Headset Verification: Multi-device compatibility testing
- Accessibility Validation: Screen reader simulation
- Performance Profiling: Frame rate and latency analysis
- User Experience Testing: Blind and low vision user feedback
public interface IAccessibleComponent
{
void OnAccessibilityModeChanged(AccessibilityMode mode);
string GetAccessibilityDescription();
void TriggerAccessibilityFeedback();
}public interface IDifficultyScalable
{
void SetDifficultyLevel(float level);
float GetCurrentDifficulty();
void ResetToDefault();
}The application implements a centralized event system for loose coupling:
// Combat Events
public static event System.Action<float> OnPunchLanded;
public static event System.Action<Vector3> OnEnemyAttack;
// Accessibility Events
public static event System.Action<string> OnAudioCueTriggered;
public static event System.Action<HapticPattern> OnHapticFeedback;We welcome contributions to improve the game's accessibility and features. Please see our Contributing Guidelines for detailed information on:
- Development workflow and branch structure
- Code standards and conventions
- Pull request process
- Issue reporting templates
- Testing requirements
Those wishing to deploy the game on Meta Quest devices should follow these steps:
- navigate to the Unity Build Settings and configure the project for Android with OpenXR support.
- ensure the OpenXR Feature Groups include Meta Quest Support. OR
- run test1.apk on a connected device via Meta Quest developer mode.
# Configure build settings
Unity Build Settings > Android
XR Plug-in Management > OpenXR
OpenXR Feature Groups > Meta Quest Support
# Generate APK
Build and Run > Deploy to connected device# Windows build
Unity Build Settings > PC, Mac & Linux Standalone
Target Platform: Windows x86_64
XR Plug-in Management > OpenXR
# Build executable
Build > Generate standalone application- Development Builds: Internal testing and iteration
- Release Builds: Stable versions for end users
- Community Builds: Open source accessibility demonstrations
MIT License
This project encourages adaptation and extension for accessibility research and inclusive VR development.
Technical Issues: Create a GitHub issue with detailed reproduction steps
General Questions: Contact xAbility Design Lab
Accessibility Feedback: [email protected]
This repository supports inclusive VR development. Contributions from the accessibility community are welcomed and valued.
