【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