Sök…


parametrar

Parameter detaljer
ursprung Strålens utgångspunkt i världskoordinater
riktning Strålens riktning
maxDistance Det maximala avståndet som strålen bör kontrollera för kollisioner
layerMask En Layer-mask som används för att selektivt ignorera Colliders när du kastar en stråle.
queryTriggerInteraction Anger var den här frågan ska träffa Triggers.

Fysik Raycast

Denna funktion kastar en stråle från punkt origin i riktning direction längd maxDistance mot alla kolliderare i scenen.

Funktionen tar i origin direction maxDistance och räkna ut om det finns en kolliderare framför GameObject.

Physics.Raycast(origin, direction, maxDistance);

Till exempel kommer denna funktion att skriva ut Hello World till konsolen om det finns något inom 10 enheter från GameObject kopplat till den:

using UnityEngine;

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

Fysik2D Raycast2D

Du kan använda strålkastningar för att kontrollera om en ai kan gå utan att falla ned från kanten på en nivå.

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

I det här exemplet är riktningen rätt. Den variabla raycastRightPart är den högra delen av karaktären, så att raycast kommer att hända vid den högra delen av karaktären. Avståndet är 0,6f gånger karaktärens höjd så att röntgenstrålningen inte ger en hit när han träffar marken som är långt lägre än marken han står på just nu. Se till att Layermask endast är markerad, annars kommer den också att upptäcka andra typer av objekt.

RaycastHit2D i sig är en struktur och inte en klass så hit kan inte vara noll; detta betyder att du måste kontrollera om det finns en radcast av en RaycastHit2D-variabel.

Inkapsla Raycast-samtal

Att Raycast dina skript ringa Raycast direkt kan leda till problem om du behöver ändra kollisionsmatriser i framtiden, eftersom du måste spåra upp varje LayerMask fält för att tillgodose ändringarna. Beroende på projektets storlek kan det bli ett stort företag.

Raycast samtal kan göra ditt liv enklare.

Ser man på det från en SoC- princip, borde ett spelobjekt verkligen inte veta eller bry sig om LayerMasks. Den behöver bara en metod för att skanna omgivningen. Huruvida raycast-resultatet returnerar detta eller det borde inte betyda för spelobjektet. Den bör endast agera på den information den får och inte göra några antaganden om den miljö den finns i.

Ett sätt att närma sig detta är att flytta LayerMask-värdet till ScriptableObject- instanser och använda dem som en form av raycast-tjänster som du injicerar i dina skript.

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

Detta gör att du kan göra ett antal raycast-tjänster, alla med olika LayerMask-kombinationer för olika situationer. Du kan ha en som bara träffar markcyklare, och en annan som träffar markcyklare och envägsplattformar.

Om du någonsin behöver göra drastiska ändringar i dina LayerMask-inställningar, behöver du bara uppdatera dessa RaycastService-tillgångar.

Vidare läsning



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow