unity3d
Raycast
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.