Unity:敵の作成と当たり判定~公式チュートリアル 2Dシューティングに挑戦

今回はUnity公式サイトに掲載されているチュートリアルの2Dシューティングに挑戦。敵の作成と当たり判定のステップを行いました。チュートリアルを進めながら変更した箇所などをピックアップしています。

前回の記事はこちら。
Unity:自機の移動と弾の発射~公式チュートリアル 2Dシューティングに挑戦

敵を作成しよう

チュートリアルページ:敵を作成しよう
このステップの手順は次の通りです。

  1. スクリプトの使い回し
  2. 敵を表示する
  3. 敵専用のスクリプトを書く

Spaceship.csの作成

このステップではまず自機と敵機で共通の処理(機体の移動と弾の発射)をスクリプトSpaceship で実装し直します。チュートリアルに掲載されているスクリプトにコメントを加えました。また Rigidbody2D コンポーネントの取得は Awake 処理に移動しました。

スクリプト Spaceship で Rigidbody2D コンポーネントの取得を Awake() 関数で処理した理由

スクリプト Enemy の Start() 関数では、スクリプト Spaceship の呼び出しと機体の移動処理 spaceship.Move を実行しています。

スクリプト Spaceship の Start() 関数で Rigidbody2D コンポーネントの取得を行うと、スクリプト Enemy の機体移動処理 spaceship.Move(transform.up * -1) と同時に処理されるため、Rigidbody2D コンポーネントの参照が間に合わずにエラーが発生する場合がありました。

RequireComponent

作成した Spaceship スクリプトを自機や敵機に割り当てると Loosing prefab のダイアログが表示されます。スクリプト Spaceship から強制的に Rigidbody2D コンポーネントを追加するのでプレハブ構造が解除されますが続けますか?という質問なので[Continue]ボタンをクリック。

先に作成した自機制御のスクリプト Player の修正です。こちらも Rigidbody2D コンポーネントの取得は Start 処理に移動したままで弾を発射する処理のみコルーチンにしています。

弾の作成

敵機の弾オブジェクトのプレハブを作成したのでプレハブはこのようになりました。

弾の発射

この手順で掲載されているスクリプト Enemy の内容もコメントを加えて弾を発射する処理は新しくコルーチン Shot に書いています。

当たり判定とアニメーションイベントとレイヤー

チュートリアルページ:当たり判定とアニメーションイベントとレイヤー
このステップの手順は次の通りです。

  1. プレイヤーに当たり判定を付ける
  2. エネミーに当たり判定を付ける
  3. 弾に当たり判定を付ける
  4. スクリプトから当たり判定を検出する
  5. 爆発の制御
  6. 爆発した後のゲームオブジェクト削除
  7. 弾とエネミーが削除されるエリアを作る
  8. PlayerBulletゲームオブジェクトの削除

プレイヤーに当たり判定を付ける

チュートリアルでは当たり判定に Box Collider 2D を使用してかなり小さい当たり判定にしていましたが、敵機と同じく Polygon Collider 2D を使用して設定しました。

弾に当たり判定を付ける

チュートリアルでは弾のあたり判定の設定を「Circle Collider 2DのRudiusを0.14にして」と書いてありましたが、プロジェクトフォルダにある完成見本のプレハブ EnemyBullet を確認すると Rudius 0.07 になっていたので、そちらに合わせました。

アニメーションイベント

チュートリアルではプレハブ Explosion シーンに配置してから[Animation]ウィンドウを編集していましたが、別の方法も試してみました。

プレハブ Explosion シーンに配置せず、[Project]ウィンドウ > Animations > Explosion > Explode を選択。
[Animation]ウィンドウを開いて Event を作成。
[Inspector]ウィンドウ > Function フィールドに OnAnimationFinish と入力する方法でも大丈夫でした。

[Animation]ウィンドウ のオブジェクト名の左にある▼をクリックして展開するとスプライトが表示されて分かりやすいですね。

弾とエネミーが削除されるエリアを作る

こちらの手順で作成するスクリプト DestroyArea にコメントを追加しました。

スクリプトでレイヤー制御

この手順で修正したスクリプト Player にコメントを追加しました。

エネミーの当たり判定

こちらの手順で修正したスクリプト Player にコメントを追加しました。

WebGL

ここまでの内容を動作確認用にWebGLでビルドしてみました。ゲーム画面の縦横比と オブジェクトが削除されるエリア DestroyArea はWebページ埋め込み用に16:9に変更。敵機を複数配置して移動速度と弾の発射タイミングを調整しました。
画像クリックで再生(ファイルサイズ:約4MB)