Consignes à ne pas oublier

Phase 0) Former une équipe

Pour ce TP, vous devez former une équipe de deux étudiants. Utilisez le channel Discord looking-for-group, afin de trouver un coéquipier ou une coéquipière. Si vous avez de la difficulté à trouver quelqu’un, les enseignants pourront vous jumeler.

Phase 1) Créer le projet

  1. Créez un nouveau projet Unity avec le nom suivant : TP2_Nom1_Nom2. Notez que vous devez remplacer « Nom1 » et « Nom2 » avec les noms de famille des membres de l’équipe

Phase 2) Chercher les ressources externes

  1. Dans l’Asset Store, ajouter le paquet Blocky Space Fighter à votre compte.
  2. Dans le projet Unity, importer tous les fichier de ce paquet

Phase 3) Modifier et créer les prefabs

  1. Dans le paquet importé, il existe un prefab BlockyShip_Fihter; ouvrez ce prefab afin de le modifier
  2. Changez le nom du prefab pour « Player » et acceptez de renommer le fichier
  3. Assurez-vous que le « par en avant » du vaisseau correspond au « par en avant » de l’espace du monde
  4. Modifier le prefab afin d’avoir les volumes de collisions suivants :
  1. Créez un script ClickTestComponent. Écrivez une méthode private void OnMouseDown() qui écrit, dans la console, le nom du GameObject possédant cette composante. Utilisez Debug.Log(...) et l’attribut name accessible à tous les MonoBehaviour

  2. Placer un ClickTestComponent sur chaque objet du prefab possédant un collider.

  3. Faite un test du comportement de ClickTestComponent et modifier votre prefab afin d’avoir exactement les mêmes résultat que dans la vidéo suivante :

Phase 4) Physique I

  1. Ajoutez un RigidBody dans le prefab du joueur. Le joueur « au complet » doit répondre au moteur de physique
  2. Désactivez la gravité
  3. Créez une composante PushComponent qui doit :
    • Contient une méthode Push(...) qui doit prendre en paramètre un Vector3. Ce paramètre représente un vecteur de force avec une direction et une norme. Cette force doit être appliquée sur le GameObject ayant la composante. Le GameObject doit, évidemment, posséder un RigidBody, afin qu’une force soit applicable. Cette méthode servira de « commande » qui sera associée à une touche, plus tard.
    • Ajoutez d’autres méthodes/attributs, au besoin
  4. Créez un objet GameTester dans la scène. Cet objet exécutera des tests automatisés afin de valider les comportements attendus de nos composantes
  5. Créez une composante TestPushComponent et attachez-le au GameTester. Cette composante doit :
    • Dévoiler à l’inspecteur une valeur newtonPerSecond du type float (souvenez-vous: la force est un vecteur et sa norme est exprimée en Newton)
    • Appeler Push(...) de chaque PushComponent à chaque frame, mais de façon que NewtonPerSecond quantité de force additionnelle soit appliquée par seconde. La direction dans laquelle les objets doivent être poussés est leur « par en avant » locale.
    • Indices :
      • Utilisez la méthode FindObjectsOfType<T>()
      • Utilisez l’attribut .forward, disponible aux Transform, qui retourne le vecteur « par en avant » locale d’un GameObject, comme vu en classe
      • Pensez bien à la performance ici. Vous aurez à faire une boucle for dans Update() → faire une répétition à chaque frame.
  6. Réalisez le test décrit dans la vidéo suivante :

Phase 5) Physique II

  1. Créez une composante CollisonCheckComponent qui doit :
    • Faire un Debug.Log(...) lorsqu’un autre objet entre en collision avec l’objet possédant ce script. Le log doit écrire un message avec le format suivant : Autre objet {nom de l'autre objet} a entrer en collision le collider {nom du collider} de l'objet {nom de l'objet} à la position {position du point de contact}.
    • Avoir un int collisionTestingLayer modifiable via l’inspecteur
    • Faire un Debug.Log(...) du message Entrer en collision avec un objet de la couche {collisionTestingLayer}.
    • Regardez la vidéo suivante pour un exemple des comportements attendus :

Phase 6) Gameplay

Ajouter un GameObject représentant un canon, à votre prefab de joueur. Ce canon devra tirer des projectiles, alors créez un prefab pour pour le canon et aussi pour un projectile. Vous pouvez réutilliser le code fait en classe.

Utilisez l’approche d’association touches→commandes vue en classe pour contrôler plusieurs joueurs. Pour ce faire, vous devriez adapter l’InputManagerComponent fait ensemble.

Pour ce jeu, chaque joueur devra avoir 9 touches associées. 6 touches sont pour pivoter le vaisseau, deux touches sont pour accélérer/décélérer et une dernière touche est pour tirer le canon du vaisseau. Pivoter et accélérer/décélérer sont des commandes prenant en paramètre des Vector3. Vous pouvez ajouter une ou plusieurs nouvelles composantes au prefab de joueur, pour la logique des commandes. Vous pouvez aussi ajouter un tableau SerializeField de Vector3 au InputManagerComponent pour contenir les Vector3 à envoyer aux commandes. Vous devez aussi permettre aux joueurs de tirer leur canon.

Indice : Vous allez peut-être rencontrer un problème avec la direction dans laquelle vous poussez le vaisesau… Regardez transform.TransformDirection(Vector3)

Regardez la vidéo suivante pour un exemple des comportements attendus :

B O N U S (max +20 %)

Implémenter des ennemis ! Voici quoi faire :

Remise

Vous devez soumettre votre projet final dans la boite de remise sur ColNet. La date de remise est le 4 novembre, avant minuit. Vous devez remettre un fichier .zip contenant tout votre projet (sauf le dossier Library). Ce fichier .zip doit être nommez TP2_Nom1_Nom2.zip, où vous remplacez « Nom1 » et « Nom2 » par vos nom de famille. Vous perderez des points si votre fichier est mal nommé.

Si vous avez fait des points du B O N U S, écrivez ce que vous avez fait dans un fichier .txt et ajoutez ce fichier dans le .zip du projet.