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