From 4aa4ab291470ee79d073c86c223103917c536a3c Mon Sep 17 00:00:00 2001 From: gregandev Date: Mon, 16 Jan 2023 14:03:58 +0100 Subject: [PATCH 1/3] maj la-2029 --- content/page/la-2029.md | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/content/page/la-2029.md b/content/page/la-2029.md index fa7434c..6b2b286 100644 --- a/content/page/la-2029.md +++ b/content/page/la-2029.md @@ -12,7 +12,7 @@ C'est un FPS en VR pour la plateforme Oculus Quest où l'on tire sur des termina La recharge se fait de manière manuelle avec le magasin vide à éjecter avant de se munir du nouveau magasin à sa ceinture pour
l'ammener à l'arme, ce qui recharge celle-ci.
-Le but est de rejoindre l'église en tuant un maximum de Terminators et en restant en vie : simple et éfficace! +Le but est de rejoindre la fin du niveau en tuant un maximum de Terminators et en restant en vie : simple et éfficace! ![LA 2029](../../images/jeux/CaptureTerminatorQuest3.png) @@ -29,9 +29,29 @@ C'est une version simple avec des assets téléchargées sur Sketchfab, le tout ### LE COMMENT -#### les textures +La plateforme Quest étant limité en ressources ([Spécifications Oculus Quest](https://vr-compare.com/headset/oculusquest)), il fallait trouver un moyen d'optimiser le chargement des GameObjects en cours de niveau, j'ai donc implémenté le principe "d'object pooler". -#### gestion des objets affichés +Le principe s'articule autour de deux scripts fonctionnant de concert. + +- Le premier script, l'ObjectPooler charge en début de scene un nombre défini d'instances de Gameobjects afin que ceux-ci soient disponibles et ainsi éviter des ralentissements en plein niveau. + +- Le second se place sur des "Transform" où les GameObjects sont sensé apparaître. Un composant collider va déclencher l'apparition du GameObject dès que le joueur arrive à une certaine distance. Il suffit au script de piocher dans le "pool" des GameObjects chargés en début de scène. + + ### V 2.00 @@ -48,22 +68,19 @@ puis l'explosion du batiment qui libèrera enfin l'accès vers la fin du niveau. ### VIDEOS TEST -Pour la suite du projet, j'ai décidé pour des raisons d'accéssibilité de passer sur openXR. -Le Quest faisant partie de l'écosystème Oculus soit Facebook, ce support est voué à être fermé moyennant un compte Facebook... inadmissible pour ma part, donc je fuis! - -En attendant le portage qui apportera des améliorations graphiques et au niveau du gameplay, voici quelques reviews d'internautes ayant fait l'expérience LA 2029 en VR: +En attendant le portage qui apportera des améliorations graphiques et au niveau du gameplay, voici une review sur Quest 2 : {{< youtube 8Jfupw6VqgU >}} -La version 2.00 avec le deuxième level est disponible juste en dessous en téléchargement direct +La version 2.00 avec le deuxième level est disponible un peu plus bas en téléchargement via le sideloader Sidequest. ### ROAD MAP Pour la suite du projet, on passe sur PC, on oublie Oculus et on plonge dans l'open source avec openXR pour le côté VR. -Par la même occassion, on bascule sur la dernière version d'Unity (2021.3.15), on corrige les petits bugs et on repasse les textures en standard (et non flat mobile!). +Par la même occassion, on bascule sur la dernière version d'Unity (2021.3.15), on corrige les petits bugs et on repasse les textures en standard (bye bye textures mobile sans UV maps!). -Reste à peupler un peu plus la map maintenant que l'on ai plus limité par un chipset mobile et on se lançe vers un niveau 3! +Reste à peupler un peu plus la map maintenant que l'on est plus limité par un chipset mobile et on se lançe vers un niveau 3! ![LA 2029](../../images/jeux/LA2029.png) From 16fa9782e012f6cb68cbcda998fbdf41f70be99c Mon Sep 17 00:00:00 2001 From: gregandev Date: Mon, 16 Jan 2023 14:20:23 +0100 Subject: [PATCH 2/3] maj la-2029 --- content/page/la-2029.md | 140 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 127 insertions(+), 13 deletions(-) diff --git a/content/page/la-2029.md b/content/page/la-2029.md index 6b2b286..80f6592 100644 --- a/content/page/la-2029.md +++ b/content/page/la-2029.md @@ -31,7 +31,7 @@ C'est une version simple avec des assets téléchargées sur Sketchfab, le tout La plateforme Quest étant limité en ressources ([Spécifications Oculus Quest](https://vr-compare.com/headset/oculusquest)), il fallait trouver un moyen d'optimiser le chargement des GameObjects en cours de niveau, j'ai donc implémenté le principe "d'object pooler". -Le principe s'articule autour de deux scripts fonctionnant de concert. +Le principe s'articule autour de deux scripts fonctionnant de concert: - Le premier script, l'ObjectPooler charge en début de scene un nombre défini d'instances de Gameobjects afin que ceux-ci soient disponibles et ainsi éviter des ralentissements en plein niveau. @@ -39,20 +39,134 @@ Le principe s'articule autour de deux scripts fonctionnant de concert. +##### ObjectPooler.cs + +```cs +using System.Collections.Generic; +using UnityEngine; + + +[System.Serializable] +public class ObjectPoolItem +{ + public int amountToPool; + public GameObject objectToPool; + public bool shouldExpand; +} + +public class ObjectPooler : MonoBehaviour +{ + public static ObjectPooler SharedInstance; + + public List pooledObjects; + + public List itemsToPool; + + void Awake() + { + SharedInstance = this; + } + + void Start () + { + pooledObjects = new List(); + foreach (ObjectPoolItem item in itemsToPool) + { + for (int i = 0; i < item.amountToPool; i++) + { + GameObject obj = (GameObject)Instantiate(item.objectToPool); + obj.SetActive(false); + pooledObjects.Add(obj); + } + } + } + + public GameObject GetPooledObject(string tag) + { + for (int i = 0; i < pooledObjects.Count; i++) { + if (!pooledObjects[i].activeInHierarchy && pooledObjects[i].tag == tag) { + return pooledObjects[i]; + } + } + foreach (ObjectPoolItem item in itemsToPool) { + if (item.objectToPool.tag == tag) { + if (item.shouldExpand) { + GameObject obj = (GameObject)Instantiate(item.objectToPool); + obj.SetActive(false); + pooledObjects.Add(obj); + return obj; + } + } + } + return null; + } + +} +``` + +##### ObjectLoader.cs + +```cs +using UnityEngine; +using System.Collections; + + +public class ObjectLoader : MonoBehaviour +{ + public string prefabName; + + private Transform spawnPoint; + + private GameObject clone; + + + void Start() + { + spawnPoint = this.transform; + } + + void OnTriggerEnter(Collider col) + { + if(col.transform.tag == "Player") + { + LoadObject(); + } + } + + void OnTriggerExit(Collider col) + { + if(col.transform.tag == "Player") + { + UnloadObject(); + } + } + + void LoadObject() + { + // GameObject clone = Instantiate(prefab, spawnPoint.position, spawnPoint.rotation); + // this.clone = clone; + GameObject clone = ObjectPooler.SharedInstance.GetPooledObject(prefabName); + if(clone != null) + { + clone.transform.position = spawnPoint.transform.position; + clone.transform.rotation = spawnPoint.transform.rotation; + clone.SetActive(true); + this.clone = clone; + } + } + + void UnloadObject() + { + if(clone != null) + { + clone.SetActive(false); + } + } +} +``` + ### V 2.00 Suite aux critiques positive sur SideQuest, j'ai décidé de pousser un peu plus loin la complexité des mécanismes en scriptant un objectif: From e0905c1d9c3e68db111c5eb18a73b1a686f94de5 Mon Sep 17 00:00:00 2001 From: gregandev Date: Mon, 16 Jan 2023 15:22:30 +0100 Subject: [PATCH 3/3] maj objectpooler script --- content/page/la-2029.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/content/page/la-2029.md b/content/page/la-2029.md index 80f6592..ecf3692 100644 --- a/content/page/la-2029.md +++ b/content/page/la-2029.md @@ -145,8 +145,6 @@ public class ObjectLoader : MonoBehaviour void LoadObject() { - // GameObject clone = Instantiate(prefab, spawnPoint.position, spawnPoint.rotation); - // this.clone = clone; GameObject clone = ObjectPooler.SharedInstance.GetPooledObject(prefabName); if(clone != null) {