Room of Horror
Room of Horror превращает традиционный экзамен по безопасности сестринского ухода в иммерсивное VR-упражнение: обучающиеся ищут в намеренно неправильно обустроенной палате опасности, а взвешенный движок оценки с «шлюзом критичности» выставляет баллы. Это система из пяти частей — VR/десктоп-клиент на Unity, бэкенд на TypeScript, Express и PostgreSQL с WebSocket в реальном времени и панель преподавателя на React — построенная вокруг идеи «нет стандартных пациентов»: шесть разных профилей пациентов меняют то, что считается ошибкой.
- Роль
- Ведущий разработчик (студенческая команда из 7 человек)
- Год
- 2026
- Статус
- Завершён
- Категория
- Разработка ПО
- Инструменты и технологии
- UnityC#XR Interaction ToolkitTypeScriptNode.jsExpressPostgreSQLSocket.IOReact
- Ссылки
- GitHubDocumentation

Проблема
Студенты-медсёстры традиционно учатся замечать угрозы безопасности пациента через письменные экзамены или рискованную практику на реальных людях. Нет безопасного, повторяемого и измеримого способа тренировать навык «увидеть опасность с одного взгляда» — особенно для пациентов разного возраста, телосложения, языка и происхождения.
Контекст
Проектный модуль по программной инженерии в HWR Berlin, летний семестр 2026 года, разработанный совместно с Bundeswehrkrankenhaus Berlin в роли прикладного партнёра и на основе более ранней версии 1.0. На мне была примерно три четверти коммитов в команде из семи человек.
Процесс
Разнообразие как полноценные данные
Определяющим решением было относиться к разнообразию пациентов как к данным, а не как к косметике. Шесть профилей пациентов несут собственные мастер-данные, аватар и специфические для пациента сценарии ошибок, поэтому одна и та же физическая палата учит разному в зависимости от того, кто лежит на койке.
Карта пациента в VR — многостраничный планшет — содержит ошибки в документации и диалоги принятия решений, например вызов переводчика или разрешение конфликта аллергий, так что опасности — это не только физические предметы.
- Шесть профилей пациентов, каждый со своими сценариями ошибок
- 32 каталогизированные ошибки с оценкой по тяжести (1–5)
- Доступность: режимы имитации нарушений цветовосприятия и перемещение телепортом
Живой контур преподавателя
Игровой код связывает сессию в браузере с сессией в шлеме. Из веб-консоли преподаватель выбирает пациента, задаёт ошибки и устанавливает лимит промахов; слой WebSocket в реальном времени передаёт ему найденные ошибки и промахи. После раунда панель сводит результат, разбивает его по категориям и формирует обратную связь для тренера.
Ключевые решения
Взвешенная оценка со шлюзом критичности
Вместо простого подсчёта очков отдельный конвейер оценки начисляет баллы за каждую ошибку по тяжести и применяет жёсткий «критический» шлюз: пропуск критической находки проваливает в остальном пройденный раунд. Оценка и формирование обратной связи — отдельные этапы.
Один слой взаимодействия, два режима ввода
Одна и та же игра работает в VR и в обычном десктоп-режиме (мышь + клавиатура), причём логика взаимодействия с ошибками отделена от способа ввода. Это позволило тестировать и демонстрировать проект без шлема.
Реализация
Архитектура
Монорепозиторий разделяет клиент на Unity, API на Node/Express/TypeScript, панель на React, исходники 3D-моделей и сайт документации на Jekyll. Бэкенд разбит по доменам (база данных, эндпоинты, оценка, схемы, websocket, почта), конфигурация проверяется при запуске через Zod, а секреты хранятся в файлах окружения.
Поток данных: преподаватель (React) ↔ REST + Socket.IO ↔ Express/PostgreSQL ↔ клиент Unity, при этом конфигуратор комнаты на стороне Unity заново собирает физическую палату под выбранного пациента и ошибки.
Галерея


Результаты
- Достигнуты все восемь целей подписанного соглашения о задачах (MUST 2/2, SHOULD 2/2, COULD 4/4).
- Выпущены 6 профилей пациентов и 32 ошибки, взвешенные по тяжести и критичности, с наблюдением преподавателя вживую и генерируемой обратной связью после раунда.
- Передача в сторону реального практического теста со студентами-медсёстрами в больнице-партнёре.
Извлечённые уроки
- Проектирование единого слоя взаимодействия для VR и мыши с клавиатурой позволило тестировать и демонстрировать проект без шлема.
- Моделирование разнообразия как полноценных данных, а не косметических аватаров, — именно это позволило одной и той же палате учить разному.
Похожие работы

AOG Moldova
Рабочий лендинг для круглосуточной аварийной логистики авиазапчастей в Молдове — с трёхъязычным интерфейсом и бессерверной формой заявки, которая направляет срочные запросы прямо в операционную команду.
Rent Tracker
Full-stack-приложение на Flask, которое помогает небольшим арендодателям вести квартиры, жильцов и ежемесячную аренду и напоминает о неоплаченных месяцах через автоматические уведомления в Telegram и по почте.