皿割りゲームを作っていて、どうにも不満が。
弾の速度が遅くて、どうしても弾を撃つタイミングが難しい。
かといって弾を早くすると、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が貫通しても関係なく、皿を割ることができました😀