Jump to content
Unity Insider Forum

Kollisionpunkt von kreisförmigen 2D-Objekten vorausberechnen


minuschki

Recommended Posts

Hallo zusammen

Für ein 2D Carromspiel möchte ich dem Spieler eine Hilfslinie anzeigen lassen, die anzeigt, in welche Richtung sich sein Spielstein nach einem Treffer bewegen wird. Bei 3D-Objekten gibt es da die Möglichkeit einen Rigidbody.SweepTest anzuwenden, der (wie das linke Beispiel im Bild zeigt) auch wunderbar funktioniert. Für 2D-Objekte steht meines Wissens aber kein solcher Rigidbody2D.SweepTest zur Verfügung. Oder vielleicht doch?

Wie kann man nun den Vector2 von A und B vorausberechnen, welcher dann für die Richtungsanzeige genutzt werden könnte?

Kollision.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin!

SweepTests sind etwas Overkill für Kugeln. Sie sind dafür da, komplexe Geometrie, die aus mehreren Collidern des Rigidbodys besteht, mit der Szene abzugleichen. Wenn du allerdings primitive Formen wie Kugeln oder Kreise hast, kannst du die Cast-Funktionen der Physics- bzw. Physics2D-Klasse benutzen. In deinem Fall hilft wohl CircleCast bzw. die bessere Version Physics2D.CircleCastNonAlloc (macht keinen Müll).

P.S. Hab vergessen abzuschicken, und dann kam malzbie ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich komme da leider nicht weiter! Zwar habe ich inzwischen in meinem 3D Projekt den "Rigidbody.SweepTest" durch die "Physics.SphereCast"-Methode erfolgreich ersetzen können (betrifft den Code nach der Sternenzeile).

Bei der Umsetzung im 2D Projekt (Carromspiel) funktioniert der Code aber leider nicht mehr. Ich habe versucht, ihn auf 2D anzupassen (statt RaycastHit > RaycastHit2D und anstatt Physics.SphereCast > Physics2D.CircleCast). Es erscheint nur eine Fehlermeldung "Use of unassigned local variable `hit'. Keine Ahnung, woran das liegt.

Ich bräuchte eigentlich nur die Position des Strikers bei einer voraussichtlichen Kollision und die Position des Spielsteines, welcher mit dem Striker angespielt würde!

Kann mal bitte jemand einen Blick auf den fehlerhaften Code werfen?

 

Hier die 2D Variante, welche leider nicht funktioniert

if (Input.GetMouseButton(0))
	{
		RaycastHit2D hit;

		if (Physics2D.CircleCast(transform.position, 0.5f, transform.forward, 10f)) // Striker Position, Radius, Richtung, Distanz
		{
			hitObject = hit.transform.gameObject;
			hitDistance = hit.distance;
			Debug.Log(hitObject);
			Treffpunkt.transform.position = hitObject.transform.position;//hitDistance; // Position des Strikers bei Kollision
		}
		else
		{
			hitObject = null;
			hitDistance = 10f;
		}
	}



******************************************************************************************************************************************
Hier die 3D Variante, welche problemlos funktioniert
******************************************************************************************************************************************

public class EinfacherTest : MonoBehaviour
{

	public GameObject hitObject;
	public float sphereRadius;
	public float maxDistance;

	Vector3 origin;
	Vector3 direction;

	float hitDistance;


	void Update ()
	{
		origin = transform.position;
		direction = transform.forward;

		RaycastHit hit;

		if(Physics.SphereCast(origin, sphereRadius, direction, out hit, maxDistance))
		{
			hitObject = hit.transform.gameObject;
			hitDistance = hit.distance;
		}
		else
		{
			hitObject = null;
			hitDistance = maxDistance;
		}
	}


	void OnDrawGizmosSelected()
	{
		Gizmos.color = Color.red;
		Debug.DrawLine (origin, origin + direction * hitDistance);
		Gizmos.DrawWireSphere (origin + direction * hitDistance, sphereRadius);
	}
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, die 2 Systeme sind unterschiedlich. Beim 3D Spherecast bekommst du ein hit übergeben. ( da, wo das out hit steht).
Das macht der 2D Circlecast aber nicht. Deswegen musst du die ganze Sache so umstellen, das es der hit Variable übergeben wird und danach erst per If-Abfrage überprüft wird, ob was getroffen wurde.
So wie hier in dem Beispiel:

https://docs.unity3d.com/ScriptReference/Physics2D.Raycast.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...