
"Swapy" est un jeu de type playground en FPS, dans lequel le joueur incarne un astronaute chargé d'explorer une planète alien.
Genre: Playground, énigme
Moteur de jeu: Unity
Taille d'équipe: 6
Durée: Octobre 2024 - Mai 2025
Plateforme: PC
Moteur de jeu: Unity
Taille d'équipe: 6
Durée: Octobre 2024 - Mai 2025
Plateforme: PC
Projet annuel - fin de bachelor
Résumé de la mécanique :
Le joueur évolue sur une planète physique, il à la capacité de voler des comportements aux objets présent dans sont environnement et de les attribuer à d'autres objets ou à lui même.
Liste des comportements :



- Immuable, l'objet n'est plus affecté par les forces autour de lui, gravité comprise, et reste figé


- Impulsion, émet des ondes de choc à intervalle régulier


- Aimant, attire tout objet vers lui


- Fusée, projette l'objet dans une direction donnée à intervalle régulier


- Rebond, change la propriété physique de l'objet et le fait rebondir
Chaque objet peut porter jusqu'à deux comportement, ceux-ci auront alors des propriétés différentes.
Rôle :
J'ai été en charge de la programmation principalement de différent système le composants, ainsi que la mise en place et de la navigation de notre UI.
Comportement
Fusion Aimant et Fusée
Pour cette combinaison, l'idée était que l'objet, quand la poussée est activée, laisse une trainé derrière lui qui attire tout ce qui passe dedans



Fusion Aimant et Rebond
Pour son comportement standard, les objets dans la zone magnétique sont attirés à chaque rebond de l'objet.
Ce comportement change légèrement lorsqu'il est porté par le joueur : sa zone est réduite et ne revient à sa position initiale que lorsqu'il entre en contact avec une surface.
Ce comportement change légèrement lorsqu'il est porté par le joueur : sa zone est réduite et ne revient à sa position initiale que lorsqu'il entre en contact avec une surface.
-- WIP --
Inversion du feedback des comportements appliqué sur le joueur
Système

Interaction
Dans notre jeu, le joueur a la possibilité de réaliser diverses actions avec son environnement. Pour le moment seulement deux sont mise en place, le porter d'objet et le ramassage de collectables mais, nous avons prévue d'ajouter d'autre type d'interaction plus tard.
Afin de faciliter l'ajout de nouveau type d'interaction, j'ai mis en place un système d'interaction utilisant l'héritage.
Ainsi, chaque interaction est un enfant de InteractableObject et chacun à une fonction Interact qui exécute sa propre action. Cela nous permet d'ajouter ou de supprimer des interaction sans impacter le fonctionnement du système, qui lui exécute seulement la fonction Interact de l'objet qu'il a récupérer.
Ainsi, chaque interaction est un enfant de InteractableObject et chacun à une fonction Interact qui exécute sa propre action. Cela nous permet d'ajouter ou de supprimer des interaction sans impacter le fonctionnement du système, qui lui exécute seulement la fonction Interact de l'objet qu'il a récupérer.
Collectables
Nous disposons de deux types d'objet que le joueur peut ramasser :
- Les ressources dont le joueur aura besoin pour avancer dans son exploration et la réalisation de quête, ou qui serve uniquement de trophée.
- Des cassettes pour pouvoir changer la musique d'ambiance du jeu.
- Les ressources dont le joueur aura besoin pour avancer dans son exploration et la réalisation de quête, ou qui serve uniquement de trophée.
- Des cassettes pour pouvoir changer la musique d'ambiance du jeu.
-- WIP --


Création d'outil pour créer les données de nos objets collectables et pour moduler le contenu de l'inventaire (juste fonctionnel, pas visuel pour le moment)
Animation
Dans notre jeu, nous avons l'intention de placer des golems, chacun portant un type de comportement différent.
Pour leur donner un mouvement plus organique, notamment lors de leurs déplacements, j'ai choisi de gérer leur animation de manière procédurale.
Pour cela, j'ai utilisé le package Animation Rigging de Unity, en l’appliquant sur les modèles 3D riggés fournis par mon équipe. Ce package m’a permis d’ajouter des contraintes, notamment grâce à l’IK (Inverse Kinematics) qui permet de gérer la position d'un point final (un pied par exemple) et d'ajuster automatiquement les rigs intermédiaires. Cela permet de gérer dynamiquement des comportements comme le positionnement des pieds sur des surfaces irrégulières.
Position des jambes (basique WIP)
Un objet vide associé à chaque jambes est placé et est automatiquement placé sur la surface du sol sous lui par script. Cette objet définis la position par défaut que le pied de la jambe doit atteindre.
Lors du mouvement du golem, si la distance entre le pied et la position par défaut dépasse un seuil, on replace le pied à sa position par défaut. Le soucis est que le golem lui peut toujours être en mouvement, par conséquent une fois le pied arrivé à sa position, il est en retrait par rapport au golem. Il faut donc que la position cible de la jambe soit en avance par rapport à sa position par défaut.
Pour cela, on calcule la vélocité du golem et sa direction de marche.
Pour cela, on calcule la vélocité du golem et sa direction de marche.
Position cible =
Position par défaut + (vitesse du golem réduite * direction vers position par défaut) + (vitesse du pot * facteurAjustement)
Position par défaut + (vitesse du golem réduite * direction vers position par défaut) + (vitesse du pot * facteurAjustement)


Reste à faire :
- Gérer la position du golem par rapport à la surface du monde. Étant donné qu'il se trouve sur une planète, il doit suivre la courbure de celle-ci et rester plaqué à sa surface.
- La circulatoire du golem, c'est-à-dire la gestion de la position où il doit aller.
- La circulatoire du golem, c'est-à-dire la gestion de la position où il doit aller.
Pour la dernière tâche, j'aimerais créer un outil permettant de générer un point à un endroit où l'on clique sur la planète. Ce point sera ensuite stocké dans un tableau pour le golem.
Je ne sais pas encore si je me sers de ces points comme cibles à suivre, ou comme zones limites dans laquelle on choisira un point cible aléatoire que le golem devra atteindre.
UI


Wireframe en jeu
Inventaire : liste des slot remplit de façon procédural à partir d'un nombre donné (tous les collectables non pas encore été défini). Un rendu 3D de l'objet est affiché dans la partie information.
Inventaire : liste des slot remplit de façon procédural à partir d'un nombre donné (tous les collectables non pas encore été défini). Un rendu 3D de l'objet est affiché dans la partie information.
Musique : la musique sélectionné est placé au centre du viewport
-- WIP --
parametre
rebind
rebind