見出し画像

Unityやってみる12:落下したオブジェクトが着地したら爆発させてみる・前編

 こんにちは、Unity素人おじさんです。ただしプログラミング歴は結構長いです。

 前回、「島を作成して、その上空に配置したモンスターの巣からモンスター(四角い物体)を落下させる」、というのを実現できました。

 で、次にどうするかなんですけど、師匠のENDOさんから「爆発エフェクト(パーティクル)」と「風」というお題をいただき、まず爆発をやってみることにしました。

 調べてみた所、「爆発エフェクト(パーティクル)」は、ヒエラルキーパネルの右クリック後、GameObject→Effects→Particle System、で追加できることがわかりました。ただ、設定項目が色々あるため、自分で爆発エフェクトを作るのは結構大変そうとわかって、無料アセットを利用することにしました。

 現時点で私がおすすめする、爆発エフェクトの入った無料アセットはこれ。Unity開発元であるUnity Technorogiesが提供しているもののようで、定期的に更新もされているようです。

上記のページで「パッケージの内容」を、確認することが出来ますね。私が今回使わせていただくのは、「BigExplosion.prefab」というプレハブです。

 インポートすると、プロジェクトパネルの「Assets」配下に、上記のフォルダーツリーの構成でそのままコピーされますので、上記プレハブをシーンビューにドラッグ&ドロップ、ですね。

 空のプロジェクトで試しに見てみました。大迫力ですね。爆発どーん!(ただし爆発音はないため、ちょっと寂しいです💦)

 今回、どのような処理を実現しようとしているかというと、まず上空に設置されたモンスターの巣をクリックしたら、四角いモンスターが生成され、落下するというのはこれまでと同じです。違うのはこの四角いモンスターが、地面と接触したら、爆発して消滅する、という点で、必要なのは①モンスターの接地判定、②接地したらモンスターを消去して爆発エフェクト発生、この2つですね。

 で、まず①モンスターの接地判定について、BingのチャットAIさんに聞いてみた所、「地面(terrainオブジェクト)に、Terrainっていうタグを付けておいて、モンスターに衝突判定のスクリプトを追加してTerrainタグのついたオブジェクトと衝突したかどうかを判定させるといいよ」、と教えてくれました。

 タグっていうのは、今回のように衝突判定を追加する場合に、「ぶつかったオブジェクトがどういうものなのかを、ざっくり知りたい」ような場合に、便利な機能ですね。

 やってみましょう。まずヒエラルキーパネルでTerrainを選択。

 インスペクターパネルにTerrainの情報が表示されます。「タグは未設定」というのがわかります。

 Untaggedの右の▼を押すと、予約されているタグ名が表示されます。適切なタグがあればそれを選びます。今回は一番下のAdd Tagを押して、新しいタグ名を追加します。

 自作したタグのリストが表示されるようです。右下の「+」を押します。

「Terrain」と入力して「Save」を押します。

0番のTagとして、「Terrain」というのが定義されました。

 ヒエラルキーパネルで「Terrain」オブジェクトを開き、タグがどうなっているか確認します。まだ未設定(Untagged)のままですね。

 再び▼を押すと、今度は「Terrain」というのが表示されますので、それを選びましょう。

タグが「Terrain」になりました! これで「衝突したのは地面(Terrain)である」という判定が可能になります。


次に、モンスター(Cubeオブジェクト)に、接地判定のスクリプトを追加していきます。現時点ではまだモンスターにはスクリプトがアタッチされてないので、「Add Component」で新規アタッチ。スクリプト名は、あまり深く考えずに「Explosion(爆発)」にしておきましょう。アタッチされたスクリプトを開いて、下記のスクリプトにまるまる置きかえます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Explosion : MonoBehaviour
{
    public GameObject explosionPrefab;

    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "Terrain")
        {
            Instantiate(explosionPrefab, transform.position, Quaternion.identity);
            Destroy(gameObject);
        }
    }
}

 上記はBing AIさんが、サンプルとして教えてくれたものそのままです(AIすご)。簡単にご説明すると、OnCollisionEnterというのが、他のオブジェクト(剛体など)に衝突した時に発生するイベントですね。で、その下でタグが「Terrain」かどうかを判定し、そうだったら、「explosionPrefab」というプレハブを、自分と同じ位置に出現させます。これが爆発(explosion)エフェクトになりますね。そして直後にDestroy(gameObject)で自分をシーンから取り除きます。四角い箱が消えて、爆発エフェクトだけが残るというわけですね。

 で、スクリプトを保存すると、下記のように「ExplosionPrefab」という変数(?)への参照設定が可能となります。今日ダウンロードした「Particle Pack」の「BigExplosion.prefab」を、Projectパネルでつかんでここにドロップしてやると、設定できました。

 実行して、動作確認してみましょう。上空のモンスターの巣をクリックすると、四角いキューブが発生して落下していきます。接地すると、次々と爆発! やりました! 完成です!

 と、思いましたが、あれれ? モンスターは消えましたが爆発は残り続けているようで、同じ場所で何度も何度も爆発しています。ヒエラルキーパネルを見ると、BigExplosion(Clone)というのが、いくつも置かれっぱなしになっています。これを自動で消すようにするには、どうすればいいのか?

 色々試行錯誤して一応うまく消すようにはできたのですが、ちょっと面倒な作業が必要なので、説明が長くなりそうです。今回は「前編」としておき、次回「後編」で解決していくことにします💦

後編はこちら:

この記事が気に入ったらサポートをしてみませんか?