Zoeken…


parameters

Parameter Details
oorsprong Het startpunt van de straal in wereldcoördinaten
richting De richting van de straal
maxDistance De maximale afstand die de straal moet controleren op botsingen
layerMask Een laagmasker dat wordt gebruikt om Colliders selectief te negeren bij het werpen van een straal.
queryTriggerInteraction Geeft aan waar deze zoekopdracht Triggers moet raken.

Natuurkunde Raycast

Deze functie werpt een straal van punt origin richting direction lengte maxDistance tegen alle versnellers in de scene.

De functie liggen de origin direction maxDistance en berekenen of er een deeltjesversneller voor het GameObject.

Physics.Raycast(origin, direction, maxDistance);

Met deze functie wordt bijvoorbeeld Hello World naar de console afgedrukt als er iets binnen 10 eenheden van de GameObject gekoppeld:

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

Je kunt raycasts gebruiken om te controleren of een ai kan lopen zonder van de rand van een niveau te vallen.

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 dit voorbeeld is de richting goed. De variabele raycastRightPart is het juiste deel van het personage, dus de raycast vindt plaats aan de rechterkant van het personage. De afstand is 0,6f maal de hoogte van het personage, zodat de raycast geen hit zal geven wanneer hij de grond raakt die veel lager is dan de grond waarop hij op dit moment staat. Zorg ervoor dat het laagmasker alleen op aarde is ingesteld, anders worden ook andere soorten objecten gedetecteerd.

RaycastHit2D zelf is een structuur en geen klasse, dus hit kan niet nul zijn; dit betekent dat u moet controleren op de collider van een RaycastHit2D-variabele.

Raycast-oproepen inkapselen

Als u uw scripts Raycast rechtstreeks laat Raycast , kan dit tot problemen leiden als u de collisiematrices in de toekomst moet wijzigen, omdat u elk LayerMask veld moet LayerMask om de wijzigingen op te vangen. Afhankelijk van de grootte van uw project kan dit een enorme onderneming worden.

Het inkapselen van Raycast oproepen kan uw leven gemakkelijker maken.

Als je het vanuit een SoC- principe bekijkt, zou een gameobject LayerMasks echt niet moeten kennen of er iets om geven. Het heeft alleen een methode nodig om de omgeving te scannen. Of het raycast-resultaat dit of dat oplevert, maakt voor het spelobject niet uit. Het mag alleen handelen op basis van de informatie die het ontvangt en mag geen aannames doen over de omgeving waarin het zich bevindt.

Een manier om dit te benaderen is om de LayerMask-waarde te verplaatsen naar ScriptableObject- instanties en deze te gebruiken als een vorm van raycast-services die u in uw scripts injecteert.

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

Hiermee kunt u een aantal raycast-services maken, allemaal met verschillende LayerMask-combinaties voor verschillende situaties. Je zou er een kunnen hebben die alleen grondbotsers raakt, en een andere die grondbotsers en eenrichtingsplatforms raakt.

Als u ooit drastische wijzigingen in uw LayerMask-instellingen moet aanbrengen, hoeft u alleen deze RaycastService-middelen bij te werken.

Verder lezen



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow