2016-05-13 11 views
1

Ich mache das 2D-Spiel mit Kugeln in Parabel bewegen, aber bevor ich das Projektil schießen mag ich in der Lage sein, seine Flugbahn zu berechnen.Wie berechnet man die Flugbahn eines Geschosses in Unity2D?

  float velocity = Mathf.Min(Mathf.Max(distance, 1), 2.5f); 
     float cos = Mathf.Cos((gameObject.transform.localEulerAngles.z + 90) * Mathf.Deg2Rad); 
     float sin = Mathf.Sin((gameObject.transform.localEulerAngles.z + 90) * Mathf.Deg2Rad); 
     newGO.GetComponent<Rigidbody2D>().AddForce(velocity * new Vector3(cos, sin)) 

Dieser Code fügt die rigidbody2d meinem bullet (newGO) hinzu. Ich versuche, einen Punkt nach 1 Sekunde des Fliegens mit ihm zu zählen:

Debug.Log(new Vector3(source.transform.position.x + velocity * 1 * cos, source.transform.position.y + velocity * sin * 1 + Physics2D.gravity.y * 0.5f * 1)); 

Leider gibt es nicht das richtige Ergebnis zurück. Was soll ich machen? Danke für Hilfe und Entschuldigung für mein Englisch.

+0

„nicht richtig zählt“ bitte erklären, was sie falsch ist. Sagen Sie, was Sie erwarten und zeigen Sie, was Sie tatsächlich bekommen. –

+0

Zum Beispiel: bullet der x = 2,7, y = -1,14 nach 1 Sekunde, aber mein Code zurückkehrt (x, y) = (1,5, -4,9) – Pawelsar1

+0

Stellen Sie Informationen wie die in Ihrer Frage nach [es bearbeite] (http://stackoverflow.com/posts/37217689/edit) –

Antwort

1

Ich denke, ein Projektil zu sein Sie Rigidbody2D.velocity verwenden sollten die Anfangsgeschwindigkeit des Geschosses anstatt Rigidbody2D.AddForce einzustellen. (Obwohl die Dokumentation nicht empfiehlt)

Dieses einfache Skript sagt voraus, wo das angefügte Objekt in einer Zeit sein wird, die durch die Variable "timeLimit" bestimmt wird und verschiebt ein "Ziel" -Gameobject an diesen Punkt.

public class Velocity : MonoBehaviour { 

    public GameObject target; 

    private float HoriInitialSpeed = 5; 
    private float VertInitialSpeed = 5; 
    private float timeLimit = 2; 
    private float timeElapsed=0; 

    void Start() 
    { 
     float HoriPredict = HoriInitialSpeed * timeLimit; 
     float VertiPredict = VertInitialSpeed* timeLimit + (0.5f * Physics2D.gravity.y * timeLimit * timeLimit); 

     target.transform.Translate(HoriPredict, VertiPredict,0); 
     GetComponent<Rigidbody2D>().velocity = new Vector2(HoriInitialSpeed, VertInitialSpeed); 
    } 

    void Update() { 
     timeElapsed += Time.deltaTime; 
     if(timeElapsed >= timeLimit) 
     { 
      //stop the bullet 
      GetComponent<Rigidbody2D>().velocity = new Vector2(0, 0); 
      GetComponent<Rigidbody2D>().gravityScale = 0; 
     } 
    } 
} 

Hinweis: Die Kugel und das Ziel muss inicially in der gleichen Stelle sein

+1

eine ausgezeichnete Antwort. – Fattie

+1

Vielen Dank für Hilfe! – Pawelsar1

+0

@Joe Blow thnks Meister. --- Pawelsar1 Ich hoffe, dein Spiel bald zu spielen – ORParga