FuruiTweetUnity入門のゲーム作成チュートリアル第4弾の「城防衛シューティングゲーム」です!襲来してくる敵を大砲で迎撃し、城を守りきることができれば勝利というゲームを作成していきます。完成イメージ※そのほかのゲーム作成記事に関する情報は以下記事をご参考ください。第3回の今回は「敵を倒してエフェクトをつける」方法をご紹介します。敵と弾が衝突したときの当たり判定と当たったときのエフェクトを実装します。前回の「《第2回》敵を自動生成する」では以下の処理を作成してきました。第2回までをまだ完成させていない!という方は「《第1回》大砲で弾を撃つ」「《第2回》敵を自動生成する」を参考にして処理を完成させてください。第3回の今回は以下の処理を作成していきます。当たり判定時の処理(敵・弾の削除&エフェクト)以上を中心に進めます。敵スクリプトに当たり判定メソッドを追加する当たり判定時の処理を実装するの順番で進めます。今回もできる限りわかりやすく解説していきますのでぜひご参考ください。敵と大砲の弾の当たり判定を実装する敵と大砲の弾の当たり判定を実装します。方法はシンプルで、生成された敵のスクリプトに大砲の弾との当たり判定を記述するのみです。当たり判定スクリプトを作成する当たり判定スクリプトを作成する前に、Bulletプレハブのタグを「Bullet」に変更します。Bulletタグ作成Bulletプレハブを選択してインスペクターウィンドウの上部のTagから「Bullet」タグに変更してください。変更方法は以下記事内の「タグ付けをする」をご参考ください。次に敵にアタッチする当たり判定スクリプトを作成します。Scriptsフォルダに「HitController」スクリプトを作成し、以下のように変更してください。collision){//衝突したオブジェクトがBullet(大砲の弾)だったときif(collision.gameObject.CompareTag("Bullet")){Debug.Log("敵と弾が衝突しました!!!");}}}プログラムを解説します。8行目を見てください。collision)」はスクリプトをアタッチしているオブジェクトに物理的に衝突したオブジェクトの情報を引数Collision型のcollisionとして渡します。簡単に言うと、衝突したオブジェクト情報を取得するメソッドです。11行目を見てください。if(collision.gameObject.CompareTag("Bullet"))1if(collision.gameObject.CompareTag("Bullet"))このif文は衝突したオブジェクトのタグをCompareTagを用いて「Bullet」であるかどうかを判定しています。if文の中では詳しい処理は記述せずにコンソールに衝突したことがわかるようにしています。それではこのスクリプトをEnemyプレハブにアタッチして確認してみましょう。敵と弾が当たっていることを認識させることができました。これだけの記述で当たり判定を実装できるUnityは素晴らしいですね!これでif文の中身を書き換えれば様々な処理を実装することができます。当たり判定時の処理を実装する当たり判定を実現できましたので、ここからは当たったときの処理を実装していきます。敵と弾を削除するまずは弾が当たったときに敵と弾を削除します。先ほど作成したHitControllerスクリプトを以下のように書き換えてください。collision){//衝突したオブジェクトがBullet(大砲の弾)だったときif(collision.gameObject.CompareTag("Bullet")){//敵(スクリプトがアタッチされているオブジェクト自身)を削除Destroy(gameObject);//弾(引数オブジェクト)を削除Destroy(collision.gameObject);}}}ハイライトされた部分を見てください。「Destroy(Object)」は引数として渡したオブジェクトを削除します。これによって敵と弾を削除することができます。実際に実行して確認してみましょう。当たり判定に続けてとても簡単に削除を実装できることがおわかりいただけましたでしょうか。Unityにはこのような便利なメソッドがたくさんあります。難しく考えていたことがたったの一文で実装できてしまうことが多々ありますので、悩んだときはUnity公式レファレンスを探してみることをおすすめします。エフェクトを作成する次に敵と弾が衝突したときのエフェクトを作成します。ここでは既存のエフェクトを利用します。5.x」をダウンロード&インポートしてください。5.xこれらのエフェクトはほとんどが「パーティクル」を用いて作成されています。オリジナルのエフェクトを作成してみたい!という方は以下記事をご参考ください。参考記事)パーティクル徹底解説まずはスクリプトを書き換えます。先ほど作成したHitControllerスクリプトを以下のように変更してください。gameObject.transform.position;}}プログラムを解説します。8行目では今回発生させるエフェクトを格納するための変数を定義しています。publicにしているのはオブジェクトをUnityエディタでアタッチできるようにするためです。22行目ではエフェクトを生成するメソッド「GenerateEffect()」を呼び出しています。27行目〜34行目を見てください。gameObject.transform.position;}このメソッドはアタッチしたプレハブ(発生させたいエフェクト)をインスタンス化(生成)して発生場所を決定させるメソッドです。インスタンス化等のゲームオブジェクトに関する情報について詳しく知りたい方は以下記事をご参考ください。参考記事)ゲームオブジェクトについてこれでエフェクトが生成されるようになります。次に使用するエフェクトを少しだけ編集します。Effects→Prefabs→「EnergyExplosion」を使用します。EnergyExplosionこのプレハブをそのまま編集してしまうと再びこのプレハブを使用するときに不便なので、一旦コピーして別のプレハブとして編集します。手順は以下の通りです。Prefabを選択してプレハブ化を解除する名前を「EnemyExplosion」に変更するEnemyExplosionを自前のPrefabsフォルダにドラッグ&ドロップしてプレハブ化EnergyExplosionを別プレハブ化これでオリジナルのプレハブに変更されました。プレハブ化したらシーンにあるEnemyExplosionは邪魔ですので削除しておきましょう。次にこのプレハブが生成されてから一定時間がすぎると自動的に生成したプレハブを削除するスクリプトを作成します。生成したプレハブを削除する理由をここでは深く言及しませんが、シーン(メモリ)に使わなくなったオブジェクトを残しておくことはUnityに限らず、アプリケーション・システムにとって良いことではありません。使わなくなったオブジェクトはこまめに削除することをおすすめします。それではScriptsフォルダに「EffectBreaker」スクリプトを作成して、以下のように変更してください。BreakEffect(){Destroy(gameObject);}}仕組みはいたってシンプルです。このスクリプトをアタッチしているオブジェクトが生成されたときに呼び出されるStartメソッドの中で「Invoke(メソッド名,時間)」を利用して一定時間後に指定したメソッドを呼び出します。「Invoke」は第一引数にString型でメソッド名を指定します。第二引数には指定したメソッドを呼び出したい時間を指定します。ここでは自分自身を削除するメソッド「BreakEffect」を「2秒後」に呼び出すという仕組みにしています。このスクリプトを先ほど作成したEnemyExplosionプレハブにアタッチすれば完了です。(以下GIF参照)EnergyExplosionにスクリプトをアタッチこれでオブジェクトが生成された2秒後にそのオブジェクトを削除する仕組みを作成することができました。最後に完成したEnemyExplosionプレハブを敵プレハブのHitControllerスクリプトにアタッチして完成です。(以下GIF参照)HitControllerにエフェクトをアタッチそれでは実際に実行して確認してみましょう。敵オブジェクトが破壊されるタイミングでエフェクトが発生し、ヒエラルキーウィンドウでは生成されたエフェクト(EnemyExplosion)が一定時間後に削除されていることが確認できました。このように当たり判定を用いてオブジェクトを削除したり、エフェクトをつけたりすることができます。まとめいかがでしたでしょうか。今回は敵を倒してエフェクトをつける方法についてご紹介してきました。当たり判定というと難しそうに見えますが、ここまで進めてきた方にとってはもう難しいものと感じることはなくなったのではないでしょうか。エフェクトについても当たり判定のメソッドと組み合わせることで非常に簡単に実装することができます。gardenお問い合わせはこちらから※「XR-Hub」商標出願中CloseTwitterでAR/VRの最新情報を受け取る。