2017-07-19 77 views
1

我正在2D環境中處理Unity遊戲。玩家GameObject附有Rigidbody2D。滑動時它會水平移動。當滑動太快時,它不會與Colliders相沖突。也許在檢測到碰撞之前它會改變它的變換位置當滑動緩慢時不會發生。GameObject的快速滑動移動不會與Colliders碰撞

+0

您不能測試平等,而不是你需要一個範圍,移動速度快時,你可以通過平等的條件和沒有得到一個確切的平等。 – jdweng

回答

0

確保您的Rigidbody2D的碰撞檢測模式設置爲ContinuousContinuous Dynamic

1

如果物體的移動速度太快,它會簡單地忽略碰撞,因爲它從不碰觸實際的碰撞器 - 它只是跳過它。

爲了解決這個問題,您需要預測碰撞何時發生並在正確的時刻觸發。

將碰撞檢測設置爲連續爲pixlark表示可能有助於如果刷卡速度不太快。

1

根據你的問題,我假設你在Update()函數中移動你的對象(如果不是,請糾正我)。這意味着你每幀都要移動一定量的物體。但是,Unity會檢查碰撞器並在不同的時間間隔進行物理計算(固定時間步長,https://docs.unity3d.com/Manual/class-TimeManager.html)。

就在對象碰撞之前,會檢查碰撞對象。 Unity每Fixed Timestep(默認爲每秒0.02次)計算對撞機。如果統一檢測不到碰撞,則意味着你的物體的交叉時間比Fixed Timestep少,或者換句話說,它們移動速度非常快(就像你描述的那樣)。解決這個問題的一種(不好的)方法是減少物理計算之間的時間。但是,這會大大降低您的程序效率。

取而代之的是,考慮將對象移動到函數FixedUpdate()中,以便物體每次物理檢查碰撞時才移動。這應該可以解決你的問題。

看看第3個答案(由加斯·史密斯): https://forum.unity3d.com/threads/rigidbody-2d-wont-collide-with-another-object-when-its-moving-really-fast.248786/

我特別想強調的部分:

如果你有Rigidbody2D,你要移動它在FixedUpdate() 使用rigidbody2D.MovePosition(Vector2)。這將通過空間移動 Rigidbody2D,而不是從A點瞬移它 點B.

約光線投射的第二部分不應該爲你的問題是必要的,但如果您繼續遇到問題,你可以使用他們檢查範圍jdweng在他的評論中說。

這裏有幾個地方來了解光線投射,如果您不熟悉它們: https://docs.unity3d.com/ScriptReference/Physics2D.Raycast.html https://unity3d.com/learn/tutorials/topics/physics/raycasting

+0

非常感謝。我在固定更新中移動了遊戲對象。 我通過滑動移動我的對象, transform.position + = transform.right * _hMovement * transformSpeed * Time.deltaTime; 我正在閱讀你給出的參考文獻。 –