Jump to content
Unity Insider Forum

Pfeil fliegt an Zielpunkt vorbei


Duckdave

Recommended Posts

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.

image.png.5ecac6029590057940166f2301e82d5c.png

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

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

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

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

Archiviert

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

×
×
  • Neu erstellen...