Raycast & tir

Sur cette page tu apprendras ce qu’est le raycast et comment l’ajouter à ton projet. 

C’est quoi un Raycast, et pourquoi on tire avec?

Le raycast c’est un laser invisible et intouchable que l’on peut faire partir de n’importe ou et dans n’importe quelle direction. Unity peut détecter tous les éléments touchés par ce laser, et nous donner les informations de ces éléments.

Comme ce laser n’est pas lié à un objet physique, il n’est pas dépendant des propriétés physiques non plus. Ce qui veut dire qu’il ne risque pas d’échouer, de rater une collision, ou de partir trop vite ou pas assez vite.

Le script

Le Raycast le plus simple ce fait ainsi:
ray = new Ray(shootOrigin.position, shootOrigin.forward);
 
if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerMask)) {
 
}

On commence par créer le laser, le ray. On lui donne une origine et une direction

Ici l’origine est un objet au choix (shootOrigin), et la direction est l’avant de cet objet.

Puis on utilise un “if” pour voir ce que le raycast a touché. Les paramètres en parenthèse ne sont pas tous obligatoires, seulement les deux premiers, mais voyons un peu a quoi ils servent tous:

  • ray: le laser à utiliser
  • out hit: pour stocker les infos sur les objets touchés
  • Mathf.Infinity: la distance maximum du laser (ici l’infinie)
  • LayerMask: si on veut exclure certains objets de la détection, on peut les mettre sur un “layer” et dire au raycast d’ignorer ce layer

Comme le Raycast est un élément de détection lié à des collisions, il vaut mieux l’utiliser dans la fonction FixedUpdate. Cette dernière fonctionne comme Update, mais est plus stable.
Cependant ce n’est pas toujours possible car des fois il faut l’associer à des inputs, et les inputs eux fonctionnent mieux dans Update. Il faut choisir au cas par cas. (priorité aux inputs, toujours)

Dans le cas du tir, le raycast fonctionne de paire avec SendMessage. Ce dernier permet de déclencher la fonction d’un objet touché par le raycast, et donc de lui faire faire ce qu’on veut.

Le message du Raycast.

Les 3 paramètres sont: la fonction à activer, qui l’a activé, et si un objet n’a pas la bonne fonction alors ne rien faire.

hit.transform.gameObject.SendMessage(« OnRaycastHit », « Player », SendMessageOptions.DontRequireReceiver);

La réaction de l’objet touché, que l’on met dans un script dudit objet

void OnRaycastHit(string hitter) {
Debug.Log(« Hit »);
}

Exemple dans un script (qui génère des morceaux depuis une liste au moment du hit)

void OnRaycastHit(string info) {
        transform.GetChild(0).gameObject.SetActive(false);//cache la créature de la vue
            GetComponent<Collider>().enabled = false;//empeche la créature de se faire encore tirer pendant le boom
            for (int i = 0; i < nombreMorceaux; i++) { //pour autant de morceaux que l’on veut generer
                int randomIndex = Random.Range(0, listeMorceaux.Length); //prendre un morceau dans la liste au pif
                //generer un morceau
                GameObject randomMorceau = Instantiate(listeMorceaux[randomIndex], transform.position, transform.rotation);
                //lui donner une force pour le projeter et le faire tourner sur lui-même
                randomMorceau.GetComponent<Rigidbody>().AddForce(Random.insideUnitSphere * forceProjection);
                randomMorceau.GetComponent<Rigidbody>().AddTorque(Random.insideUnitSphere * forceProjection);
            }
    }

 

Retour en haut