2014-07-11 59 views
2

我在Unity 3D中(2D模式下)製作此代碼,所以我的代碼示例將在Unity/C#中,但我認爲這是一個普遍的物理問題。向2D物體添加力量,同時確保速度始終朝向身體的向上方向

我有一個2D宇宙飛船懸掛圍繞它偶爾由用戶輸入轉換爲2D矢量這樣遇到一些小行星(或其它船隻)和我已經實現的方式是這樣的:

Vector2 movement = new Vector2(0, currentPlayerSpeed); 

的「currentPlayerSpeed」是根據艦船最大速度計算出來的,並且隨着時間的推移而加上一個加速度,然後我將這個Vector2D添加到船隻的變換中,就像這樣(船舶總是相對於自己的旋轉向上飛行):

transform.Translate(movement); 

我旋轉船基於輸入(並添加了一些最大旋轉力),我直接旋轉船舶,而不是通過物理體(我通過transform.Rotate (rotationVector)設置),並且船總是以當前速度向上「飛」的方向飛行,而這意味着它不會飛行,即使是最不經常的橫向飛行。這是我希望它工作的方式,但是......我也希望這艘船可以反彈它撞擊的任何小行星(或其他船隻),並且我希望在物理學中使用這種構建,但我不知道正確施加力,以保持正確的速度/方向。

我已經將我更新到FixedUpdate和我現在做這個移動的船,而不是:

rigidbody2D.AddForce (transform.up * currentPlayerSpeed); 
if(rigidbody2D.velocity.magnitude > maxShipSpeed) 
{ 
    rigidbody2D.velocity = rigidbody2D.velocity.normalized * maxShipSpeed; 
}

所以我得到的反彈效果我想,但很明顯的船現在飛側身最作爲力量沒有直接轉化爲船舶速度和操縱剛體body2D.velocity的時間直接給了我奇怪的結果,所以我不知道如何做到這一點。下面是我想要的一個例子,以及它爲什麼不能清除問題(矢量繪製不正確,但我希望它有意義)。

enter image description here

我曾嘗試用下面的代碼:

float magnitude = rigidbody2D.velocity.magnitude; 
rigidbody2D.velocity = transform.up * magnitude;

,這使得船飛,我是想,但很明顯,它也cansels碰撞出的力量讓我回平方零。任何幫助/想法都是值得歡迎的,因爲我非常堅持這一點。

謝謝
瑟倫

+0

你描述的情況在物理上是不可能的。每一個行動都有一個平等而相反的反應。我想你可以給你的船提供一個巨大的質量,所以碰撞對它的明顯影響最小化。 –

+0

我擔心它可能在物理上是不可能的。給我的船一個巨大的團體不會解決任何事情,因爲我希望碰撞產生效果,我只是想將它與我的船的非物理運動結合起來。我想我必須實現我自己的假物理學,如果我想這個工作。 – Neigaard

+0

碰撞會產生影響,一個物體的質量越大,對另一個物體的影響就越大。你需要做的是執行兩個計算。一個用來計算對你船的旋轉速度的影響,另一個用來計算對小行星的影響。在物理學崩潰的地方,小行星和船隻的運動定律會有所不同。也許這個老遊戲可能會引發一個想法。 https://www.youtube.com/watch?v=HlPgB9rEkBg :) –

回答

2

這是易如反掌來實現這一目標:

你真的只是想「繞反彈嗎」(即「左,右」 ..「前後「),因爲它繼續向上。

Unity中最簡單的方法就是 - 只需製作碰撞器觸發器,實際上不會使用PhysX碰撞。在每次碰撞時,在相關的方向上,向左或向右(可能具有小的上下方差)施加力(Unity的「爆炸力」將是正確的)。

享受!

相關問題