Duckdave Geschrieben 18. September 2017 Melden Share Geschrieben 18. September 2017 Hallo Leute, folgende Situation... Ich habe einen Pfeil der mittels AddForce bewegt zu einem Zielpunkt bewegt wird. Mittels Debug.DrawLine wird dieser Punkt sichtbar gemacht und mir fällt auf dass der Pfeil immer etwas daneben ins Ziel geht. using UnityEngine; public class shotFly : MonoBehaviour { [HideInInspector] public GameObject target; public float upForce; private Vector3 dir; private Rigidbody2D rb; private Vector3 targetPos; private void Start() { rb = GetComponent<Rigidbody2D>(); targetPos = target.transform.position; targetPos += new Vector3(0f, 2f, 0f); //Offset for pointing on head rb.AddForce(Vector2.up * upForce); } private void FixedUpdate () { dir = targetPos - transform.position; rb.AddForce(dir); transform.rotation = Quaternion.LookRotation(Vector3.forward, rb.velocity); if (dir.magnitude < 1f) Destroy(gameObject); Debug.DrawLine(transform.localPosition, targetPos, Color.red); } private void OnTriggerEnter2D(Collider2D collision) { if (collision.tag == "Enemy") { collision.GetComponent<enemy>().health -= 10f; Destroy(gameObject); } } } Danke für eure Ratschläge! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 18. September 2017 Melden Share Geschrieben 18. September 2017 Was passiert, wenn du rb.AddForce(Vector2.up * upForce); entfernst? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Duckdave Geschrieben 18. September 2017 Autor Melden Share Geschrieben 18. September 2017 Wäre nur dafür gedacht, dass der Pfeil anfangs nach oben fliegt um dann auf den Gegner herab zu fliegen. Lasse ich es weg ändert sich nichts. Bzw. der Pfeil fliegt direkt auf den Gegner zu. Mein Ziel bei der Angelegenheit besteht darin, dass der Pfeil in einem Bogen auf den Gegen (oder Position die erfasst wurde) fliegt und ich wollte das Ganze eben mit der Physik Engine umsetzen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 18. September 2017 Melden Share Geschrieben 18. September 2017 Wo liegt denn der 0Punkt deines Pfeils? Ist die LocalPosition auch genau der 0Punkt der Weltposition? Du ermittelst nämlich das Ziel mit der Weltposition, zeichnest dann aber eine Linie von der LocalPosition aus. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 18. September 2017 Melden Share Geschrieben 18. September 2017 Naja, aber wenn dein Pfeil eine Parabel beschreiben soll, dann ist es nicht weiter verwunderlich, daß er über das Ziel hinausschießt (der Pfeil fliegt dann über das Ziel hinaus, da er ja noch eine nach oben gerichtete Kraft hat, zusätzlich zu der Kraft, die du jedes Frame übergibst). Das ist ja dann kein Pfeil mehr, sondern eher ein Verhalten wie bei einem Katapult... In Spielen wird bei einem Pfeil oft keine Parabel verwendet, sondern einfach der direkte Weg. Ansonsten müsstest du einen Parabelflug berechnen und die wirkende Kraft ganz exakt jedes Frame übergeben, macht man dies nicht, ist ein exaktes Treffen bei einer Parabel nicht möglich, es ist dann eher ein "Probieren". Ein Parabelflug ist ja normalerweise ein Mix aus Schwerkraft (in Unity: Y) und einer vorwärts gerichteten Kraft (in Unity: transform.forward). Oder man fängt eben an zu "Tricksen" und zwingt das Geschoss nach beispielsweise halber Flugstrecke in die "Umlaufbahn" des Zieles. Dabei würde man die nach oben gerichtete Kraft abhängig von der Entfernung zum Ziel immer weiter verringern... Dabei würde dann eine Parabel entstehen die gegen Ende hin Richtung Ziel stark abfällt (wäre aber nicht weiter schlimm, da in der Realität, ein Geschoss auch relativ schnell absinken kann) Ungetesteter Code (kann Syntaxfehler enthalten): using UnityEngine; public class shotFly : MonoBehaviour { [HideInInspector] public GameObject target; public float upForce; private Vector3 dir; private Rigidbody2D rb; private Vector3 targetPos; private float startDistanceTarget; private void Start() { rb = GetComponent<Rigidbody2D>(); targetPos = target.transform.position; targetPos += new Vector3(0f, 2f, 0f); //Offset for pointing on head rb.AddForce(Vector2.up * upForce); Vector3 targetDir = targetPos - transform.position; startDistanceTarget = targetDir.magnitude; } private void FixedUpdate () { dir = targetPos - transform.position; rb.AddForce(dir); transform.rotation = Quaternion.LookRotation(Vector3.forward, rb.velocity); Vector2 currentVelocity = rb.velocity; float velY = currentVelocity.y; float currentDistanceTarget = dir.magnitude; float distanceTraveled = 1.0f - (currentDistanceTarget / startDistanceTarget); float velYNew = Mathf.Lerp(velY, 0, distanceTraveled); currentVelocity.y = velYNew; rb.velocity = currentVelocity; if (dir.magnitude < 1f) Destroy(gameObject); Debug.DrawLine(transform.localPosition, targetPos, Color.red); } private void OnTriggerEnter2D(Collider2D collision) { if (collision.tag == "Enemy") { collision.GetComponent<enemy>().health -= 10f; Destroy(gameObject); } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 18. September 2017 Melden Share Geschrieben 18. September 2017 Hab Code nochmal geändert ... Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Duckdave Geschrieben 18. September 2017 Autor Melden Share Geschrieben 18. September 2017 Danke für eure Antworten! @Zer0Cool float velYNew = Lerp(velY, 0, distanceTraveled); und rb.velocity = rb.velocity; stimmt die Syntax bzw. warum rb.velocity = rb.velocity? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 18. September 2017 Melden Share Geschrieben 18. September 2017 vor 20 Minuten schrieb Duckdave: Danke für eure Antworten! @Zer0Cool float velYNew = Lerp(velY, 0, distanceTraveled); und rb.velocity = rb.velocity; stimmt die Syntax bzw. warum rb.velocity = rb.velocity? Fehler, hab's geändert..., wie gesagt der Code ist ungetestet. Lerp kommt aus der Klasse "Mathf". 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.