こんにちは!怪獣です🦖
前回は「敵を踏んで倒す処理」を実装しました!
今回はそのアクションに効果音(SE)を追加して、より臨場感を出していきます!
この記事でやること
- ジャンプしたときに「ピョン!」という音を出す
- 敵にぶつかってダメージを受けたときに「ダメージ音」を出す
- 敵を上から踏んで再ジャンプしたときにも効果音を出す
効果音用のPrefabを作ろう
Prefabとは?
ゲームオブジェクトを“部品(パーツ)”として保存したもの。
Prefab化すると「一括管理」できるので、調整作業が圧倒的にラクになります。
- 効果音ファイル(.wavや.mp3)を用意する
→Assets/Audio/フォルダなどに保存- 今回はフリーのSEを使用します。

- 効果音用の空のGameObject(Create Empty)を作成する(例:
JumpSE)Add Component > AudioSourceを追加AudioClipに音声ファイルをドラッグして設定する- Play On Awake:ON(自動再生)
- Loop:OFF

- このオブジェクトをPrefab化する
Assets/Prefabs/SEフォルダを作成し、などに配置JumpSE.prefab- Hierarchyから上記フォルダへドラッグして保存

同様に、ダメージ音用のPrefab(例:DamageSE)も作っておきます🎧
Prefabにしておけば…
- 設定を1か所で管理できる
- 必要なときだけ作る
- 音が終わったら自動で消す
これができるので シーンがとてもスッキリ します。
Player.cs に効果音を組み込む
以下のようにPrefabを読み込んで、Instantiate()で音を鳴らします👇
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField, Header("ジャンプ速度")]
private float _jumpSpeed;
[SerializeField, Header("ジャンプSEプレハブ")]
private GameObject _jumpSE;
[SerializeField, Header("ダメージSEプレハブ")]
private GameObject _damageSE;
private Rigidbody2D _rigid;
private bool _bJump;
void Start()
{
_rigid = GetComponent<Rigidbody2D>();
_col = GetComponent<Collider2D>();
_currentHP = _maxHP;
}
// ジャンプ処理
public void _OnJump(InputAction.CallbackContext context)
{
if (!context.performed || _bJump) return;
_rigid.AddForce(Vector2.up * _jumpSpeed, ForceMode2D.Impulse);
_bJump = true;
// ジャンプ時の効果音を鳴らす
if (_jumpSE != null)
{
Instantiate(_jumpSE, transform.position, Quaternion.identity);
}
}
// 敵との接触処理
private void _HitEnemy(GameObject enemy)
{
float halfScaleY = transform.localScale.y / 2.0f;
float enemyHalfScaleY = enemy.transform.lossyScale.y / 2.0f;
float playerBottom = transform.position.y - (halfScaleY - 0.1f);
float enemyTop = enemy.transform.position.y + (enemyHalfScaleY - 0.1f);
if (playerBottom >= enemyTop)
{
Destroy(enemy);
_rigid.velocity = new Vector2(_rigid.velocity.x, 0f);
_rigid.AddForce(Vector2.up * _jumpSpeed * 0.7f, ForceMode2D.Impulse);
// ジャンプ効果音(踏んだときも再利用OK)
if (_jumpSE != null)
Instantiate(_jumpSE, transform.position, Quaternion.identity);
}
else
{
_TakeDamage(1);
// ダメージ時の効果音を鳴らす
if (_damageSE != null)
Instantiate(_damageSE, transform.position, Quaternion.identity);
}
}
}
処理の解説(初心者向け)
| 処理 | 内容 |
|---|---|
Instantiate(_jumpSE) | ジャンプしたときにSEオブジェクトを一瞬だけ生成 |
Instantiate(_damageSE) | ダメージを受けたときにSEオブジェクトを生成 |
Quaternion.identity | 回転なし(そのまま生成) |
transform.position | プレイヤーの現在位置に音を鳴らす |
Instantiate の仕組み
Instantiate() はオブジェクトを「複製して生成する」関数です。
例:
Instantiate(_jumpSE, transform.position, Quaternion.identity);
この1行で、「_jumpSE プレハブをプレイヤーの位置に生成」します。
AudioSource付きのオブジェクトなので、生成=音が鳴る!
音が鳴り終わったら、自動的にDestroyされるようにしておくのがベストです。
効果音プレハブを自動で削除させる
音が鳴り終わった後もオブジェクトが残ってしまうと、
ヒエラルキーがSEだらけになるので、以下のようなスクリプトをつけましょう👇
SE.cs
using UnityEngine;
public class SE : MonoBehaviour
{
void Start()
{
// 再生中のAudioSourceを取得
AudioSource audio = GetComponent<AudioSource>();
// 音が鳴り終わったら自動で削除
Destroy(gameObject, audio.clip.length);
}
} このスクリプトを効果音プレハブ(JumpSEやDamageSE)に追加することで、
音が終わると自動的に消えます✨
動作確認
ゲームを再生し、動作確認する
| 条件 | 動作 |
|---|---|
| スペースキーでジャンプ | ピョン!と音が鳴る |
| 敵に上から当たる | 敵が消えてジャンプ音 |
| 敵に横から当たる | HPバーが減ってダメージ音 |
⇒効果音をつけることでより2Dアクションゲームらしさが出てきました!
よくあるミスと対処
| 症状 | 原因 | 対処 |
|---|---|---|
| 音が鳴らない | AudioSourceがプレハブについていない | プレハブに AudioSource を追加 |
| 何回も音が重なる | 同じSEを連打している | AudioSource の SpatialBlend や Volume で調整 |
| 音が途中で切れる | AudioClipのLengthが短い | 長めのSEに変更 or 音量を調整 |
まとめ
| 処理 | 内容 |
|---|---|
Instantiate() | プレハブを生成して音を鳴らす |
_jumpSE | ジャンプ時に鳴らす効果音 |
_damageSE | ダメージ時に鳴らす効果音 |
SEAutoDestroy.cs | 音が鳴り終わったら自動削除 |
この記事では、効果音をアクションに合わせて発動させる方法を解説しました。



コメント