Créer un FPS #2 – Système de tir – Tuto Unity FR

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.

Recevez les dernières actus

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut