Skip to content

[已解決][Unity] 使用 trigger 觸發碰撞判定但 RigidBody 不模擬碰撞(Dynamic、Kinematic、Static)

Last Updated on 2021-10-28 by Clay

在我最近使用 Unity 製作貪吃蛇小遊戲時,若是我希望讓我的蛇頭(snake head)碰撞到另外一個蛇的身體時刪除遊戲物件,我需要使用 OnTriggerEnter2D() 來設置觸碰判定。

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.gameObject.tag == "Snake")
    {
        Destroy(gameObject);
    }
}


然而,卻因為我需要觸控判定,於是我需要替我的遊戲物件添加 Rigidbody2D,但這卻讓我的蛇頭和身體互相推擠。

https://clay-atlas.com/wp-content/uploads/2021/06/SnakeEating-GameScene-Android-Unity-2019.4.27f1-Personal_-_DX11_-2021-06-11-11-13-42.mp4

解決方法

其實這個問題要解決很簡單,只需要將 Rigidbody2D 的 Body Type 改成 Kinematic 即可。


在 Body Type 中有分成 Dynamic、Kinematic、Static 三種型態,以下依序介紹:

Dynamic

  • Dynamic 遊戲物件完全由物理引擎驅動
  • Dynamic 遊戲物件的受力、速度等受影響
  • 物理引擎根據其他物件的碰撞需求處理反彈
  • 適用於遊戲角色、移動的遊戲物件


Kinematic

  • Kinematic 遊戲物件完全由腳本驅動,因此必須處理 MovePosition()MoveRotation()
  • Kinematic 遊戲物件只處理與 Dynamic 遊戲物件的碰撞;比如說『彈開』時,發送 OnCollisionEnter() 事件
  • 適用於要讓遊戲角色更靈活、有客製化需求時(本次我的需求即是如此)


Static

  • 沒有真正的 Rigidbody 元件附加,所以物理引擎不起作用
  • 不能產生碰撞,OnTrigger() 以及 OnCollision()
  • 適用於地板、牆壁等不希望產生碰撞的遊戲物件

References


Read More

Tags:

Leave a Reply取消回覆

Exit mobile version