【Unity】使用RigidBody2D移動transform不碰撞或卡牆解決方案


使用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);
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM