Premier commit du cinquième front. Trois parties : - `unity/MyInfoMateVR/` : le projet Unity (6000.0.83f1, URP, Meta XR SDK 205), un APK unique pour tous les clients. Menu flottant à sélection au regard, appairage, chargement de scène GLB, POI, cache de contenu, télémétrie. - `unity-overlay/` : les mêmes scripts à recopier sur un projet Unity neuf, avec les pièges rencontrés consignés dans son README. - `viewer/` : viewer et éditeur de scène web autonome (Vite, TypeScript, three.js), partagé avec les autres fronts. - `docs/` : état des lieux, setup Unity, décisions d'architecture et plan d'exécution en 9 étapes. La scène est décrite par un `scene.json` poussé par `adb push` : l'app le préfère à celui embarqué dans l'APK. Les binaires (GLB, textures de l'échantillon Sponza, DLL Meta XR) passent par Git LFS dès ce premier commit — les y faire entrer après coup demanderait de réécrire l'historique. Les artefacts régénérés par l'éditeur et par CMake (`Library/`, `.utmp/`, Burst debug) sont ignorés. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
13 KiB
Phase 0 — Setup Unity pour Meta Quest, à partir de zéro
Écrit pour quelqu'un qui n'a jamais ouvert Unity. Chaque chemin de menu est donné en entier.
⚠️ Unity n'est pas installé sur cette machine (vérifié le 2026-08-31, toujours vrai). Je ne peux donc rien compiler ni tester : ce guide est vérifié sur la doc et l'expérience du SDK, pas par une exécution. Compte 2 à 4 allers-retours sur les versions de packages Meta, qui bougent vite d'une release à l'autre.
⚠️ Les numéros de version ci-dessous sont ceux que je connais. Avant d'installer, ouvre la page de compatibilité Meta (
developers.meta.com→ Unity → Requirements) et prends la version d'Unity qui y est marquée recommandée. Si elle diffère, c'est elle qui gagne, pas ce document.
Ce que je peux produire, et ce que tu dois cliquer
| Je peux générer en fichier | Tu dois le faire à la main dans l'éditeur |
|---|---|
Packages/manifest.json (la liste des packages) |
Installer Unity Hub et Unity |
Tous les scripts C# (Assets/Scripts/**) |
Créer le projet (le template) |
| Un script d'éditeur qui construit la scène par code | Le premier clic sur Build And Run |
.gitignore Unity |
Activer le mode développeur sur le casque |
Les fichiers de configuration texte lisibles (.asmdef, JSON) |
Les cases de Project Settings (voir §5) |
| — | Les cases de XR Plug-in Management (§6) |
Pourquoi je ne génère pas les ProjectSettings/*.asset ni les .unity : c'est du YAML Unity
avec des GUID et des fileID internes. Écrit à la main, ça produit un projet qui s'ouvre mais
dont un réglage sur deux est silencieusement faux — le pire des cas, parce que ça ne plante pas.
Les réglages se font à l'écran, une fois, en 15 minutes. La scène, en revanche, je peux la
construire par code via un script d'éditeur ([MenuItem]) : c'est lisible, versionnable et
rejouable.
1. Installer Unity Hub et Unity
- Télécharge Unity Hub :
unity.com/download. C'est le lanceur ; Unity lui-même s'installe depuis lui. - Crée un compte Unity (gratuit) et prends la licence Personal dans le Hub : Hub → icône compte (haut droite) → Manage licenses → Add → Get a free personal license.
- Dans le Hub : Installs → Install Editor.
- Choisis une version LTS — au moment d'écrire, la ligne recommandée par Meta est Unity 6
LTS (6000.0.x). Prends la dernière
6000.0.xxf1de la liste LTS.Pourquoi LTS : support 2 ans, et surtout c'est la seule ligne que Meta teste. Une version
.a/.b(alpha/beta) te fera perdre des journées sur des bugs qui ne sont pas les tiens.
Modules à cocher — c'est l'écran à ne pas rater
À l'écran Add modules, coche :
- ☑️ Android Build Support — et déplie-le, les deux sous-modules ne sont pas cochés par
défaut selon les versions :
- ☑️ OpenJDK
- ☑️ Android SDK & NDK Tools
- ☑️ Documentation (optionnel, pratique hors ligne)
Ne coche pas iOS, WebGL, Linux : c'est des Go pour rien.
Si tu oublies un sous-module : Hub → Installs → ⚙️ sur la version → Add modules. Rien n'est perdu, mais Unity te dira « No Android module loaded » sans expliquer lequel manque.
2. Créer le projet
- Hub → Projects → New project.
- Template : 3D (Built-In Render Pipeline) ou Universal 3D (URP) ? → URP. Meta recommande URP pour Quest : le Forward+ et le rendu mono-passe stéréo y sont optimisés, et l'essentiel de la doc Meta récente le suppose. Prends Universal 3D.
- Nom du projet :
MyInfoMateVR. - Emplacement :
…/GITEA/vr-app/unity/. - Create project. Premier lancement : 2 à 5 minutes.
Tu obtiens un dossier avec
Assets/,Packages/,ProjectSettings/,Library/.Library/ne se versionne jamais — c'est du cache, plusieurs Go. Le.gitignores'en charge.
3. Le .gitignore (je le génère)
Fichier à créer à la racine de vr-app/ — voir ../.gitignore une fois généré. L'essentiel :
Library/, Temp/, Obj/, Build/, Logs/, UserSettings/, *.csproj, *.sln.
⚠️ Git LFS : les .glb, .fbx, .png et .mp4 sont des binaires lourds. Si le repo doit un
jour contenir des assets, active LFS avant le premier commit d'un binaire — après, c'est une
réécriture d'historique.
4. Les packages (je génère Packages/manifest.json)
Trois familles :
4.1 XR — installés par l'éditeur
com.unity.xr.openxr— OpenXR Plugin, la couche standard.com.unity.xr.interaction.toolkit— optionnel si tu utilises l'Interaction SDK de Meta.
Window → Package Manager → Unity Registry → chercher « OpenXR Plugin » → Install.
4.2 Meta XR SDK — le point qui bouge le plus
Meta distribue son SDK de deux façons selon les versions : par l'Asset Store (« Meta XR
All-in-One SDK ») ou par un registre npm déclaré dans manifest.json. Les packages qui comptent :
| Package | Rôle |
|---|---|
com.meta.xr.sdk.core |
Meta XR Core SDK — obligatoire : caméra, tracking, passthrough |
com.meta.xr.sdk.interaction.ovr |
Interaction SDK — raycast contrôleur et hand tracking |
com.meta.xr.sdk.all |
le méta-paquet qui tire tout (plus lourd) |
Ce que tu dois faire à la main la première fois : Window → Asset Store → chercher « Meta XR All-in-One SDK » → Add to My Assets → Open in Unity → Package Manager → My Assets → Download → Import.
Puis Unity affiche un assistant Meta XR Project Setup Tool (Edit → Project Settings → Meta XR) qui liste les réglages non conformes avec un bouton Fix / Fix All. ➡️ Utilise-le. Il applique la moitié du §5 tout seul, et il est à jour du SDK installé — donc plus fiable que ce document.
4.3 glTF — le cœur du pipeline
Ajoutés par Window → Package Manager → + (haut gauche) → Add package by name… :
| Nom exact à coller | Rôle |
|---|---|
com.unity.cloud.gltfast |
glTFast — chargement de .glb au runtime |
com.unity.cloud.ktx |
support KTX2 / Basis Universal des textures |
com.unity.cloud.draco |
géométrie compressée Draco |
com.unity.meshopt.decompress |
géométrie compressée Meshopt |
Les trois derniers sont des dépendances optionnelles de glTFast : sans eux, un GLB compressé se charge en erreur silencieuse (mesh vide, texture rose). C'est exactement le genre de panne qui coûte une demi-journée — installe-les tout de suite, même si les premiers GLB ne sont pas compressés.
5. Configurer le build Android pour Quest — écran par écran
Fais d'abord tourner le Meta XR Project Setup Tool (§4.2), puis vérifie ce qui suit. Ce que l'outil corrige, tu n'as pas à le refaire.
5.1 Passer la plateforme en Android
File → Build Profiles (Unity 6 ; File → Build Settings avant Unity 6) → sélectionne Android → Switch Platform. ⏱️ Le premier switch réimporte tous les assets : 5 à 20 minutes. C'est normal, ne l'interromps pas.
Dans le même écran : Texture Compression → ASTC.
5.2 Player Settings
Edit → Project Settings → Player, onglet Android (l'icône robot) :
| Section | Réglage | Valeur |
|---|---|---|
| Other Settings → Rendering | Color Space | Linear |
| Auto Graphics API | ❌ décoché | |
| Graphics APIs | Vulkan uniquement — supprime OpenGLES3 de la liste |
|
| Multithreaded Rendering | ☑️ | |
| Other Settings → Identification | Package Name | be.unov.myinfomate.vr (jamais le com.DefaultCompany par défaut) |
| Minimum API Level | 32 (Android 12L) — exigé par Horizon OS récent | |
| Target API Level | la plus haute proposée (34+) | |
| Other Settings → Configuration | Scripting Backend | IL2CPP (Mono ne produit pas d'APK Quest valide) |
| Target Architectures | ☑️ ARM64 seulement — décoche ARMv7 | |
| Active Input Handling | Both — le plus sûr : l'OVRInput de Meta est en legacy, le reste de l'écosystème en new Input System |
|
| Resolution and Presentation | Default Orientation | Landscape Left |
| Publishing Settings | Custom Main Manifest | ☑️ si tu dois ajouter des permissions à la main |
5.3 Quality
Edit → Project Settings → Quality : garde un seul niveau pour Android, et mets-y : Anti Aliasing = 4x Multi Sampling (le MSAA est quasi gratuit sur le GPU mobile du Quest, et c'est ce qui fait la différence entre « propre » et « ça scintille »), Shadows = Hard Shadows Only ou aucune.
6. XR Plug-in Management
Edit → Project Settings → XR Plug-in Management :
- S'il propose Install XR Plug-in Management, clique.
- Choisis l'onglet Android (l'icône robot) — ⚠️ pas l'onglet PC. C'est l'erreur n°1 : tout configurer sur PC et obtenir un APK sans VR.
- ☑️ OpenXR
- Sous OpenXR (sous-entrée du menu de gauche), onglet Android :
- Enabled Interaction Profiles → + → Oculus Touch Controller Profile
- OpenXR Feature Groups → ☑️ Meta Quest (ou Meta Quest Support selon la version)
- Un triangle jaune ⚠️ à côté d'un réglage est cliquable : il ouvre un correcteur automatique. Aucun triangle ne doit rester avant de builder.
7. Activer le mode développeur sur le casque
À faire une seule fois, mais dans cet ordre — l'étape 1 est celle qu'on oublie :
- Crée une organisation développeur :
developers.meta.com→ connecte-toi avec le compte Meta du casque → Create organization. Sans organisation, le toggle de l'étape 3 n'apparaît pas. - Application Meta Horizon sur le téléphone → Devices (ou Appareils) → sélectionne le casque → assure-toi qu'il est connecté.
- → Headset settings → Developer mode → ☑️.
- Redémarre le casque.
- Branche le casque en USB-C au PC. Mets le casque sur la tête : une popup « Autoriser le
débogage USB ? » apparaît dans le casque, pas sur le PC. Coche Toujours autoriser et
accepte. Tant que ce n'est pas fait,
adb devicesafficheunauthorized. - Vérifie côté PC :
adb devicesadbse trouve dans le SDK Android installé par Unity :C:\Program Files\Unity\Hub\Editor\<version>\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\platform-tools\Ajoute ce dossier auPATH, tu t'en serviras tous les jours.
Alternative confortable : Meta Quest Developer Hub (MQDH), l'outil desktop de Meta. Il gère l'appairage, l'installation d'APK par glisser-déposer, la capture vidéo de ce que voit le casque (précieux pour montrer une démo à un client) et les logs. Recommandé.
8. Hello World VR — le seul test qui compte
But : voir une scène en stéréo dans le casque et bouger la tête. Rien d'autre. Tant que ça ne marche pas, tout le reste est théorique.
Ce que tu fais à la main
- File → New Scene → Basic (URP) → sauvegarde en
Assets/Scenes/Hello.unity. - Supprime la Main Camera de la hiérarchie (le rig VR apporte la sienne).
- Ajoute le rig : menu Meta → Tools → Building Blocks → glisse Camera Rig dans la scène. (Si le menu Meta n'existe pas, le SDK n'est pas importé — retour au §4.2.)
- Clic droit dans la hiérarchie → 3D Object → Cube, place-le à
Position (0, 1.5, 2),Scale (0.3, 0.3, 0.3). C'est ton repère visuel. - File → Build Profiles → vérifie que
Assets/Scenes/Hello.unityest dans la liste des scènes et cochée (bouton Add Open Scenes si elle n'y est pas). - Casque branché et autorisé → Build And Run.
- Premier build : 10 à 30 minutes (IL2CPP compile tout le code natif). Les suivants : 1 à 3 min.
Critère de validation
Le cube est devant toi, en relief, et il reste immobile dans l'espace quand tu bouges la tête (pas collé au regard). Si le cube suit ta tête, le rig n'est pas correctement en place.
Panne la plus fréquente
| Symptôme | Cause |
|---|---|
| L'app s'ouvre en écran plat flottant, pas en VR | XR Plug-in Management configuré sur l'onglet PC au lieu d'Android (§6.2) |
adb: device unauthorized |
La popup d'autorisation n'a pas été acceptée dans le casque (§7.5) |
| Build échoue sur « No Android module » | Sous-modules OpenJDK / SDK-NDK non cochés (§1) |
| Écran noir au lancement | Graphics API : OpenGLES3 encore présent avant Vulkan (§5.2) |
| Tout est rose | Shader non compatible URP — l'objet vient d'un import Built-In |
9. Étape suivante immédiate
Une fois le cube visible, la vraie étape 1 du projet (cahier des charges §PHASE 3) :
- Un monde Marble généré à la main sur le site de World Labs, exporté en mesh GLB.
- Ce GLB posé dans
Assets/StreamingAssets/et chargé au runtime par glTFast — pas glissé dans la scène comme un asset d'éditeur. C'est toute la différence : le chargement runtime est ce qui permettra plus tard de télécharger un monde depuis le manager sans rebuild. - Un second GLB de personnage posé dedans, à l'échelle, avec un idle.
- Vu dans le casque.
Aucun backend n'est nécessaire pour ces quatre points — c'est ce qui les rend faisables tout de suite, en parallèle de tout le reste. Les scripts C# de chargement, je les génère quand tu me dis que le cube est passé.