Framework pour créer son site web en 2 minutes, et en Markdown!
https://www.gregandev.fr
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
7.5 KiB
216 lines
7.5 KiB
8 months ago
|
---
|
||
|
title: LA 2029
|
||
|
subtitle: VR Shooter
|
||
|
comments: false
|
||
|
---
|
||
|
|
||
|
![LA 2029](../../images/jeux/CaptureTerminatorQuest00.png)
|
||
|
|
||
|
### ![Typing SVG](https://readme-typing-svg.demolab.com?font=Anton&pause=1000&size=40&random=false&repeat=5000&color=343A40&width=435&height=70&lines=LE+PRINCIPE)
|
||
|
|
||
|
C'est un FPS en VR pour la plateforme Oculus Quest où l'on tire sur des terminators se présentant.
|
||
|
|
||
|
La recharge se fait de manière manuelle avec le magasin vide à éjecter avant de se munir du nouveau magasin à sa ceinture pour<br>
|
||
|
l'ammener à l'arme, ce qui recharge celle-ci.<br>
|
||
|
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)
|
||
|
|
||
|
### ![Typing SVG](https://readme-typing-svg.demolab.com?font=Anton&pause=1000&size=40&random=false&repeat=5000&color=343A40&width=435&height=70&lines=LE+POURQUOI)
|
||
|
|
||
|
Je voulais tester de créer les scripts de mécanique de recharge manuelle de l'arme :<br>
|
||
|
une fois le magasin vide enlevé, on prends celui situé à gauche sur la "ceinture" et finalement celui-ci mis en place, l'arme se recharge.
|
||
|
|
||
|
L'aspect "limitation technique" vu le support mobile Quest est aussi ce qui m'a motivé pour ce projet.
|
||
|
|
||
|
Suite à la sortie du jeu Terminator Resistance, j'ai vraiment accroché avec l'ambiance que les
|
||
|
devs ont réussis à créer et étant un fan des films, je me suis lançé.<br>
|
||
|
C'est une version simple avec des assets téléchargées sur Sketchfab, le tout codé en une semaine.
|
||
|
|
||
|
### ![Typing SVG](https://readme-typing-svg.demolab.com?font=Anton&pause=1000&size=40&random=false&repeat=5000&color=343A40&width=435&height=70&lines=LE+COMMENT)
|
||
|
|
||
|
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 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.
|
||
|
|
||
|
<!--
|
||
|
![OBJECT POOLER](../../images/jeux/object-pooler.gif)
|
||
|
-->
|
||
|
|
||
|
<!--
|
||
|
|
||
|
##### 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<GameObject> pooledObjects;
|
||
|
|
||
|
public List<ObjectPoolItem> itemsToPool;
|
||
|
|
||
|
void Awake()
|
||
|
{
|
||
|
SharedInstance = this;
|
||
|
}
|
||
|
|
||
|
void Start ()
|
||
|
{
|
||
|
pooledObjects = new List<GameObject>();
|
||
|
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 = 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);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
-->
|
||
|
|
||
|
### ![Typing SVG](https://readme-typing-svg.demolab.com?font=Anton&pause=1000&size=40&random=false&repeat=5000&color=343A40&width=435&height=70&lines=V2.0)
|
||
|
|
||
|
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:
|
||
|
détruire un batiment pour libérer le passage vers la fin du niveau.
|
||
|
Pour se faire, le joueur doit se munir d'une bombe à sa ceinture pour la déposer à un endroit spécifique qui déclenchera un compte à rebours,<br>
|
||
|
puis l'explosion du batiment qui libèrera enfin l'accès vers la fin du niveau.
|
||
|
|
||
|
![SCREENSHOT1](../../images/jeux/CaptureTerminatorQuest0.jpg)
|
||
|
|
||
|
![SCREENSHOT1](../../images/jeux/CaptureTent.JPG)
|
||
|
|
||
|
![SCREENSHOT1](../../images/jeux/CaptureTerminatorQuest2.png)
|
||
|
|
||
|
### ![Typing SVG](https://readme-typing-svg.demolab.com?font=Anton&pause=1000&size=40&random=false&repeat=5000&color=343A40&width=435&height=70&lines=VIDEO+TEST)
|
||
|
|
||
|
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.0 avec le deuxième level est disponible un peu plus bas en téléchargement via le sideloader Sidequest.
|
||
|
|
||
|
### ![Typing SVG](https://readme-typing-svg.demolab.com?font=Anton&pause=1000&size=40&random=false&repeat=5000&color=343A40&width=435&height=70&lines=ROADMAP)
|
||
|
|
||
|
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 (bye bye textures mobile sans UV maps!).
|
||
|
|
||
|
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) -->
|
||
|
|
||
|
V 3.0 on the way!
|
||
|
|
||
|
### ![Typing SVG](https://readme-typing-svg.demolab.com?font=Anton&pause=1000&size=40&random=false&repeat=5000&color=343A40&width=435&height=70&lines=TELECHARGER)
|
||
|
|
||
|
Télécharger la version 2.0 pour Oculus Quest (compatible Quest 2):
|
||
|
|
||
|
[![EXTERNAL](https://custom-icon-badges.demolab.com/badge/download-badge.svg?logo=package&logoSource=feather)](https://sdq.st/a/366)
|
||
|
|
||
|
[![STORE SIDEQUEST](../../images/logos/sidequest-logo.png)](https://sdq.st/a/366)
|
||
|
|
||
|
> (Oculus Quest nécessaire ainsi que SideQuest pour l'installation)
|
||
|
|
||
|
<!-- [TELECHARGER DE GREGANDEV](../../docs/TerminatorQuest/TerminatorQuest_v2.00.apk) -->
|