Skip to content

第9回 爆発と音 ​

この回でつくるもの:敵や自機がやられたときに「ドカーン!」と爆発し、弾を撃つと「ピュン」と音が鳴るようにします。BGM も流して、一気にゲームらしくします。

この回で学ぶこと ​

  • Particle System で爆発エフェクトを作り、プレハブにする(Stop Action で自動で消す)
  • (任意)Asset Store の素材を Package Manager から入れる
  • スクリプトからプレハブを出して爆発させる(Instantiate の復習)
  • 効果音を鳴らす AudioClip・AudioSource・PlayOneShot・AudioSource.PlayClipAtPoint
  • BGM をループで流す

前回までのふりかえり ​

第8回で当たり判定を作りました。自機の弾が敵に当たると敵が消え、敵が自機に当たると自機が消えます。 でも、今は「パッ」と消えるだけで、少しさびしいですね。今回は爆発と音で、手ごたえのあるゲームにします。

1. 爆発のパーティクルを作る ​

1-1. Particle System を置く ​

第6回の星空でも使った Particle System(パーティクル=小さなつぶをたくさん出す仕組み)で爆発を作ります。

  1. Hierarchy の何もないところを右クリックし、Effects > Particle System を選ぶ
  2. できたオブジェクトの名前を Explosion に変える
  3. Inspector の Transform で Position を (0, 0, 0) にする
  4. Scene ビューで、白いつぶが上に向かってふわふわ出ているのを確認する

ヒント

Particle System を選んでいるあいだ、Scene ビューの右下に Particle Effect という小さなパネルが出ます。Restart を押すと、最初から再生し直せます。設定を変えるたびに押して、見た目を確認しましょう。

1-2. Main モジュール(基本の設定) ​

Inspector の Particle System の一番上のかたまりが Main モジュールです。次のように変えます。

  1. Duration(再生する長さ)を 0.5 にする
  2. Looping(くり返し)のチェックを外す
  3. Start Lifetime(つぶが消えるまでの秒数)の右にある小さな ▼ をクリックし、Random Between Two Constants を選ぶ
  4. 出てきた2つの数字を 0.3 と 0.6 にする
  5. Start Speed(飛び出す速さ)も同じように Random Between Two Constants にして、3 と 6 にする
  6. Start Size(つぶの大きさ)も Random Between Two Constants にして、0.2 と 0.5 にする
  7. Start Color の色の部分をクリックし、明るいオレンジ色を選ぶ
  8. Play On Awake にチェックが入っていることを確認する
  9. 一番下のほうにある Stop Action を Destroy にする

注意

Stop Action を Destroy にすると、再生が終わったときにオブジェクトが自動で消えます。爆発はたくさん出るので、消さないとゲームがどんどん重くなります。ここは絶対に忘れないでください。

1-3. Emission(いっぺんに出す) ​

爆発は「パッと一度に」つぶが出るのがポイントです。

  1. Emission の文字をクリックして開く
  2. Rate over Time(1秒に出す数)を 0 にする
  3. Bursts(いっせいに出す設定)の右下にある + をクリックする
  4. 追加された行の Time が 0、Count を 30 にする

1-4. Shape(どの形から出すか) ​

  1. Shape の文字をクリックして開く
  2. Shape を Sphere(球)にする
  3. Radius(半径)を 0.2 にする

これで、真ん中から全方向へつぶが飛び散るようになります。

1-5. 色と大きさを時間で変える ​

  1. Color over Lifetime の左のチェックを入れて、文字をクリックして開く
  2. Color の横の白い帯をクリックすると、Gradient Editor(グラデーションを作る画面)が開く
  3. 帯の下側にある左のマーカーをクリックし、Color を黄色にする
  4. 下側の右のマーカーをクリックし、Color を赤にする
  5. 帯の上側にある右のマーカーをクリックし、Alpha(不透明度)を 0 にする
  6. Gradient Editor を閉じる
  7. Size over Lifetime の左のチェックを入れて、文字をクリックして開く
  8. Size の横のグラフをクリックすると、Inspector の下にグラフが出る
  9. グラフの下に並んでいる見本の中から、右下がりの線を選ぶ

これで「黄色く光って、赤くなりながら小さく消えていく」爆発になります。

ヒント

つぶがピンク色の四角に見えるときは、マテリアルがうまく付いていません。Renderer モジュールを開き、Material に第6回の星で使ったパーティクル用マテリアル(Mat_Star)を入れてください。

1-6. プレハブにする ​

  1. Project ウィンドウで Assets/_Game/Prefabs フォルダを開く
  2. Hierarchy の Explosion を、Prefabs フォルダへドラッグする
  3. Project に Explosion プレハブができたのを確認する
  4. Hierarchy の Explosion を選んで Delete キーで消す
  5. Ctrl+S(Macは Cmd+S)でシーンを保存する

1-7. 動作確認 ​

  1. Project の Explosion プレハブを、Hierarchy にドラッグする
  2. ▶ Play ボタンを押す
  3. 1回だけ「パッ」と爆発し、Hierarchy から Explosion が消えればOK
  4. ▶ をもう一度押して止める
  5. Play を止めると Explosion は Hierarchy に戻っているので、選んで Delete キーで消す

よくあるまちがい

爆発がくり返し出つづける → Looping のチェックが外れていません。 Hierarchy から消えない → Stop Action が Destroy になっていません。 プレハブを直したいときは、Project の Explosion をダブルクリックしてプレハブを開いてから直しましょう。

2. (任意)Cartoon FX Remaster Free を使う ​

自作の爆発で十分ですが、もっとかっこいい爆発にしたい人は、無料の素材を使う方法もあります。この章はやらなくても先へ進めます。

2-1. Asset Store で手に入れる ​

  1. ブラウザで Asset Store の Cartoon FX Remaster Free のページを開く https://assetstore.unity.com/packages/p/cartoon-fx-remaster-free-109565
  2. Unity アカウントでサインインする
  3. Add to My Assets(マイアセットに追加)を押す
  4. 利用規約が出たら、内容を確認して同意する

注意

Asset Store の素材は、利用規約で再配布(ファイルそのものを他の人に配ること)が禁止されています。作ったゲームを遊んでもらうのは大丈夫ですが、素材のファイルをそのまま友だちに渡したり、ネットにアップロードしたりしてはいけません。規約に同意するときは、保護者や先生と一緒に確認しましょう。

2-2. Unity に読み込む ​

  1. Unity で Window > Package Manager を開く
  2. 左側の一覧から My Assets を選ぶ
  3. 一覧から Cartoon FX Remaster Free を選ぶ
  4. 右側の Download を押す(終わると Import に変わる)
  5. Import を押す
  6. 出てきたウィンドウで、すべてにチェックが入ったまま Import を押す
  7. Project ウィンドウに、素材のフォルダ(JMO Assets など)が増えたことを確認する

2-3. 爆発を選んで使う ​

  1. 読み込んだフォルダの中の、プレハブが入っているフォルダを開く
  2. プレハブをクリックして、Inspector の下のプレビューで見た目を確かめる
  3. 名前に Explosion が付いているものなど、好きな爆発を選ぶ
  4. この後の 3章で Explosion プレハブを入れるところに、選んだプレハブを入れれば差し替えられる

ヒント

  • 選んだプレハブが消えずに残る場合は、Inspector で Stop Action を Destroy にしてください(素材によっては、付いているスクリプト側に「終わったら消す」設定があります)。
  • 見た目がおかしいときは、URP の設定で Depth Texture が必要な場合があります。Project で Assets/Settings フォルダの中の Render Pipeline Asset(PC_RPAsset など)を選び、Inspector の Rendering にある Depth Texture にチェックを入れてみましょう。

先生へ

Cartoon FX Remaster Free は再配布不可の素材です。授業用にプロジェクトを配る場合は、この素材を含めず、生徒それぞれに Asset Store から入手させてください。ビルドしたゲーム(第19回の WebGL 公開など)に含めるのは問題ありません。

3. 敵と自機を爆発させる ​

3-1. Enemy に爆発と爆発音を追加する ​

Assets/_Game/Scripts の Enemy をダブルクリックして開き、次のように書きかえます。

csharp
using UnityEngine;

// 敵の基本(移動・HP・やられたとき)
public class Enemy : MonoBehaviour
{
    public float speed = 3f;              // 左へ進む速さ
    public int hp = 1;                    // 体力(第8回)
    public GameObject explosionPrefab;    // 爆発(第9回) // ★追加
    public AudioClip explosionSound;      // 爆発音(第9回) // ★追加

    bool isDead = false;

    void Update()
    {
        transform.Translate(Vector3.left * speed * Time.deltaTime, Space.World);

        // 画面の左に出たら消す
        if (transform.position.x < -12f)
        {
            Destroy(gameObject);
        }
    }

    // ダメージを受ける(第8回)
    public void TakeDamage(int damage)
    {
        if (isDead) return;

        hp -= damage;
        if (hp <= 0)
        {
            Die();
        }
    }

    void Die()
    {
        isDead = true;

        if (explosionPrefab != null)                                                    // ★追加
        {                                                                               // ★追加
            Instantiate(explosionPrefab, transform.position, Quaternion.identity);      // ★追加
        }                                                                               // ★追加
        if (explosionSound != null)                                                     // ★追加
        {                                                                               // ★追加
            AudioSource.PlayClipAtPoint(explosionSound, Camera.main.transform.position); // ★追加
        }                                                                               // ★追加

        Destroy(gameObject);
    }
}

Ctrl+S(Macは Cmd+S)でスクリプトを保存します。

コードの解説 ​

行意味
public GameObject explosionPrefab;爆発のプレハブを入れる箱。Inspector から入れる
public AudioClip explosionSound;爆発の音を入れる箱。AudioClip(オーディオクリップ)は「音のデータ」のこと
if (explosionPrefab != null)箱が空っぽ(null)でないときだけ爆発を出す。入れ忘れてもエラーで止まらない
Instantiate(explosionPrefab, transform.position, Quaternion.identity);敵がいた場所に爆発を出す。第5回で弾を出したのと同じ書き方
AudioSource.PlayClipAtPoint(...)指定した場所で音を1回鳴らす(くわしくは 4章)

ヒント

爆発を出したあとで Destroy(gameObject) で敵を消しても、爆発は消えません。爆発は別のオブジェクトとして出しているからです。爆発のほうは Stop Action で自分で消えます。

3-2. PlayerLife に爆発と爆発音を追加する ​

次に PlayerLife を開いて、次のように書きかえます。

csharp
using UnityEngine;

// 自機がやられる
public class PlayerLife : MonoBehaviour
{
    public GameObject explosionPrefab;    // 爆発(第9回) // ★追加
    public AudioClip explosionSound;      // 爆発音(第9回) // ★追加

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Enemy"))
        {
            Die();
        }
    }

    void Die()
    {
        if (explosionPrefab != null)                                                    // ★追加
        {                                                                               // ★追加
            Instantiate(explosionPrefab, transform.position, Quaternion.identity);      // ★追加
        }                                                                               // ★追加
        if (explosionSound != null)                                                     // ★追加
        {                                                                               // ★追加
            AudioSource.PlayClipAtPoint(explosionSound, Camera.main.transform.position); // ★追加
        }                                                                               // ★追加

        Destroy(gameObject);
    }
}

保存します。やっていることは Enemy とまったく同じです。

4. 効果音を鳴らす ​

4-1. 音を鳴らすしくみ ​

Unity で音を鳴らすには、次の3つが関係します。

名前役割たとえると
AudioClip(オーディオクリップ)音のデータ(.wav や .ogg のファイル)CD やレコード
AudioSource(オーディオソース)音を鳴らすコンポーネントスピーカー
Audio Listener(オーディオリスナー)音を聞くコンポーネント。Main Camera に最初から付いている耳

音の鳴らし方は2種類使います。

  • audioSource.PlayOneShot(音) … 自分に付いている AudioSource で、音を1回鳴らす。何回呼んでも音が重なって鳴るので、連射の音にぴったり
  • AudioSource.PlayClipAtPoint(音, 場所) … その場所に「音を鳴らすだけの一時的なオブジェクト」を作って鳴らし、鳴り終わったら自動で消す。すぐに消えてしまうオブジェクト(やられた敵など)の音に使う

ヒント

敵に AudioSource を付けて鳴らすと、すぐ後の Destroy(gameObject) でスピーカーごと消えて、音が途中で切れてしまいます。だから敵や自機の爆発音は PlayClipAtPoint を使います。 鳴らす場所を Camera.main.transform.position(カメラの位置=耳の位置)にしているのは、音が遠くて小さくなるのを防ぐためです。

4-2. 効果音のファイルを選ぶ ​

  1. Project ウィンドウで Assets/ThirdParty/KenneySounds フォルダを開く
  2. 音のファイルをクリックし、Inspector の下にあるプレビューの ▶ で音を聞く
  3. 発射音に使う音を1つ選ぶ(例: laserSmall_000)
  4. 爆発音に使う音を1つ選ぶ(例: explosionCrunch_000)

ヒント

ファイル名は例です。名前が違ったら、聞いてみて好きな音を選んでOKです。

4-3. 敵プレハブに爆発と音を入れる ​

  1. Project の Assets/_Game/Prefabs で Enemy_Straight プレハブをクリックする
  2. Inspector の Enemy コンポーネントに Explosion Prefab と Explosion Sound が増えているのを確認する
  3. Project の Explosion プレハブを、Explosion Prefab の欄へドラッグする
  4. 爆発音のファイルを、Explosion Sound の欄へドラッグする

4-4. 自機に爆発と音を入れる ​

  1. Hierarchy で Player を選ぶ
  2. Player Life コンポーネントの Explosion Prefab に Explosion プレハブをドラッグする
  3. Explosion Sound に爆発音のファイルをドラッグする
  4. Ctrl+S(Macは Cmd+S)でシーンを保存する

4-5. 動作確認 ​

▶ Play ボタンを押して、弾で敵を倒すと爆発して音が鳴り、自機が敵にぶつかると自機も爆発すればOK。

4-6. 弾を撃つ音を鳴らす ​

発射音は自機から何度も鳴らすので、自機に AudioSource(スピーカー)を付けて PlayOneShot を使います。

  1. Hierarchy で Player を選ぶ
  2. Inspector の一番下の Add Component を押し、Audio Source と入力して選ぶ
  3. Audio Source の AudioClip は空のままにする
  4. Play On Awake のチェックを外す
  5. Volume を 0.5 くらいにする

次に PlayerShooter を開いて、次のように書きかえます。

csharp
using UnityEngine;
using UnityEngine.InputSystem;

// 弾を撃つスクリプト
public class PlayerShooter : MonoBehaviour
{
    public GameObject bulletPrefab;     // ふつうの弾
    public Transform muzzle;            // 弾が出る場所
    public float fireInterval = 0.15f;  // 連射の間隔(秒)

    public AudioClip shotSound;         // 発射音(第9回) // ★追加

    float timer;
    InputAction attackAction;
    AudioSource audioSource;                                // ★追加

    void Start()
    {
        attackAction = InputSystem.actions.FindAction("Attack");
        audioSource = GetComponent<AudioSource>();          // ★追加
    }

    void Update()
    {
        timer -= Time.deltaTime;

        if (attackAction.IsPressed() && timer <= 0f)
        {
            Shoot();
            timer = fireInterval;
        }
    }

    void Shoot()
    {
        Instantiate(bulletPrefab, muzzle.position, Quaternion.identity);

        if (shotSound != null)                  // ★追加
        {                                       // ★追加
            audioSource.PlayOneShot(shotSound); // ★追加
        }                                       // ★追加
    }
}

保存します。

コードの解説 ​

行意味
public AudioClip shotSound;発射音を入れる箱
AudioSource audioSource;自機に付けた AudioSource を覚えておく変数。public を付けていないので Inspector には出ない
audioSource = GetComponent<AudioSource>();同じオブジェクト(Player)に付いている AudioSource を探して覚える。第8回の GetComponent と同じ
audioSource.PlayOneShot(shotSound);発射音を1回鳴らす。連射しても前の音が切れずに重なる

4-7. 発射音をつなぐ ​

  1. Hierarchy で Player を選ぶ
  2. Player Shooter コンポーネントの Shot Sound に、発射音のファイルをドラッグする
  3. Ctrl+S(Macは Cmd+S)でシーンを保存する

4-8. 動作確認 ​

▶ Play ボタンを押して、Z キーか Space キーで弾を撃つと「ピュンピュン」と音が鳴ればOK。

ヒント

音がうるさすぎるときは、Player の Audio Source の Volume を下げましょう。

5. BGM を流す ​

5-1. Main Camera に AudioSource を付ける ​

BGM(バックグラウンドミュージック)は、ゲーム中ずっと流れる音楽です。いつも画面にある Main Camera に付けます。

  1. Hierarchy で Main Camera を選ぶ
  2. Add Component を押し、Audio Source と入力して選ぶ
  3. Project の Assets/ThirdParty/Music から BGM のファイルを、AudioClip の欄へドラッグする
  4. Play On Awake にチェックが入っていることを確認する
  5. Loop(くり返し)にチェックを入れる
  6. Volume を 0.3 くらいにする
  7. Ctrl+S(Macは Cmd+S)でシーンを保存する

注意

Main Camera には最初から Audio Listener(耳)が付いています。これを消してしまうと、何も聞こえなくなります。Audio Listener はシーンに1つだけにしましょう。

5-2. 動作確認 ​

▶ Play ボタンを押して、BGM が流れ、曲が終わってもまた最初から流れればOK。効果音と BGM の音量のバランスも調整してみましょう。

ヒント

Game ビューの上のほうにある スピーカーのアイコン(Mute Audio)が押されていると、音が出ません。音が出ないときは確認しましょう。

チャレンジ課題 ​

  • 爆発の Start Color を Random Between Two Colors にして、黄色とオレンジの2色が混ざるようにしてみよう
  • Explosion プレハブを複製して、自機用の大きな爆発(Explosion_Big)を作り、Player の Explosion Prefab に入れてみよう(ヒント: Count を増やす、Start Speed を大きくする)
  • 爆発の中心に、ぱっと光る大きなつぶを1つ出してみよう(ヒント: Bursts の行をもう1つ増やすか、子オブジェクトに別の Particle System を作る)
  • 敵ごとに違う爆発音を入れてみよう

つまずきポイント ​

こんなときはここを確認
爆発が出ない敵プレハブの Explosion Prefab に Explosion が入っているか。シーンの敵ではなく、Project のプレハブに入れたか
爆発がずっと残る・くり返すExplosion の Looping が OFF か、Stop Action が Destroy か
つぶがピンク色Renderer の Material にパーティクル用マテリアルが入っているか
音が出ないMain Camera に Audio Listener があるか。Game ビューの Mute Audio が押されていないか。Shot Sound などに音が入っているか
NullReferenceException が出る(PlayerShooter)Player に Audio Source コンポーネントを付けたか
発射音が最初に1回勝手に鳴るPlayer の Audio Source の AudioClip を空にしたか、Play On Awake を外したか

まとめ ​

  • Particle System は Bursts で一度に出し、Stop Action: Destroy で自動で消すと爆発になる
  • 音は AudioClip(音のデータ)を AudioSource(スピーカー)で鳴らし、Audio Listener(耳)で聞く
  • 連射の音は PlayOneShot、すぐ消えるオブジェクトの音は AudioSource.PlayClipAtPoint を使う
  • BGM は Main Camera の AudioSource で Loop を ON にして流す