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,但這卻讓我的蛇頭和身體互相推擠。
解決方法
其實這個問題要解決很簡單,只需要將 Rigidbody2D 的 Body Type 改成 Kinematic 即可。
在 Body Type 中有分成 Dynamic、Kinematic、Static 三種型態,以下依序介紹:
Dynamic
- Dynamic 遊戲物件完全由物理引擎驅動
- Dynamic 遊戲物件的受力、速度等受影響
- 物理引擎根據其他物件的碰撞需求處理反彈
- 適用於遊戲角色、移動的遊戲物件
Kinematic
- Kinematic 遊戲物件完全由腳本驅動,因此必須處理
MovePosition()
、MoveRotation()
- Kinematic 遊戲物件只處理與 Dynamic 遊戲物件的碰撞;比如說『彈開』時,發送
OnCollisionEnter()
事件 - 適用於要讓遊戲角色更靈活、有客製化需求時(本次我的需求即是如此)
Static
- 沒有真正的 Rigidbody 元件附加,所以物理引擎不起作用
- 不能產生碰撞,
OnTrigger()
以及OnCollision()
- 適用於地板、牆壁等不希望產生碰撞的遊戲物件
References
- https://needoneapp.medium.com/unity-should-i-choose-kinematic-static-or-dynamic-for-rigidbody-2d-body-type-191ce65fa35f
- https://docs.unity3d.com/Manual/class-Rigidbody2D.html