使用RigidBody2D移動transform不碰撞解決或卡牆解決方案
問題描述:
由於RigidBody2D屬於物理碰撞一類的剛體組件,所以要用自身的API移動才能實現物理上的碰撞效果。
如果直接移動改變物體的transform.position或localPosition就會導致卡牆和穿透的問題。
解決思路:
雖然碰撞不發生立即的反應,但是當我們去檢測碰撞的時候,不論是Stay或者是Enter都能很快的反應出物體是否碰撞,根據Unity生命周期當幀改變后就直接檢測執行碰撞函數。所以我們直接在下一幀發生前讓物體的位移回歸一定的值即可。
也就是碰壁反彈。
如何實現碰壁反彈?
首先如果知道角色目前的方向就能按照反方向回退,但是由於碰撞方向不可能與自己設定的角色方向一定一致。所以我們要取的是碰撞方向,而不是自己設定的角色方向。取到碰撞方向然后把角色的transform.position或localPosition做反方向的計算即可實現反彈的效果。此時我們檢測函數必然是Stay,因為你不知道穿透了多少,是否一直處於碰撞狀態。
具體實現
private void OnCollisionStay2D(Collision other){
Vector3 p = other.transform.LocalPosition;
if(other.contact[0].normal.x>=0.9f){
//從左向右發生碰撞
other.transform.localPosition = new Vector3(p.x-1,p.y);
}else if(other.contact[0].normal.x<=-0.9f){
//從右向左發生碰撞
other.transform.localPosition = new Vector3(p.x+1,p.y);
}else if(other.contact[0].normal.y>=0.9f){
//從下向上發生碰撞
other.transform.localPosition = new Vector3(p.x,p.y-1);
}else if(other.contact[0].normal.y<=-0.9f){
//從上向下發生碰撞
other.transform.localPosition = new Vector3(p.x,p.y+1);
}
}
