Suche…


Parameter

Parameter Einzelheiten
Ursprung Der Startpunkt des Strahls in Weltkoordinaten
Richtung Die Richtung des Strahls
maximale Entfernung Die maximale Entfernung, die der Strahl auf Kollisionen überprüfen soll
Ebenenmaske Eine Ebenenmaske, die zum selektiven Ignorieren von Kollisionen verwendet wird, wenn ein Strahl geworfen wird.
queryTriggerInteraction Gibt an, wo diese Abfrage auf Auslöser treffen soll.

Physik-Raycast

Diese Funktion wirft einen Strahl von Punkt origin in Richtung direction der Länge maxDistance gegen alle Collider in der Szene.

Die Funktion erfolgt in der origin direction maxDistance und berechnen , ob es eine collider vor dem Gameobject ist.

Physics.Raycast(origin, direction, maxDistance);

Diese Funktion druckt beispielsweise Hello World auf die Konsole, wenn innerhalb von 10 Einheiten des GameObject angehängt ist:

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

Sie können Raycasts verwenden, um zu prüfen, ob ein AI laufen kann, ohne vom Rand eines Levels zu fallen.

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
            }
    }
}

In diesem Beispiel stimmt die Richtung. Die Variable raycastRightPart ist der rechte Teil des Charakters, sodass der Raycast im rechten Teil des Charakters stattfindet. Die Entfernung beträgt das 0,6 fache des Charakters, so dass der Raycast keinen Treffer erzielt, wenn er auf den Boden trifft, der viel niedriger ist als der Boden, auf dem er gerade steht. Stellen Sie sicher, dass die Layermask nur auf Masse eingestellt ist, andernfalls werden auch andere Arten von Objekten erkannt.

RaycastHit2D selbst ist eine Struktur und keine Klasse, sodass der Treffer nicht null sein kann. Das bedeutet, dass Sie nach dem Collider einer RaycastHit2D-Variablen suchen müssen.

Raycast-Anrufe kapseln

Wenn Sie Ihre Skripts direkt mit Raycast aufrufen, kann dies zu Problemen führen, wenn Sie die Kollisionsmatrizen in der Zukunft ändern müssen, da Sie jedes LayerMask Feld LayerMask , um die Änderungen zu LayerMask . Je nach Größe Ihres Projekts kann dies zu einem großen Unternehmen werden.

Das Einkapseln von Raycast Anrufen kann Ihr Leben auf der Raycast Linie erleichtern.

Wenn man es von einem SoC- Prinzip aus betrachtet, sollte ein Spielobjekt LayerMasks wirklich nicht kennen oder interessieren. Es braucht nur eine Methode, um die Umgebung zu scannen. Ob das Raycast-Ergebnis dieses oder jenes zurückgibt, sollte für das Spielobjekt keine Rolle spielen. Es sollte nur auf die erhaltenen Informationen einwirken und keine Annahmen über die Umgebung treffen, in der es sich befindet.

Um dies zu erreichen, können Sie den LayerMask-Wert in ScriptableObject- Instanzen verschieben und diese als eine Form von Raycast-Services verwenden, die Sie in Ihre Skripts einfügen.

// 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);
    }
}

Auf diese Weise können Sie eine Reihe von Raycast-Diensten erstellen, die alle unterschiedliche LayerMask-Kombinationen für unterschiedliche Situationen aufweisen. Sie könnten eine haben, die nur Bodenkollisionen trifft, und eine andere, die Bodenkollisionen und Einbahnplattformen trifft.

Wenn Sie einmal drastische Änderungen an Ihren LayerMask-Setups vornehmen müssen, müssen Sie nur diese RaycastService-Assets aktualisieren.

Lesen Sie weiter



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow