Dans cette seconde partie du tuto pour créer un FPS, nous allons intégrer un système pour tirer sur des cibles.
Dans la première partie, nous avons vu comment créer un simple First Person Controller sur Unity. Le joueur pouvait se déplacer, regarder autour de lui avec la souris. Il pouvait aussi sauter.
Le viseur
Nous allons ajouter un point rouge au milieu de l’écran, cela nous permettra de viser plus facilement les cibles.
Créez un objet : UI > Raw Image
- Width=10 ; Height=10
- Color : rouge
- Anchor Presets : Maintenir Alt gauche + shift > Middle center
Le décor
La cible
Créez un GameObject vide : Create Empty. Renommez-le Training.
- Position : x=0 ; y=2 ; z=10
Créez un 3D Object > Cube. Renommez-le Socle.
Glissez-le dans Training.
- Position : x=0 ; y= –1 ; z=0
- Scale : x=0.5 ; y=2 ; z= 0.5
Créez un 3D Object > Cube. Renommez-le Target.
- Position: x=0 ; y=0.5 ; z=0
Glissez-le dans Training.
C’est l’objet Target qui recevra les tirs de notre arme.
Important
Créez un nouveau Layer (Calque). Dans Layer > Add Layer : Interaction
Ensuite dans Target : Layer, choisir Interaction.
Ajoutez un composant RigidBody.
Ajoutez le script ci-dessous :
ReceiveAction.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ReceiveAction : MonoBehaviour
{
//Maximum de points de vie
public int maxHitPoint = 5;
//Points de vie actuels
public int hitPoint = 0;
private void Start()
{
//Au début : Points de vie actuels = Maximum de points de vie
hitPoint = maxHitPoint;
}
//Permet de recevoir des dommages
public void GetDamage(int damage)
{
//Applique les dommages aux points de vies actuels
hitPoint -= damage;
//Si les point de vie sont inférieurs à 1 = Supprime l'objet
if(hitPoint < 1)
{
Destroy(gameObject);
}
}
}
Dupliquez Training trois fois. Sélectionnez Training et Ctrl + d.
Training (1)
Position : x= -15 ; y=2 ; z=10
Training (2)
Position : x= 16 ; y=2 ; z=10
Training (3)
Position : x= 36 ; y=2 ; z=10
Le Gun, indispensable pour créer un FPS !
Pour représenter l’arme, un cylindre fera l’affaire.
Créez un 3D Object > Cylinder, renommez-le Gun.
Glissez le dans le GameObject Player > Main Camera
- Position : x=0.5 ; y= –0.5 ; z=0.7
- Rotation : x=90 ; y=0 ; z=0
- Scale : x=0.1 ; y=0.5 ; z=0.1
Ajoutez le script ci-dessous à Gun :
Important
Après avoir copié le script, il faut renseigner Layer Mask = Interaction (dans Unity, pas dans le script 🙂 )
ShootAction.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShootAction : MonoBehaviour
{
//Dommage que le Gun inflige
public int gunDamage = 1;
//Portée du tir
public float weaponRange = 200f;
//Force de l'impact du tir
public float hitForce = 100f;
//La caméra
private Camera fpsCam;
//Temps entre chaque tir (en secondes)
public float fireRate = 0.25f;
//Float : mémorise le temps du prochain tir possible
private float nextFire;
//Détermine sur quel Layer on peut tirer
public LayerMask layerMask;
// Start is called before the first frame update
void Start()
{
//Référence de la caméra. GetComponentInParent<Camera> permet de chercher une Camera
//dans ce GameObject et dans ses parents.
fpsCam = GetComponentInParent<Camera>();
}
// Update is called once per frame
void Update()
{
// Vérifie si le joueur a pressé le bouton pour faire feu (ex:bouton gauche souris)
// Time.time > nextFire : vérifie si suffisament de temps s'est écoulé pour pouvoir tirer à nouveau
if (Input.GetButtonDown("Fire1") && Time.time > nextFire)
{
//Nouveau tir
//Met à jour le temps pour le prochain tir
//Time.time = Temps écoulé depuis le lancement du jeu
//temps du prochain tir = temps total écoulé + temps qu'il faut attendre
nextFire = Time.time + fireRate;
print(nextFire);
//On va lancer un rayon invisible qui simulera les balles du gun
//Crée un vecteur au centre de la vue de la caméra
Vector3 rayOrigin = fpsCam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 0.0f));
//RaycastHit : permet de savoir ce que le rayon a touché
RaycastHit hit;
// Vérifie si le raycast a touché quelque chose
if (Physics.Raycast(rayOrigin, fpsCam.transform.forward, out hit, weaponRange, layerMask))
{
print("Target");
// Vérifie si la cible a un RigidBody attaché
if (hit.rigidbody != null)
{
//AddForce = Ajoute Force = Pousse le RigidBody avec la force de l'impact
hit.rigidbody.AddForce(-hit.normal * hitForce);
//S'assure que la cible touchée a un composant ReceiveAction
if (hit.collider.gameObject.GetComponent<ReceiveAction>() != null)
{
//Envoie les dommages à la cible
hit.collider.gameObject.GetComponent<ReceiveAction>().GetDamage(gunDamage);
}
}
}
}
}
}
Maintenant nous avons un First Person Controller complet. On peut bouger, sauter, courir et tirer sur des cibles !
La suite : Créer un FPS # 3 Tirer sur un ennemi
Unity Site officiel : https://unity.com/fr
Suivez-nous sur Youtube.

