【Unity小技巧】如何使飞行的子弹不会因速度过快造成穿透?
解:我们只需要在子弹飞行的途中储存前后帧的位置,然后计算他们之间的距离,最后通过射线检测是否碰撞到物体即可,接下来让我们整理下代码(实际可不继承mono,自行管理子弹类和飞行方式)
public class bullet : MonoBehaviour
{
//子弹速度
public float sp=100;
public float dis;
public Vector3 posRecord;
public Ray ray;
public RaycastHit hit;
void Update()
{
BulletMovement();
}
//核心点
public void BulletMovement()
{
//记录位置
posRecord = transform.position;
//子弹开始移动
transform.position += transform.forward*sp*Time.deltaTime;
//计算当前位置与记录位置的距离
dis = (posRecord - transform.position).magnitude;
//大于0说明子弹移动了
if (dis > 0)
{
//从记录的位置向子弹飞行的方向发出射线
if(Physics.Raycast(posRecord,transform.forward,out hit,dis))
{
//检测到目标后处理自己的代码....
BulletDestroy();
}
}
}
public void BulletDestroy()
{
gameObject.SetActive(false);
}
}
如果想让子弹可以穿透敌人并正常造成伤害,可以在子弹碰撞到对象后将其存入List中,撞击时判断List中是否有该对象,然后执行接下来的代码,最后子弹销毁时只需要清除List列表即可。