【Unity入門⑪】2Dアクションゲームで効果音を鳴らそう!

Unity入門

こんにちは!怪獣です🦖
前回は「敵を踏んで倒す処理」を実装しました!
今回はそのアクションに効果音(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 の SpatialBlendVolume で調整
音が途中で切れるAudioClipのLengthが短い長めのSEに変更 or 音量を調整

まとめ

処理内容
Instantiate()プレハブを生成して音を鳴らす
_jumpSEジャンプ時に鳴らす効果音
_damageSEダメージ時に鳴らす効果音
SEAutoDestroy.cs音が鳴り終わったら自動削除

この記事では、効果音をアクションに合わせて発動させる方法を解説しました。

コメント

タイトルとURLをコピーしました