minuschki Geschrieben 25. Februar 2022 Melden Share Geschrieben 25. Februar 2022 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? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 25. Februar 2022 Melden Share Geschrieben 25. Februar 2022 Mach das einfach mit der Physics2D Klasse. https://docs.unity3d.com/ScriptReference/Physics2D.html Da könntest du z.B. einen Raycast nutzen, der in Bewegungsrichtung ausgesendet würde. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 25. Februar 2022 Melden Share Geschrieben 25. Februar 2022 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 More sharing options...
malzbie Geschrieben 25. Februar 2022 Melden Share Geschrieben 25. Februar 2022 Gerade eben schrieb Sascha: P.S. Hab vergessen abzuschicken, und dann kam malzbie ^^ Wie... vergessen? Kurz eingenickt? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 25. Februar 2022 Melden Share Geschrieben 25. Februar 2022 Ne, furchtbar viele verschiedene Sachen, die heute um meine Aufmerksamkeit kämpfen 😅 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
minuschki Geschrieben 25. Februar 2022 Autor Melden Share Geschrieben 25. Februar 2022 Aha! Wie immer sehr kompetent und hilfreich eure Tipps! So weiss ich wenigstens, in welche Richtung ich recherchieren muss. Besten Dank! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
minuschki Geschrieben 25. Februar 2022 Autor Melden Share Geschrieben 25. Februar 2022 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 More sharing options...
malzbie Geschrieben 25. Februar 2022 Melden Share Geschrieben 25. Februar 2022 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 More sharing options...
minuschki Geschrieben 25. Februar 2022 Autor Melden Share Geschrieben 25. Februar 2022 Ich habs jetzt rausgekriegt! Danke für deine Hilfe! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.