はじめに
一般的なシューティングゲームの基本的な動作となる、敗北条件やプレイヤーの上下左右の移動を組み込んでみました。
プレイヤーと敵の接触を検知するために、Unityの物理演算機能「OnTriggerEnter2D」を使用しています。
ゲーム仕様
新しく追加した仕様には「(新)」を付けています。
変更した仕様に「(変)」を付けています。
- (新)プレイヤーHP設定:初期HPは5
- (新)プレイヤーHP表示:画面右上に「HP:X」を常時表示する
- (新)敗北条件:HPが0になった時点で「GAME OVER」UIを表示し、ゲームを停止する
- (変)操作方法:WASDキー または 十字キー(上下左右の移動)
- (新)攻撃方法:自動発射
- (新)敵キャラ実装数:20体(e001~e020)
- (新)敵キャラHP
- (新)e001~e010:1
- (新)e011~e020:2
- (新)敵キャラの移動:画面上から下方向に直進する
ここまでの成果
敵に5回当たると「GAME OVER」が表示されます。
敗北条件の実装
「敗北条件を実装するのはそこまで難しくないでしょ」と思っていましたが、浅慮でした。
「HPが0になったらゲームオーバー」という処理は、主に以下の3つのステップで構成しています。
当たり判定とHPの減少
プレイヤーが敵(敵の弾)に接触した瞬間を、システムが検知してHPを減らす処理を行います。
- 仕組み:UnityのOnTriggerEnter2Dを使用。
- 処理:衝突した相手のタグを確認し、タグが敵であればダメージ計算メソッド(TakeDamage)を呼び出します。
<抜粋:敵との衝突検知>
private void OnTriggerEnter2D(Collider2D other)
{
// 「Enemy(敵)」または「EnemyBullet(敵の弾)」というタグがついた物に当たったか確認
if (other.CompareTag("Enemy") || other.CompareTag("EnemyBullet"))
{
// ダメージ処理を呼び出す(1ダメージ)
TakeDamage(1);
// 敵の弾なら、当たった瞬間に消す
if (other.CompareTag("EnemyBullet"))
{
Destroy(other.gameObject);
}
}
}
HPの監視と分岐
ダメージを受けるたびに、プレイヤーの残り体力が「0以下」になっていないかをチェックします。
- 処理:currentHp(現在の体力)からダメージ値を引き、その結果が 0以下 であれば、ゲームオーバー用のメソッド(GameOver)を実行します。
- 体力が残っていれば、画面のHP表示を更新してゲームを続行します。
<抜粋:TakeDamageメソッド>
private void TakeDamage(int damage)
{
// HPを減算
currentHp -= damage;
// ダメージを受けたらHP表示(UI)を更新
UpdateHpText();
// HPが0以下になったらゲームオーバー処理へ
if (currentHp <= 0)
{
GameOver();
}
}
ゲーム停止
ゲームオーバーになったタイミングで、ゲーム内の時間を停止させます。
- ゲームオーバーが確定した瞬間、以下の2つの処理を同時に行います。
- UIの表示:非表示にしていた「GAME OVER」などのUI画面を有効化。
- 時間の停止:Unityの Time.timeScale を 0 に設定し、物理演算やアニメーションを含むゲーム内のすべての時間の流れをストップさせます。
private void GameOver()
{
// ゲームオーバーの文字(UI)を表示する
if (gameOverUI != null)
{
gameOverUI.SetActive(true);
}
// ゲーム内の時間を止める(これが0だとUpdateなどが進まなくなる)
Time.timeScale = 0f;
}
以上です。
コメント