Jour 2 — 3h

La VR dans Unreal Engine 5

Configurez un projet VR dans UE 5.6, maîtrisez l'architecture VRPawn, le systeme d'input Enhanced Input et les Motion Controllers.

Configurer un projet VR dans UE 5.6
Architecture d'un projet VR
Systeme d'input VR
Motion Controllers
1

Configurer un projet VR dans UE 5.6

Deux approches pour demarrer

VR Template (recommandé)

Le template VR officiel d'Unreal est le meilleur point de depart. Il est pré-configuré et contient tout le nécessaire pour commencer immediatement.

Contenu du VR Template :

  • VRPawn — Pawn VR pré-configuré avec camera et controllers
  • VRGameMode — Game Mode dédié qui spawn le VRPawn
  • Locomotion téléportation — Systeme de deplacement par téléportation fonctionnel
  • Grab basique — Systeme de saisie d'objets
  • Menu VR — Interface in-world fonctionnelle
  • Map demo — Niveau de demonstration avec objets interactifs
  • IMC controllers — Input Mapping Context pré-mappé pour les controllers VR

Blank Project + config manuelle

Partir d'un projet vide est possible mais demande une configuration manuelle complete. Cette approche est utile pour comprendre chaque composant individuellement.

Etapes nécessaires :

  • Activer les plugins VR manuellement
  • Configurer les Project Settings un par un
  • Creer le VRPawn from scratch
  • Configurer le GameMode
  • Mapper les inputs manuellement
  • Implementer locomotion et interactions
Conseil Meme en partant d'un Blank project, etudiez le VR Template pour comprendre la structure attendue.

Plugins essentiels

Plugin Role Obligatoire ?
OpenXR Runtime multi-plateforme. Interface standard entre UE et les casques VR. Remplace les anciens plugins proprietaires (OculusVR, SteamVR). Oui — obligatoire
OpenXR Hand Tracking Extension OpenXR pour le suivi des mains sans controllers. Permet le hand tracking natif Quest. Optionnel
Meta XR Features spécifiques Quest : passthrough, scene understanding, body tracking, spatial anchors. Recommande pour Quest
Enhanced Input Systeme d'input moderne d'UE5 avec Input Actions et Mapping Contexts. Actif par défaut dans UE 5.6. Oui — actif par défaut
Setup minimal Pour demarrer un projet VR Quest : activez OpenXR + Meta XR. Enhanced Input est deja actif. OpenXR Hand Tracking est un bonus.

Project Settings : Standalone vs PC VR

Les reglages du projet different considerablement selon que vous ciblez un casque standalone (Quest) ou un PC VR (via Link ou SteamVR).

Setting Standalone (Quest) PC VR
Rendering API Vulkan DirectX 12
Forward Shading Oui (obligatoire) Optionnel (Deferred possible)
Mobile HDR
Instanced Stereo
Mobile Multi-View
Start in VR
Plateforme cible Android Windows

Forward Rendering vs Deferred Rendering

Ce choix de pipeline impacte directement les performances et les features visuelles disponibles.

Forward Rendering

  • Principe : 1 passe de rendu par objet
  • Lumieres dynamiques : ~4 par objet max
  • Features : Moins de features avancees (pas de SSAO, SSR natifs)
  • Performance : Plus performant, moins gourmand en memoire
  • Usage : Obligatoire sur Quest standalone

Deferred Rendering

  • Principe : G-Buffer (geometrie puis eclairage)
  • Lumieres dynamiques : Illimitees
  • Features : SSAO, SSR, Lumen, toutes features avancees
  • Performance : Plus couteux en GPU et memoire
  • Usage : PC VR uniquement
Regle simple Quest standalone = Forward Shading obligatoire. PC VR = Deferred possible si le GPU suit. En cas de doute, Forward est toujours le choix le plus sur en VR.

Instanced Stereo Rendering

En VR, chaque frame doit etre rendue deux fois (une par oeil). Instanced Stereo optimise ce processus en combinant les deux rendus en un seul draw call par objet.

Comment ca marche 1 draw call envoye au GPU rend les deux yeux simultanement au lieu de 2 passes séparées.
Gain de performance Reduction de ~30-40% des draw calls, ce qui allegue significativement la charge CPU.
Compatibilite Supporte par tous les casques modernes. Aucune raison de ne pas l'activer.
Toujours activer Instanced Stereo Que vous cibliez Quest ou PC VR, Instanced Stereo doit etre active. C'est une optimisation gratuite et sans compromis visuel.

Configuration Android pour Quest

Pour déployer sur Quest, des reglages spécifiques a la plateforme Android sont nécessaires dans Project Settings > Android.

Parametre Valeur
Minimum SDK API Level 29+ (Android 10)
Target SDK Version 32+ (requis par Meta Store)
Package Name com.votrestudio.votreprojet (format reverse domain)
Orientation Landscape (obligatoire pour VR)
SDK / NDK / JDK Android Studio SDK, NDK r25+, JDK 17 (configures via UE)
Mode développeur Quest Activer dans l'app Meta sur smartphone + compte développeur

Points clés — Configuration projet

VR Template = meilleur depart Pre-configure avec VRPawn, GameMode, locomotion, grab, menu et inputs mappes.
Plugins minimum OpenXR (obligatoire) + Meta XR (features Quest). Enhanced Input est actif par défaut.
Instanced Stereo + Forward Toujours activer Instanced Stereo. Forward Shading obligatoire sur standalone.
Start in VR Activer "Start in VR" et configurer la plateforme cible (Android pour Quest, Windows pour PC VR).
2

Architecture d'un projet VR

Hierarchie d'un monde VR dans Unreal

Comprendre la hierarchie des objets est fondamental. Voici comment s'organise un monde VR dans UE5 :

World | +-- GameMode (VRGameMode) | | | +-- Default Pawn Class = VRPawn | +-- VRPawn (instance dans le monde) | +-- VROrigin (Scene Component) // "Zero" du tracking | +-- Camera Component // = tete du joueur | +-- MotionController_L // main gauche | +-- Mesh / SkeletalMesh | +-- Grab Sphere (collision) | +-- Widget Interaction Component | +-- MotionController_R // main droite +-- Mesh / SkeletalMesh +-- Grab Sphere (collision) +-- Widget Interaction Component
Inclure illustration : Hierarchie Components du VRPawn

VRPawn : le coeur du joueur VR

Le VRPawn est l'acteur qui represente le joueur dans le monde virtuel. Contrairement aux jeux classiques, il herite de Pawn et non de Character.

Pourquoi Pawn et pas Character ?

  • Pas de CharacterMovementComponent — La locomotion VR est spécifique (téléportation, smooth locomotion custom)
  • Capsule inadaptee — La capsule de collision de Character n'est pas adaptee au room-scale ou le joueur se deplace physiquement
  • Locomotion VR spécifique — Les mouvements VR nécessitent des implementations sur mesure

Responsabilites du VRPawn

  • Contenir le VROrigin (reference du tracking)
  • Heberger la Camera et les Motion Controllers
  • Gerer la locomotion (téléportation, mouvement continu)
  • Etre le point d'ancrage des systemes d'interaction
  • Recevoir les Input Actions via le Player Controller

VROrigin : la reference du tracking

Le VROrigin est un Scene Component qui sert de point zéro pour tout le systeme de tracking VR. C'est le composant le plus important a comprendre.

Role du VROrigin C'est le "zéro" du tracking. La position de la camera et des controllers est calculee relativement a ce point.
Deplacer le joueur Pour deplacer le joueur dans le monde, on deplace le VROrigin (ou le Pawn entier). Jamais la camera directement.
Tracking Origin Deux modes : Eye Level (zéro = hauteur des yeux) ou Floor Level (zéro = sol, recommandé pour room-scale).

Camera Component : la tete du joueur

Le Camera Component est enfant du VROrigin. Sa position et sa rotation sont entierement pilotees par le casque VR.

REGLE ABSOLUE : NE JAMAIS forcer la position ou rotation de la camera ! La camera VR est pilotee par le casque physique du joueur. Toute tentative de forcer sa position ou rotation provoquera immediatement du motion sickness severe. Pour deplacer le joueur, deplacez le VROrigin ou le Pawn — jamais la camera.
NE JAMAIS animer la camera Les animations de camera (screenshake, cutscenes, transitions animées) sont interdites en VR. Elles provoquent des nausées immediates car le mouvement visuel ne correspond pas au mouvement physique du joueur.

Motion Controller Components : les mains

Chaque main est representee par un MotionControllerComponent enfant du VROrigin. Leur position et rotation sont trackees en temps reel.

Propriete MotionController_L MotionController_R
Motion Source Left Right
Visuel Display Device Model ou SkeletalMesh custom Display Device Model ou SkeletalMesh custom
Composants enfants Mesh, Grab Sphere, Widget Interaction Mesh, Grab Sphere, Widget Interaction
Tracking Position + rotation temps reel Position + rotation temps reel

GameMode et Player Controller en VR

GameMode VR

  • Specifie VRPawn comme Default Pawn Class
  • Player Controller custom optionnel
  • BP_VRGameMode dédié au VR
  • Ne pas melanger VR et non-VR dans le meme GameMode

Player Controller

En VR, le role du Player Controller est reduit car la rotation de la camera est geree par le tracking physique.

Utile pour :

  • Menu pause
  • Changement de niveau
  • Save / Load
  • Logique HUD (si applicable)

Structure de projet recommandée

Organisez vos fichiers de maniere claire des le depart. Voici la structure recommandée :

Content/ | +-- Blueprints/ | +-- BP_VRPawn | +-- BP_VRGameMode | +-- BP_VRPlayerController | +-- Input/ | +-- IA_Grab_L | +-- IA_Grab_R | +-- IA_Teleport | +-- IMC_VRDefault | +-- Interactables/ | +-- BP_GrabComponent | +-- BP_GrabbableBase | +-- UI/ | +-- WBP_VRMenu | +-- Maps/ +-- MAP_VRMain

Points clés — Architecture VR

VRPawn = coeur Herite de Pawn (pas Character). Contient VROrigin, Camera et Motion Controllers.
VROrigin = reference tracking Point zéro du tracking. Deplacer le joueur = deplacer VROrigin ou Pawn.
Camera pilotee par casque NE JAMAIS forcer la position/rotation de la camera. NE JAMAIS l'animer.
Motion Controllers = mains Un MotionControllerComponent par main, enfant de VROrigin. Position/rotation trackees.
GameMode dédié BP_VRGameMode lie tout ensemble. Specifie VRPawn comme Default Pawn.
Organisation propre Structurer le projet des le depart : Blueprints/, Input/, Interactables/, UI/, Maps/.
3

Systeme d'input VR

Enhanced Input System — Vue d'ensemble

UE5 utilise le meme systeme Enhanced Input pour les jeux classiques et la VR. Il repose sur 4 concepts fondamentaux :

Input Action (IA) Definition abstraite d'une action (ex: "Grab", "Teleport"). Contient le type de valeur (Bool, Float, Vector2D).
Input Mapping Context (IMC) Lie les Input Actions aux boutons physiques. Ex: IA_Grab_R → Right Grip.
Input Modifier Transforme la valeur d'entree. Ex: Dead Zone pour ignorer les petites valeurs du thumbstick.
Input Trigger Definit quand l'action se declenche. Ex: sur pression, maintien, relachement.
Inclure illustration : Enhanced Input System Pipeline

Input Actions VR typiques

Voici les Input Actions standard pour un projet VR :

Input Action Type de valeur Usage
IA_Grab_L / IA_Grab_R Bool Saisir un objet (grip gauche/droite)
IA_Trigger_L / IA_Trigger_R Float (0 → 1) Tir, selection, interaction (analogique)
IA_Teleport Bool Declencher la téléportation
IA_Move Axis2D (Vector2D) Locomotion continue (thumbstick)
IA_Turn Axis2D (Vector2D) Rotation snap/smooth (thumbstick)
IA_Menu Bool Ouvrir/fermer le menu
IA_ButtonA / IA_ButtonB Bool Actions contextuelles

Boutons des controllers Quest Touch

Controller Gauche

  • Thumbstick L — Axis2D (X/Y de -1 a 1)
  • Trigger L — Float (0 → 1, analogique)
  • Grip L — Float (0 → 1, analogique)
  • Bouton X — Bool
  • Bouton Y — Bool
  • Menu — Bool

Controller Droit

  • Thumbstick R — Axis2D (X/Y de -1 a 1)
  • Trigger R — Float (0 → 1, analogique)
  • Grip R — Float (0 → 1, analogique)
  • Bouton A — Bool
  • Bouton B — Bool
Trigger et Grip sont analogiques Contrairement a A/B/X/Y qui sont de simples boutons, le Trigger et le Grip renvoient une valeur Float entre 0 et 1. Cela permet de détecter la force de pression (utile pour les animations de mains).
Quest Touch Plus Controllers - Boutons

IMC_VRDefault — Exemple de mapping

L'Input Mapping Context (IMC) relie chaque Input Action a un bouton physique. Voici un mapping typique :

Input Action Bouton physique Modifiers
IA_Grab_R Right Grip
IA_Trigger_R Right Trigger
IA_Teleport Right Thumbstick Y Dead Zone 0.5
IA_Turn Right Thumbstick X Dead Zone 0.3
IA_ButtonA Right A
IA_ButtonB Right B
IA_Grab_L Left Grip
IA_Trigger_L Left Trigger
IA_Move Left Thumbstick Dead Zone 0.3
IA_Menu Left Menu

Ajouter l'IMC au VRPawn

L'Input Mapping Context doit etre ajoute au systeme Enhanced Input au demarrage du Pawn :

  • Dans BeginPlay, récupérer le Enhanced Input Local Player Subsystem
  • Appeler Add Mapping Context avec l'IMC souhaite (ex: IMC_VRDefault) et la priorite (0 par défaut)
Priority 0 La priorite 0 est la priorite par défaut. Si vous avez plusieurs IMC (ex: un pour la locomotion, un pour les menus), une priorite plus haute "ecrase" les mappings conflictuels de priorite inferieure.

Binder les actions dans le Blueprint

Une fois l'IMC ajoute, les Input Actions peuvent etre utilisees dans l'Event Graph du VRPawn. Chaque Input Action génère des événements selon le type de trigger :

Les 3 types de triggers principaux :

  • Started — Le bouton vient d'etre presse (1 seul appel)
  • Triggered — Le bouton est maintenu (appel continu, chaque frame)
  • Completed — Le bouton vient d'etre relache (1 seul appel)

Types de valeurs d'input

Type Valeur Usage typique
Bool true / false Boutons A, B, X, Y, Menu
Float / Axis1D 0.0 → 1.0 Trigger (gachette), Grip
Vector2D / Axis2D X: -1 → 1, Y: -1 → 1 Thumbstick (joystick analogique)

Input Modifiers courants

Les modifiers transforment la valeur brute avant qu'elle n'atteigne votre Blueprint :

Modifier Effet Usage VR
Dead Zone Ignore les petites valeurs sous un seuil Thumbsticks — recommandé 0.2 a 0.5 pour eviter les mouvements parasites
Negate Inverse l'axe (multiplie par -1) Inverser la direction d'un axe si nécessaire
Scale Multiplie la valeur par un facteur Ajuster la sensibilite de rotation ou de mouvement
Swizzle Reordonne les axes (X ↔ Y) Quand l'axe du thumbstick ne correspond pas a l'axe attendu
Dead Zone sur les thumbsticks Toujours appliquer une Dead Zone sur les thumbsticks (0.2 minimum, 0.3 a 0.5 recommandé). Sans Dead Zone, le joueur aura des micro-mouvements parasites meme au repos.

Points clés — Input VR

Meme Enhanced Input Le systeme d'input VR utilise exactement le meme Enhanced Input System que les jeux classiques UE5.
IA par fonctionnalite Creer une Input Action distincte pour chaque action du jeu (Grab, Teleport, Move, Turn, etc.).
IMC vers boutons physiques L'Input Mapping Context fait le lien entre les actions abstraites et les boutons physiques du controller.
Add Mapping Context au BeginPlay L'IMC doit etre ajoute via le Enhanced Input Subsystem dans le BeginPlay du VRPawn.
Dead Zone sur thumbsticks Toujours appliquer une Dead Zone (0.2-0.5) pour eviter les mouvements parasites.
Valeurs typees Recuperer la valeur avec le bon type : Bool pour boutons, Float pour trigger/grip, Vector2D pour thumbstick.
4

Motion Controllers

Rappel : MotionControllerComponent

Chaque main du joueur est representee par un MotionControllerComponent attache au VROrigin. La propriete Motion Source définit quelle main est trackee (Left ou Right). La position et la rotation sont mises a jour automatiquement par le tracking du casque.

Hierarchie detaillee d'un controller

Voici la structure type d'un Motion Controller avec tous ses composants enfants :

MotionController_R (MotionControllerComponent, Source: Right) | +-- SM_Hand_R (SkeletalMesh) | +-- Animations doigts (AnimBP) | +-- GrabSphere (SphereCollision, rayon ~10cm) | +-- OnComponentBeginOverlap | +-- OnComponentEndOverlap | +-- LaserPointer (StaticMesh beam) | +-- WidgetInteraction (pour UI VR) | +-- HapticFeedback (retour haptique)

Visualisation des mains

Trois approches pour afficher les mains du joueur :

Option 1 : Display Device Model

Affiche le modele natif du controller (Quest Touch). Simple a configurer, pas d'animation.

Cas d'usage Prototypage rapide, applications non-gaming, tutoriels.

Option 2 : SkeletalMesh custom

Mains 3D avec animations des doigts. Plus immersif, nécessite un AnimBP.

Cas d'usage Jeux, expériences immersives, tout projet final.

Option 3 : Pas de visuel — Le joueur tient directement un objet (arme, outil). Le mesh du controller est remplace par l'objet grab.

Animer les mains selon les inputs

Les animations de doigts sont pilotees par les valeurs analogiques des inputs :

Input Doigt(s) Valeur Animation
Trigger Index 0 = etendu, 1 = replie Blend entre pose ouverte et fermee
Grip Majeur, annulaire, auriculaire 0 = ouverts, 1 = fermes Blend entre pose ouverte et poing
Thumbstick touch Pouce 0 = leve, 1 = pose Pouce sur le stick ou leve

L'Animation Blueprint utilise les valeurs GripValue et TriggerValue (Float 0-1) pour blender entre la pose ouverte et le poing (3 doigts) ou l'index replie.

Inclure illustration : Sequence d'animation des doigts : main ouverte vers poing

Line Trace : la base de l'interaction à distance

Le Line Trace (raycasting) est fondamental en VR. Il permet de pointer, d'interagir avec l'UI, de téléporter et d'afficher un feedback laser.

Pointer Viser des objets à distance pour les selectionner ou les surbrillancer.
UI Interaction Le WidgetInteractionComponent utilise un Line Trace pour interagir avec les menus VR.
Téléportation Le Line Trace determine le point de destination de la téléportation.
Feedback laser Un beam visuel partant du controller jusqu'au point d'impact guide le joueur.

Implementation du Line Trace

Le principe : a chaque Tick, récupérer la position et la direction du controller, calculer un point final (portee 500-10000 cm), puis lancer un Line Trace By Channel. Si le trace touche un objet, surbrillancer et raccourcir le laser au point d'impact.

Parametres importants Actors to Ignore : toujours ignorer le Pawn pour eviter de se toucher soi-meme. Draw Debug : utile pendant le développement pour visualiser le trace. Trace Complex : false pour les performances, true uniquement si précision mesh requise.

Qualite du tracking et limites

Le tracking des controllers n'est pas parfait en toutes circonstances. Il est important de connaitre les situations problématiques :

Situation Probleme Solution
Mains derriere le dos Hors du champ des cameras → prediction IMU (moins précise) Design : eviter les interactions necessitant les mains hors champ
Environnement sombre Le SLAM (tracking visuel) echoue sans lumiere suffisante Jouer dans un espace correctement eclaire
Surfaces reflechissantes Les miroirs perturbent le tracking visuel Eviter les miroirs dans l'espace de jeu
Batterie faible Signal degrade, tracking moins reactif Surveiller le niveau de batterie des controllers

Donnees de pose du controller

Chaque controller expose des donnees de pose riches, accessibles via le node Get Motion Controller Data :

Donnee Type Usage
Position Vector Ou se trouve la main dans le monde
Rotation Rotator Orientation de la main (pitch, yaw, roll)
Velocite lineaire Vector Vitesse de deplacement — force de lancer, inertie objets
Velocite angulaire Vector Vitesse de rotation — détection de gestes (twist, spin)
Usage de la velocite La velocite lineaire est cruciale pour le lancer d'objets : au moment du relachement, appliquez la velocite du controller a l'objet pour un throw physiquement cohérent. La velocite angulaire permet de détecter des gestes comme un mouvement de poignet.

Bonnes pratiques Motion Controllers

Tester sur casque reel Le tracking, le confort et les interactions ne peuvent etre valides que sur un vrai casque. L'editeur ne suffit pas.
Prevoir la perte de tracking Les mains peuvent etre perdues temporairement. Ne pas crasher, prevoir un fallback (derniere position connue).
Feedback visuel permanent Les mains doivent toujours etre visibles et reactives. Le joueur a besoin de voir ses mains pour etre a l'aise.
Grab Sphere : 8-12 cm Le rayon de la sphere de grab doit etre suffisamment grand pour etre tolerant, mais pas trop pour eviter les grabs accidentels.
Pas de physique lourde sur les mains Eviter d'attacher des physics bodies complexes aux controllers. Cela cause du jitter et des comportements erratiques.
Animer les mains selon l'input Des doigts qui bougent selon le grip/trigger augmentent considerablement l'immersion et la presence.

Points clés — Motion Controllers

Un component par main MotionControllerComponent (Left/Right), enfant du VROrigin. Tracking automatique.
Line Trace = base interaction Le raycasting depuis le controller permet le pointage, l'UI, la téléportation et le feedback visuel.
Velocite pour throw/gestes Utiliser la velocite du controller pour le lancer d'objets et la détection de gestes.
Animations = immersion Animer les doigts selon le trigger/grip/thumbstick rend les mains vivantes et credibles.
Prevoir la perte de tracking Le tracking peut etre perdu (occlusion, batterie). Toujours avoir un fallback.

Recapitulatif — Jour 2

Les fondamentaux techniques pour developper en VR dans Unreal Engine 5.6

Topic Duree Points essentiels
1. Configuration projet VR Template, OpenXR + Meta XR, Instanced Stereo, Forward Shading (standalone), Start in VR
2. Architecture VR VRPawn (Pawn pas Character), VROrigin, Camera (jamais forcer), Motion Controllers, GameMode dédié
3. Input VR Enhanced Input, IA + IMC, Add Mapping Context au BeginPlay, Dead Zones, valeurs typees
4. Motion Controllers Line Trace, animations mains, velocite pour throw, tracking quality, bonnes pratiques