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