ゲーム制作勉強中!あこがれだったプログラマーに今からなろう!

昔、あこがれていたプログラマー。今からでも勉強してみようと思い立ち、チャレンジ開始! 勉強メモや、悪戦苦闘な日々の記録です。

Unity:速度が早すぎて貫通!の対策

皿割りゲームを作っていて、どうにも不満が。

弾の速度が遅くて、どうしても弾を撃つタイミングが難しい。

かといって弾を早くすると、colliderの判定が間に合わず、貫通してしまう問題が発生してしまう。

Rigidbodyの衝突判定の設定を変更する方法もあるみたいだけど、どうせなら、いっそcoliider判定をやめてRaycastで判定することにしてみた。

RaycastHit[] hits;

private void Shoot()
{
    //表現として弾を発射する。
    GameObject _bullet = Instantiate(Bullet,transform.position,transform.rotation);        
   _bullet.GetComponent<Rigidbody>().AddForce(transform.forward * power);

   //半径0.7のスフィア型をRaycastをターゲット方向に撃つ。
   hits=Physics.SphereCastAll(transform.position,0.7f,(_Target.transform.position-transform.position),10f);

  foreach(RaycastHit hit in hits)
  {
   //Raycastに当たったオブジェクトのタグが「Plate」だったら、
   //PlateManagerのBroken Plateメソッドを呼び出して、
   //皿を破壊。
   if(hit.collider.CompareTag("Plate"))
   {
     hit.collider.gameObject.GetComponent<PlateManager>().BrokenPlate();    
    }

    if(hit.collider.CompareTag("Star"))
     {
        hit.collider.gameObject.GetComponent<Star>().GetStar();    
      }
  }       
}


ちょっと悩んだのが、Raycastの方向の指定。
最初、単純にターゲットのオブジェクトのtransform.positionを入れていたのだけど、これだとどうしても上手くいかない。

よくよく考えれば、向きと座標は別物なので、当たり前なんだけど😅
答は、ターゲットのtransform.position1から元のtransform.positionをひけば、向きが求められる。
という、最初の頃に学んだことでした😝

兎にも角にも、これで弾を早くして、coliiderが貫通しても関係なく、皿を割ることができました😀