【Unity Tips】速度超過による飛んできた弾の貫通を防ぐには?
解決策: 弾丸の飛行中に前後のフレームの位置を保存し、それらの間の距離を計算し、最後に光線を通してオブジェクトと衝突するかどうかを確認するだけです。次に、コードを整理しましょう (実際には) 、単弾種と飛行モードを継承せずに自分で管理できます)
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に存在するかどうかを判断してから次のコードを実行すればよいのですが、最後に弾丸が破壊されたら、リストリストをクリアするだけです。