前回はballのPrefabを使って一定間隔でランダムにボールを出現させました. 今回はボールとバーの当たり判定を作成したいと思います.
UnityにはPhysics(日本語では物理)という機能が標準で実装されており,ゲーム内のオブジェクトは物理的性質をアタッチすると現実の物体のように振る舞います.中でも標準で実装されているのがgravity(重力)でスーパーマリオのジャンプなどはこのような機能で簡単に実現します.また,物体が衝突して跳ね返るなども同じように実装できます.
さて,今回のゲームでは物理的に衝突する判定だけで,跳ね返ったり,重力の影響を受けたりしません.一般にPhysicsを使って当たり判定をするとき衝突する物体同士には次の設定が必要です:
- 少なくとも片方にRigidbody(剛体)を設定する.
- 両方にCollider(衝突する物体)を設定する.
今回は2DなのでPhysics 2Dの中から長方形をしたbarにはRigidbody 2DとBox Collider 2D,丸いballにはCircle Collider 2Dを設定します.今回の場合,Rigidbody 2Dはball側にしてもいいんじゃないの?と思われるかもしれませんが,ballは沢山表れてきますので,衝突する相手がbarだけの場合はbarにRigidbody 2Dを設定する方が自然だし,若干処理も軽くなるでしょう.あとはbarにballが衝突したときに実行するメソッドが必要ですが,これは後程ご説明します.
まず,Hierarchyビューからbarを選択し,Inspectorから一番下のAdd Componentをクリックして選択肢の中から[Physics 2D]→[Rigidbody 2D]を選択します.今回は力学的な挙動は考えず,あると困るのでInspectorのRigidbody 2DのBody TypeからKinematic(重さや加速度、力を考えない)を選択します:
次に再びbarを選択し,InspectorからAdd Componentをクリックして選択肢の中から[Physics 2D]→[Box Collider 2D]を選択します.そののち,InspectorのBox Collider 2Dの中でIs Triggerにチェックを入れます:
このIs Triggerにチェックを入れると当たり判定だけしてその後の物理的挙動は無視します.物理的挙動とは例えばボールがバーに当たった時,バーが反動を受けて運動するなどです. このため,当たり判定のトリガーとしてだけ機能するようになるわけです.
次に今度はballに対してもCollider 2Dを設定しなくてはなりません.今度は円形なのでCircle Collider 2Dを使用します. 今の場合ballはballPrefabというPrefabに登録されていますのでballPrefabをProjectビューのAssetsから選択し,先ほどと同じように今度はCircle Collider 2Dをアタッチします.Inspectorから一番下のAdd Componentをクリックし,出てきた選択肢の中から[Physics 2D]→[Circle Collider 2D]を選択し,Inspectorに現れたCircle Collider 2DのIs Triggerにチェックを入れます:
あとは衝突したときに実行されるスクリプトをC#で作る必要がありますね.barにRigidbodyを設定したのでbarControllerに書いていきましょう.衝突した際のトリガーとなるメソッドはUnityでは決められていて2Dの場合,OnTriggerEnter2D(collider)となります.ここで引数となるcolliderは文字は何でもよいのですが,Collider2D型のオブジェクトになります.イメージで言うとbarにballが衝突したときの引数のオブジェクトがballになります.今回はbarにballが衝突したら消えてほしいのでDestroyしておきましょう.ProjectビューのAssetsでbarControllerをダブルクリックして,visual studioで編集状態にし,次のコードを追加してください:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class barController : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { if (Input.GetKey(KeyCode.LeftArrow) && transform.position.x > -4) { transform.Translate(-0.1f, 0, 0); } if (Input.GetKey(KeyCode.RightArrow) && transform.position.x < 4) { transform.Translate(0.1f, 0, 0); } } void OnTriggerEnter2D(Collider2D collider) { Destroy(collider.gameObject); } }
あとはこれを保存してPlayボタンを押して実行してみましょう.ちょっとわかりづらいですが,バーにボールが衝突するとボールが消えていますね.
今回はここまでです.今回は苦労して当たり判定までやったのにバーにボールが当たるとボールが消えるだけでした.次回はいよいよこの当たり判定を使ってスコアを付けていきます.
こうご期待!