DVR Simulator, mon Simulateur de drone FPV en réalité virtuelle est enfin disponible sur le store AppLab de Meta. La validation sur le store a été assez laborieuse, et c’est pourquoi cela a prit autant de temps. Je profite de ce post pour vous expliquez ce qui a ralenti la publication et comment j’ai réussi à finalement à publier le jeu.
Comparatif PC vs VR Mobile
Sur mobile VR on ne peut malheureusement pas utiliser l’outil de calibration pour utiliser sa radiocommande, c’est une limitation sur Android.. L’outil détecte des choses, mais ça ne marche pas bien. Je suis persuadé qu’on peut le faire fonctionner, mais ça demande un temps de R&D que je n’ai pas. Si un dev Android passe dans le coin et est capable de faire fonctionner SDL2# sur Android, alors ça peut probablement régler le soucis 😉
Cependant on peut streamer les valeurs d’une radiocommande configurée sur PC, sur le casque VR via l’option de streaming dans le menu. Ce n’est pas idéal car ça demande d’avoir un PC à côté… Mais c’est une première réponse.
Les maps sont moins détaillées que la version PC (qui est super chouette maintenant), mais le framerate est constant à 72fps ! Il est possible de passer le taux de rafraichissement à 120Hz et activer l’application Spacewarp pour un confort et une fluidité sans précédent 😉
Publication sur AppLab
Pour publier sur AppLab c’est assez simple, il faut que votre application respecte les standards de la plateforme. Le premier soucis que j’ai eu avec DVR Simulator est que l’application n’était pas disponible pour Meta Quest 1, pour des raisons de performance.. Et là ça a été le premier échec.
Une fois ce problème réglé, j’ai encore été refusé car par défaut la caméra est celle utilisée pour simuler les lunettes FPV, à savoir un grand écran dans le champs de vision du joueur, sans head tracking (bah oui en vrai ça se passe comme ça…). Pour palier à ce problème, j’ai donné le choix à l’utilisateur au premier démarrage de choisir ce qu’il veut comme expérience :
- Comme en vrai : Headtracking bloqué, écran 2D avec distance variable
- Comme en vrai, mais avec du head tracking : On peut le faire en vrai, mais c’est moins f’réquent, je trouve par contre que ce mode est top
- En 3D, la vraie VR, mais attention, en FPV ça peut être violent pour la tête 🙂
Après avoir republié une version comme ça, j’avais toujours des problèmes de performance.. J’ai alors pris une décision qui a coûtée à mon égo.. Mais qui a été payante !
Optimisation du projet pour mobile et PC (Technique)
Le soucis de tous mes jeux, c’est qu’ils fonctionnent partout ! Mais la scalabilité a un prix à payer trop fort aujourd’hui. Temps de compilation beaucoup trop élevés (5h sur PC, 3h sur Oculus Quest), qualité pas vraiment au rendez vous (moche sur PC, pas performant sur mobile). J’ai donc décidé de dupliquer toutes les scènes !
Mobile
- Les scènes utilisent un backing subtractive
- Pas de terrain (un mesh à la place avec un seul material en SimpleLit)
- Moins d’objets
- 1 seul asset URP avec des settings adaptés
- La génération de la depth texture consomme ENORMEMENT sur Quest, je vous recommande de la désactiver
- Switch des shaders Lit vers Simple Lit sur Quest 1
Desktop / Console
- Les scènes utilisent un backing ShadowMask (Distance Shadow Mask en qualité élevée)
- Terrain illimités avec l’asset MapMagic et ses variantes
- Plus d’objets et de complexité
- 2 assets URP
- Sans HDR, Lightcount limité, Hard Shadows
- Avec HDR, Lightcount max, Soft Shadow, Box Projection, etc… (tout est coché c’est la folie)
Pour gérer la structure de mon projet j’ai un éditeur custom qui réaliste automatiquement le setup du projet pour la cible en question (maps, préprocesseurs, settings, etc..).
Application Spacewarp sans le fork de Meta…
Bien que par défaut cette option est désactivée (car on a un 72fps constant 😛 ), je l’ai ajouté quand même car c’est quand même une chouette optimisation. L’application Spacewarp est une fonctionnalité qui permet de diviser le taux d’images par seconde par 2, tout en conservant le taux de rafraichissement du casque. Par exemple on peut viser 90hz et avoir le jeux qui fonctionne à 45fps. L’utilisateur pense que le contenu fonctionne à 90fps alors qu’en fait non. Pour nous développeurs c’est super car cela laisse une marge assez confortable. Le soucis est qu’il faut un fork pour utiliser cette fonctionnalité sur Unity.. Sauf que depuis Unity 2023, URP peut générer une pass de motion vector, requis pour l’AppSW ! Unity 2023.1 est encore en Beta quand j’écris ces lignes, mais ça marche super bien 🙂 Il faut cocher la case Application Spacewarp sur l’asset URP et activer la pass de motion vector. Voici le code que j’utilise pour faire le setup du plugin OculusXR
private void SetupOculus(GameSettings settings)
{
Unity.XR.Oculus.Utils.EnableDynamicFFR(settings.VRFFRLevel > 0);
Unity.XR.Oculus.Utils.SetFoveationLevel(settings.VRFFRLevel);
Unity.XR.Oculus.Performance.TrySetDisplayRefreshRate((float)settings.VRRefreshRate);
#if OCULUS_BUILD
if (settings.VRAppSpaceWarp)
Camera.main.depthTextureMode = DepthTextureMode.MotionVectors;
OVRManager.SetSpaceWarp(settings.VRAppSpaceWarp);
#endif
Unity.XR.Oculus.Performance.TryGetDisplayRefreshRate(out float rate);
Debug.Log(
$"Oculus Setup - FFR: {settings.VRFFRLevel}, Frequency: {settings.VRRefreshRate}, AppSpaceWarp: {settings.VRAppSpaceWarp}");
}
Le préprocesseur OCULUS_BUILD vaut true quand j’active en plus le SDK Oculus. Pour activer l’Application SpaceWarp il faut par contre impérativement avoir le plugin OculusXR et le SDK Oculus (disponible sous forme de package dans mon cas). Il n’est absolument pas nécessaire d’ajouter le prefab Oculus ou les composants OVRManager, OVRCameraRig, etc.. à votre prefab de joueur. Les fonctions qui nous intéressent sur OVRManager sont statiques 🙂
Qu’est ce qui est prévu pour la suite ?
La version publiée actuellement est la Release Candidate 4, le but est d’arriver à une version finale, sortir le jeu d’Early Access sur Steam et préparer la version 2.0. Avant ça le jeu arrivera sur Microsoft Store et sur Xbox One. Il n’est pas du tout impossible qu’il débarque aussi sur les store Pico (Pico 3 et 4) et HTC (Vive Focus 3 et HTC XR Elite). Quand à la version 2.0.. J’aurais le temps d’en reparler 😉