Unity ゲーム開発日記:当たり判定を作る
はじめに
今回は当たり判定を作っていきます
これができれば最低限のシューティングゲームのシステムができるはずです
Colliderの設定
衝突判定のためにオブジェクトの形状を定義します
Playerには「Box Collider」、Enemyには「Sphere Collider」にしました
いい感じに大きさを調節します
次にオブジェクトのレイヤーを分けます
何も設定していない場合、オブジェクトは全て衝突してしまいます
オブジェクトがどのオブジェクトと衝突するかは、レイヤーを設定することで簡単に決められるようです
Edit > Project Settings > Tags and Layers で以下のように設定
Edit > Project Settings > Physics で以下のように設定
Bullet どうしも衝突するようにしました
Particle System 作成
PlayerまたはEnemyが相手のBulletに衝突して消滅するときのエフェクトとしてParticle Systemを作成します
Create > Effects > Particle System を選択、名前は「enemyParticle」とします
設定は以下のように(好きなように)
新しくマテリアルを作成してenemy用の画像を設定
Shader を Particle > Alpha Blended にする
作成したマテリアルをParticle Systemに設定
こんな感じになります
これをEnemyが消滅したときに発生させます
同じようにPlayer用のParticle Systemも作ります
Particle System のパーティクルに画像を設定
衝突時のイベントを書く
衝突判定には方法が二つあるようです
レイヤーを設定するとTriggerを使えますが、 今回はOnCollisionEnter関数を使ってみます
各オブジェクトに「Tag」を設定します
「Tag」を利用して衝突したオブジェクトを判別します
Particle System は Prefab 化してから Instantiate 関数を用いて発生させます
// PlayerDriver.csに追加 public GameObject playerParticleSystem; // 衝突時のイベント void OnCollisionEnter(Collision col) { // 衝突したオブジェクトのTagが敵の弾かどうか if (col.gameObject.tag != "EnemyBullet") return; Debug.Log(col.gameObject.tag); Debug.Log(gameObject.name); // Particle System を起動 GameObject pps = Instantiate(playerParticleSystem, transform.position, transform.rotation); Destroy(pps, 2f); // 弾を削除 Destroy(col.gameObject); // Enemyオブジェクトを削除 Destroy(gameObject); }
// EnemyDriver.csに追加 public GameObject enemyParticleSystem; // 衝突時のイベント void OnCollisionEnter(Collision col) { // 衝突したオブジェクトのTagがプレイヤーの弾かどうか if (col.gameObject.tag != "PlayerBullet") return; Debug.Log(col.gameObject.tag); Debug.Log(gameObject.name); // Particle System を起動 GameObject eps = Instantiate(enemyParticleSystem, transform.position, transform.rotation); Destroy(eps, 2f); // 弾を削除 Destroy(col.gameObject); // Enemyオブジェクトを削除 Destroy(gameObject); }
当たり判定を取り入れたゲームはこんな感じになりました
画像では分かりにくいですが、当たり判定がうまく働いています
弾が敵に当たるとParticleSystemを発生させた後、敵が消滅します
おわりに
無事に当たり判定を取り入れることができました
これでシューティングゲームの最低限のシステムができました
次はクリア条件などゲームとして遊べるようにしていきます