Разработка мобильного VR-приложения для обучения/симуляций
VR-обучение работает, потому что мозг плохо различает симулированный и реальный опыт. Хирург, отрабатывающий разрез в VR, задействует те же моторные паттерны, что и в операционной. Слесарь, выполняющий регламентные работы на виртуальном оборудовании, запоминает последовательность через мышечную память. Для мобильного VR это накладывает особые требования: качество симуляции важнее графического реализма.
Типы учебных сценариев и их технические требования
Разные сценарии обучения требуют разных архитектурных решений:
| Тип симуляции | Технический фокус | Ключевые вызовы |
|---|---|---|
| Пошаговые процедуры | Последовательность, проверка шагов | State machine, fail conditions |
| Аварийные ситуации | Временное давление, стресс-тест | Таймеры, branching scenarios |
| Мягкие навыки / коммуникация | Диалоговые деревья, NPC | AI-диалог, facial animation |
| Техническое обслуживание | Манипуляция объектами | Interaction system, physics |
| Пространственная ориентация | Навигация в 3D | Spatial audio, waypoints |
Сценарный движок: State Machine для обучающих сцен
Обучающий модуль — это всегда ветвящийся сценарий с условиями успеха, ошибками и переходами. Жёсткий скрипт не работает: нужно отслеживать действия пользователя и реагировать.
// Unity: ScenarioManager на основе ScriptableObject
[CreateAssetMenu(menuName = "Training/Scenario")]
public class TrainingScenario : ScriptableObject {
public List<TrainingStep> steps;
public int currentStepIndex;
public TrainingStep CurrentStep => steps[currentStepIndex];
public StepResult ValidateAction(TrainingAction action) {
var step = CurrentStep;
if (step.RequiredAction == action) {
currentStepIndex++;
return currentStepIndex >= steps.Count
? StepResult.ScenarioComplete
: StepResult.StepComplete;
}
step.ErrorCount++;
return StepResult.WrongAction;
}
}
TrainingAction — это enum всех возможных действий пользователя: GrabObject, PressButton, NavigateTo, ConfirmChoice. Каждый шаг может иметь подсказки (hint), которые появляются при превышении ErrorCount > threshold.
Интерактивность: управление объектами в VR
Cardboard имеет один button. Для полноценной манипуляции объектами нужно либо дополнительное Bluetooth-устройство (gamepad), либо строить взаимодействие исключительно на gaze + dwell.
Gaze-based interaction для обучения:
Пользователь смотрит на объект, появляется прогрессивный индикатор (заполняющееся кольцо), после 1.5–2 секунд — активация. Для пошагового обучения это работает хорошо, потому что каждый шаг уже предопределён — не нужно разбираться с произвольной манипуляцией.
Для более сложного взаимодействия — 3DoF контроллер (Bluetooth) или переход на 6DoF платформу (Meta Quest, хотя это выходит за рамки Cardboard).
Оценка и аналитика
Обучение без измерения прогресса бесполезно. Каждое действие пользователя логируется:
public struct TrainingEvent {
public string userId;
public string scenarioId;
public int stepIndex;
public TrainingAction action;
public bool isCorrect;
public float timeSpent;
public int attemptNumber;
public DateTimeOffset timestamp;
}
Метрики на основе этих данных:
- Completion rate — до какого шага доходит пользователь
- Error rate по шагам — где чаще ошибаются (повод улучшить инструкцию или UI)
- Time-to-complete — динамика улучшения с каждым повторением
- Drop-off points — на каком шаге уходят
Данные отправляются в аналитику (Firebase, собственный бэкенд) асинхронно. Batch-отправка при восстановлении сети.
Spatial audio как инструктор
В учебных симуляциях звук — не просто фон. Голосовой инструктор озвучивает инструкции. Позиционный звук направляет внимание: звуки от целевого объекта громче, когда пользователь поворачивается в нужную сторону.
На Android — Resonance Audio SDK. На iOS — AVAudioEnvironmentNode с позиционными источниками. Субтитры обязательны: часть пользователей используют устройства без наушников.
Обновление контента без перекомпиляции
Учебные сценарии меняются: новое оборудование, обновлённые регламенты. Asset Bundle system в Unity позволяет загружать новые 3D-активы и ScenarioScriptableObject с сервера без обновления приложения в Store.
// Загрузка нового модуля обучения как Asset Bundle
async Task<TrainingScenario> LoadScenarioBundle(string bundleUrl) {
var bundle = await AssetBundle.LoadFromUriAsync(bundleUrl);
return bundle.LoadAsset<TrainingScenario>("scenario");
}
Процесс работы
Анализ обучающего контента: предметная область, типы действий, требуемые метрики.
Разработка сценарного движка: state machine, шаги, условия успеха/ошибки, подсказки.
3D-контент: создание или адаптация моделей оборудования, окружения.
Gaze interaction система, spatial audio инструктор.
Аналитика: логирование событий, отправка на бэкенд, дашборд прогресса.
Asset Bundle система для обновления модулей без релиза.
Ориентиры по срокам
Один обучающий модуль с линейным сценарием и gaze interaction — 2–4 недели. Платформа с несколькими модулями, аналитикой, LMS-интеграцией и системой обновления контента — 2–4 месяца.







