2016-05-13 160 views
1

我正在用拋物線移動的子彈進行2D遊戲,但在我開始拍攝彈丸之前,我希望能夠計算其彈道。如何計算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)) 

此代碼將rigidbody2d添加到我的項目符號(newGO)中。我試圖在飛行1秒後使用它來計算點數:

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

不幸的是,它不會返回正確的結果。我該怎麼辦? 感謝您的幫助和對我的英語感到抱歉。

+0

「不計數正確」,請解釋一下什麼是不正確了。說出你期望得到的結果,並展示你實際得到的結果。 –

+0

例如:1秒後子彈的x = 2.7,y = -1.14,但是我的代碼返回(x,y)=(1.5,-4.9) – Pawelsar1

+0

在你的問題中放置類似這樣的信息[http:/ /stackoverflow.com/posts/37217689/edit) –

回答

1

我認爲是一個彈丸,你應該使用Rigidbody2D.velocity來設置彈丸的初始速度而不是Rigidbody2D.AddForce。 (雖然文檔不建議)

這個簡單的腳本預測附加對象在由變量「timeLimit」確定的時間內的位置,並將「目標」遊戲對象移動到該點。

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; 
     } 
    } 
} 

注:子彈和目標必須在同一點inicially

+1

一個很好的答案。 – Fattie

+1

非常感謝您的幫助! – Pawelsar1

+0

@Joe吹響大師。 --- Pawelsar1我希望很快就能玩你的遊戲 – ORParga