ダークモード
第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(パーティクル=小さなつぶをたくさん出す仕組み)で爆発を作ります。
- Hierarchy の何もないところを右クリックし、Effects > Particle System を選ぶ
- できたオブジェクトの名前を
Explosionに変える - Inspector の Transform で Position を (0, 0, 0) にする
- Scene ビューで、白いつぶが上に向かってふわふわ出ているのを確認する
ヒント
Particle System を選んでいるあいだ、Scene ビューの右下に Particle Effect という小さなパネルが出ます。Restart を押すと、最初から再生し直せます。設定を変えるたびに押して、見た目を確認しましょう。
1-2. Main モジュール(基本の設定)
Inspector の Particle System の一番上のかたまりが Main モジュールです。次のように変えます。
- Duration(再生する長さ)を
0.5にする - Looping(くり返し)のチェックを外す
- Start Lifetime(つぶが消えるまでの秒数)の右にある小さな ▼ をクリックし、Random Between Two Constants を選ぶ
- 出てきた2つの数字を
0.3と0.6にする - Start Speed(飛び出す速さ)も同じように Random Between Two Constants にして、
3と6にする - Start Size(つぶの大きさ)も Random Between Two Constants にして、
0.2と0.5にする - Start Color の色の部分をクリックし、明るいオレンジ色を選ぶ
- Play On Awake にチェックが入っていることを確認する
- 一番下のほうにある Stop Action を Destroy にする
注意
Stop Action を Destroy にすると、再生が終わったときにオブジェクトが自動で消えます。爆発はたくさん出るので、消さないとゲームがどんどん重くなります。ここは絶対に忘れないでください。
1-3. Emission(いっぺんに出す)
爆発は「パッと一度に」つぶが出るのがポイントです。
- Emission の文字をクリックして開く
- Rate over Time(1秒に出す数)を
0にする - Bursts(いっせいに出す設定)の右下にある + をクリックする
- 追加された行の Time が
0、Count を30にする
1-4. Shape(どの形から出すか)
- Shape の文字をクリックして開く
- Shape を Sphere(球)にする
- Radius(半径)を
0.2にする
これで、真ん中から全方向へつぶが飛び散るようになります。
1-5. 色と大きさを時間で変える
- Color over Lifetime の左のチェックを入れて、文字をクリックして開く
- Color の横の白い帯をクリックすると、Gradient Editor(グラデーションを作る画面)が開く
- 帯の下側にある左のマーカーをクリックし、Color を黄色にする
- 下側の右のマーカーをクリックし、Color を赤にする
- 帯の上側にある右のマーカーをクリックし、Alpha(不透明度)を
0にする - Gradient Editor を閉じる
- Size over Lifetime の左のチェックを入れて、文字をクリックして開く
- Size の横のグラフをクリックすると、Inspector の下にグラフが出る
- グラフの下に並んでいる見本の中から、右下がりの線を選ぶ
これで「黄色く光って、赤くなりながら小さく消えていく」爆発になります。
ヒント
つぶがピンク色の四角に見えるときは、マテリアルがうまく付いていません。Renderer モジュールを開き、Material に第6回の星で使ったパーティクル用マテリアル(Mat_Star)を入れてください。
1-6. プレハブにする
- Project ウィンドウで
Assets/_Game/Prefabsフォルダを開く - Hierarchy の
Explosionを、Prefabs フォルダへドラッグする - Project に
Explosionプレハブができたのを確認する - Hierarchy の
Explosionを選んで Delete キーで消す - Ctrl+S(Macは Cmd+S)でシーンを保存する
1-7. 動作確認
- Project の
Explosionプレハブを、Hierarchy にドラッグする - ▶ Play ボタンを押す
- 1回だけ「パッ」と爆発し、Hierarchy から
Explosionが消えればOK - ▶ をもう一度押して止める
- Play を止めると
Explosionは Hierarchy に戻っているので、選んで Delete キーで消す
よくあるまちがい
爆発がくり返し出つづける → Looping のチェックが外れていません。 Hierarchy から消えない → Stop Action が Destroy になっていません。 プレハブを直したいときは、Project の Explosion をダブルクリックしてプレハブを開いてから直しましょう。
2. (任意)Cartoon FX Remaster Free を使う
自作の爆発で十分ですが、もっとかっこいい爆発にしたい人は、無料の素材を使う方法もあります。この章はやらなくても先へ進めます。
2-1. Asset Store で手に入れる
- ブラウザで Asset Store の Cartoon FX Remaster Free のページを開く https://assetstore.unity.com/packages/p/cartoon-fx-remaster-free-109565
- Unity アカウントでサインインする
- Add to My Assets(マイアセットに追加)を押す
- 利用規約が出たら、内容を確認して同意する
注意
Asset Store の素材は、利用規約で再配布(ファイルそのものを他の人に配ること)が禁止されています。作ったゲームを遊んでもらうのは大丈夫ですが、素材のファイルをそのまま友だちに渡したり、ネットにアップロードしたりしてはいけません。規約に同意するときは、保護者や先生と一緒に確認しましょう。
2-2. Unity に読み込む
- Unity で Window > Package Manager を開く
- 左側の一覧から My Assets を選ぶ
- 一覧から Cartoon FX Remaster Free を選ぶ
- 右側の Download を押す(終わると Import に変わる)
- Import を押す
- 出てきたウィンドウで、すべてにチェックが入ったまま Import を押す
- Project ウィンドウに、素材のフォルダ(
JMO Assetsなど)が増えたことを確認する
2-3. 爆発を選んで使う
- 読み込んだフォルダの中の、プレハブが入っているフォルダを開く
- プレハブをクリックして、Inspector の下のプレビューで見た目を確かめる
- 名前に
Explosionが付いているものなど、好きな爆発を選ぶ - この後の 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. 効果音のファイルを選ぶ
- Project ウィンドウで
Assets/ThirdParty/KenneySoundsフォルダを開く - 音のファイルをクリックし、Inspector の下にあるプレビューの ▶ で音を聞く
- 発射音に使う音を1つ選ぶ(例:
laserSmall_000) - 爆発音に使う音を1つ選ぶ(例:
explosionCrunch_000)
ヒント
ファイル名は例です。名前が違ったら、聞いてみて好きな音を選んでOKです。
4-3. 敵プレハブに爆発と音を入れる
- Project の
Assets/_Game/PrefabsでEnemy_Straightプレハブをクリックする - Inspector の Enemy コンポーネントに Explosion Prefab と Explosion Sound が増えているのを確認する
- Project の
Explosionプレハブを、Explosion Prefab の欄へドラッグする - 爆発音のファイルを、Explosion Sound の欄へドラッグする
4-4. 自機に爆発と音を入れる
- Hierarchy で
Playerを選ぶ - Player Life コンポーネントの Explosion Prefab に
Explosionプレハブをドラッグする - Explosion Sound に爆発音のファイルをドラッグする
- Ctrl+S(Macは Cmd+S)でシーンを保存する
4-5. 動作確認
▶ Play ボタンを押して、弾で敵を倒すと爆発して音が鳴り、自機が敵にぶつかると自機も爆発すればOK。
4-6. 弾を撃つ音を鳴らす
発射音は自機から何度も鳴らすので、自機に AudioSource(スピーカー)を付けて PlayOneShot を使います。
- Hierarchy で
Playerを選ぶ - Inspector の一番下の Add Component を押し、
Audio Sourceと入力して選ぶ - Audio Source の AudioClip は空のままにする
- Play On Awake のチェックを外す
- 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. 発射音をつなぐ
- Hierarchy で
Playerを選ぶ - Player Shooter コンポーネントの Shot Sound に、発射音のファイルをドラッグする
- 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 に付けます。
- Hierarchy で
Main Cameraを選ぶ - Add Component を押し、
Audio Sourceと入力して選ぶ - Project の
Assets/ThirdParty/Musicから BGM のファイルを、AudioClip の欄へドラッグする - Play On Awake にチェックが入っていることを確認する
- Loop(くり返し)にチェックを入れる
- Volume を
0.3くらいにする - 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 にして流す