Recherche…


Paramètres

Paramètre Détails
origine Le point de départ du rayon dans les coordonnées du monde
direction La direction du rayon
maxDistance La distance maximale à laquelle le rayon doit vérifier les collisions
layerMask Masque de calque utilisé pour ignorer de manière sélective les collisionneurs lors de la projection d'un rayon.
queryTriggerInteraction Spécifie où cette requête doit frapper les déclencheurs.

Physique Raycast

Cette fonction projette un rayon depuis l' origin du point dans la direction de la longueur maxDistance contre tous les collisionneurs de la scène.

La fonction prend la direction origin maxDistance et calcule s'il y a un collider devant le GameObject.

Physics.Raycast(origin, direction, maxDistance);

Par exemple, cette fonction imprimera Hello World sur la console s'il y a quelque chose dans les 10 unités du GameObject attaché:

using UnityEngine;

public class TestPhysicsRaycast: MonoBehaviour 
{
    void FixedUpdate() 
    {
        Vector3 fwd = transform.TransformDirection(Vector3.forward);
        
        if (Physics.Raycast(transform.position, fwd, 10)) 
            print("Hello World");
    }
}

Physics2D Raycast2D

Vous pouvez utiliser les raycasts pour vérifier si un ai peut marcher sans tomber du bord d'un niveau.

using UnityEngine;
    
public class Physics2dRaycast: MonoBehaviour 
    {
        public LayerMask LineOfSightMask;
        void FixedUpdate() 
        {
            RaycastHit2D hit = Physics2D.Raycast(raycastRightPart, Vector2.down, 0.6f * heightCharacter, LineOfSightMask);
            if(hit.collider != null)
            {
                //code when the ai can walk
            }
            else
            {
                //code when the ai cannot walk
            }
    }
}

Dans cet exemple, la direction est correcte. La variable raycastRightPart est la partie droite du personnage, de sorte que le raycast se produira dans la partie droite du personnage. La distance est de 0,6 fois la hauteur du personnage, donc le rayon ne donne pas un coup quand il touche le sol beaucoup plus bas que le sol sur lequel il se trouve. Assurez-vous que le Layermask est défini sur la masse uniquement, sinon il détectera également d’autres types d’objets.

RaycastHit2D lui-même est une structure et non une classe, donc hit ne peut pas être nul; Cela signifie que vous devez vérifier le collisionneur d'une variable RaycastHit2D.

Encapsulation des appels Raycast

Si vous appelez directement vos scripts Raycast vous risquez de rencontrer des problèmes si vous devez modifier les matrices de collision à l'avenir, car vous devrez suivre tous les champs LayerMask pour les adapter. Selon la taille de votre projet, cela peut devenir une énorme entreprise.

Encapsuler les appels Raycast peut vous simplifier la vie.

À partir d'un principe SoC , un objet de jeu ne devrait vraiment pas connaître ou se soucier de LayerMasks. Il suffit d'une méthode pour scanner son environnement. Que le résultat de raycast renvoie ceci ou cela ne devrait pas avoir d'importance pour le gameobject. Il ne doit agir que sur les informations reçues et ne pas faire d’hypothèses sur l’environnement dans lequel il se trouve.

Une façon de procéder consiste à déplacer la valeur LayerMask vers des instances ScriptableObject et à les utiliser comme forme de services raycast que vous injectez dans vos scripts.

// RaycastService.cs
using UnityEngine;

[CreateAssetMenu(menuName = "StackOverflow")]
public class RaycastService : ScriptableObject
{
    [SerializeField]
    LayerMask layerMask;

    public RaycastHit2D Raycast2D(Vector2 origin, Vector2 direction, float distance)
    {
        return Physics2D.Raycast(origin, direction, distance, layerMask.value);
    }

    // Add more methods as needed

}
// MyScript.cs
using UnityEngine;

public class MyScript : MonoBehaviour
{
    [SerializeField]
    RaycastService raycastService;

    void FixedUpdate()
    {
        RaycastHit2D hit = raycastService.Raycast2D(Vector2.zero, Vector2.down, 1f);
    }
}

Cela vous permet de créer un certain nombre de services raycast, le tout avec différentes combinaisons LayerMask pour différentes situations. Vous pourriez en avoir un qui ne touche que les collisionneurs au sol, et un autre qui touche les collisionneurs au sol et les plates-formes à sens unique.

Si vous devez apporter des modifications radicales à vos configurations LayerMask, il vous suffit de mettre à jour ces ressources RaycastService.

Lectures complémentaires



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow