Розроблення мобільного VR-додатку для навчання/симуляцій
VR-навчання працює, тому що мозок погано розрізняє симульований та реальний досвід. Хірург, що відпрацьовує розріз у VR, задіює ті ж моторні паттерни, що й в операційній. Слюсар, що виконує регламентні роботи на віртуальному обладнанні, запам'ятовує послідовність через м'язову пам'ять. Для мобільного VR це накладає особливі вимоги: якість симуляції важливіша за графічний реалізм.
Типи навчальних сценаріїв та їх технічні вимоги
Різні сценарії навчання потребують різних архітектурних рішень:
| Тип симуляції | Технічний фокус | Ключові виклики |
|---|---|---|
| Пошаговий процес | Послідовність, перевірка кроків | State machine, fail conditions |
| Аварійні ситуації | Часовий тиск, stress-test | Таймери, branching scenarios |
| Soft skills / комунікація | Діалогові дерева, 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. Кожний крок може мати підказки, що з'являються при перевищенні ErrorCount > threshold.
Інтерактивність: управління об'єктами у VR
Cardboard має одну кнопку. Для повноцінної маніпуляції об'єктами потрібно або додаткове Bluetooth-пристрій (gamepad), або будувати взаємодію виключно на gaze + dwell.
Gaze-based interaction для навчання:
Користувач дивиться на об'єкт, з'являється progress indicator (заповнюючееся кільце), після 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, власний backend) асинхронно. 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 інструктор.
Аналітика: логування подій, відправка на backend, дашборд прогресу.
Asset Bundle система для оновлення модулів без релізу.
Оцінка часу
Один навчальний модуль з лінійним сценарієм та gaze interaction — 2–4 тижні. Платформа з кількома модулями, аналітикою, LMS-інтеграцією та системою оновлення контенту — 2–4 місяці.







