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