【Unity2D】効果音(SE)を鳴らす方法|PlayOneShotの使い方とPrefab方式との違いも解説

効果音を鳴らそう Unity2D実装解説(テクニック)

こんにちは!Unityで2dゲームを制作中の怪獣です🦖

Unityでゲームを作っていると、ジャンプなどのアクションを起こした際に
効果音を鳴らしたくなることがありますよね🤔

この記事では、

  • 効果音の鳴らせるようになりたい!
  • 効果音ってどうやったら慣らせるの?
  • PlayOneShotってどう使うの?
  • Prefab方式との違いは?
  • どの方法を使えばいいの?

などの方に向けた記事となっています!

この記事では、Unity2Dで効果音(SE)を鳴らす基本として PlayOneShot の使い方を解説しつつ、後半ではPrefabを使った鳴らし方との違いも紹介します。

まず結論として、通常のSEなら PlayOneShot が最もシンプルでおすすめです!


この記事で出来ること

  • PlayOneShot で基本的な効果音の鳴らし方が分かる
  • 音が鳴らないときの確認ポイントも解説
  • Prefab方式との違いも後半で解説
  • どの方法を選べばいいかが分かる

通常のSEはPlayOneShotがおすすめ

ジャンプ音、ダメージ音、ボタン音など、通常の効果音であれば PlayOneShot が使いやすいです。

理由は次の通りで、一番シンプルで扱いやすいからです。

  • 実装がシンプル
  • 1回だけ鳴らす処理に向いている
  • 同じ AudioSource で複数の効果音を扱いやすい
  • 初心者でも詰まりにくい

① AudioSourceを追加する

PlayOneShot を使った実装を行っていきます!
まずはAudioSourceコンポーネントを追加します!
手順は以下の通りです↓

1.Hierarchyでプレイヤーオブジェクトを選択する。
2.Inspector の Add Component をクリック

Add Componentを押す

3.AudioSource を追加する

AudioSource の追加

勝手にSEが再生されないように、まずはこの2つを設定値をOFFにしておくのがおすすめです!

  • Play On Awake:OFF
  • Loop:OFF
AudioSource の設定値

② PlayOneShotで効果音を鳴らす基本コード

using UnityEngine;

public class PlayerSE : MonoBehaviour
{
    [SerializeField] private AudioSource _audioSource;
    [SerializeField] private AudioClip _jumpSE;

    public void PlayJumpSE()
    {
        _audioSource.PlayOneShot(_jumpSE);
    }
}

何をしているか1行ずつ解説すると

[SerializeField] private AudioSource _audioSource;

Inspector で AudioSource を設定するための変数です。

[SerializeField] private AudioClip _jumpSE;

再生したい音声ファイルを入れておく変数です。

_audioSource.PlayOneShot(_jumpSE);

指定した AudioClip を1回だけ再生しています。
SEのように「必要な瞬間だけ鳴らしたい音」と相性がいいです🙆


③ AudioSource、音声ファイルをアタッチする

このままだと音声ファイルとプログラム上が紐づいていないので、アタッチしていきます!

1.AudioSourceを追加済みのプレイヤーオブジェクトを選択する
2.Inspectorの _audioSource 欄にAudioSourceコンポーネントをドラッグする

AudioSourceコンポーネントをドラッグ

3.ソース上で定義した「JumpSE」、に、音声ファイルをそれぞれドラッグします(※ダメージSEにもドラッグしていますが、ジャンプだけでOKです)

音声ファイルをドラッグ

ジャンプ処理などの特定のアクション直後に組み込む例

if (_bJump)
{
    _rigid.AddForce(Vector2.up * _jumpPower, ForceMode2D.Impulse);
    _audioSource.PlayOneShot(_jumpSE);
}

例えば、ジャンプさせた直後に効果音を鳴らしたい場合は、
ジャンプ処理の直後に書くことでジャンプしたタイミングで音を鳴らせます!


よくあるエラー・つまずきポイント

効果音が上手くならない・・・
そんな時は、以下あたりを確認してみてください!

音が鳴らない

AudioSource の音量がVolume が 0、Mute になっていないか確認してみてください。

NullReferenceException が出る

  • _audioSource
  • _jumpSE

このどちらかが Inspector で設定されていない可能性があります。
③の手順が適用されているか確認してみてください

音が重ならない・変になる

Play() で AudioClip を再生する方法もありますが、SE用途では Play() より PlayOneShot() の方が扱いやすいです。Play()はBGMやループ再生向きとなっているため)


④ Prefab方式での作り方(任意)

Prefabとは?

Prefab方式は、一度作成したオブジェクトをテンプレートとして保存させておく方式です。
今回でいうと、音を鳴らす専用オブジェクトを生成して再生させておくテンプレートです。
Prefab化すると一括管理ができるので、一つのテンプレートだけ修正すればシーン上に配置したすべてのインスタンスに一括反映させることができます!

たとえば、

  • エフェクトと一緒に音を出したい
  • 再生位置も含めて管理したい
  • オブジェクト単位でまとめたい

という、SE以外のイベントと合わせて同時に行いたい場合や、オブジェクト単位でまとめておきたい場合にはPrefab化しておくのがおススメです!


Prefab方式での作り方手順

  • まずは通常の方法と同様に、効果音ファイル(.wavや.mp3)を用意します
    Assets/Audio/ フォルダなどに保存する
効果音ファイルの用意
  • 効果音用の空のGameObject(Create Empty)を作成する(名前はSEなど)
  • SEオブジェクトに対して以下を設定します
    • Add Component > AudioSource を追加
    • AudioClip に音声ファイルをドラッグして設定する
    • Play On Awake:ON(自動再生)
    • Loop:OFF
  • このオブジェクトをPrefab化する
    • Assets/Prefabs/SEフォルダを作成しておく
    • Hierarchyから、SEオブジェクトを上記フォルダへドラッグする(青い箱状のものが出てきたらOK!)

ここまで出来たらPrefab化は成功です!
Prefab化されたので、元のHierarchy上のオブジェクトは不要なので削除してOKです。


Prefab化した効果音を呼び出す処理を書く

Prefab化したものは、以下の一行で使用することができます!

[SerializeField] private GameObject _sePrefab;

public void PlaySE()
{
    Instantiate(_sePrefab, transform.position, Quaternion.identity);
}

Instantiate() はオブジェクトを「複製して生成する」関数です。
この1行で、「_sePrefabをプレイヤーの位置に生成」します。
AudioSource付きのオブジェクトにしているので、生成=音が鳴る、ということになります💡

Prefab化したものを紐づける

Unity上の設定からPrefab化したSEを_sePrefabにドラッグします。


効果音プレハブを自動で削除させる

音が鳴り終わった後もオブジェクトが残ってしまうと、
ヒエラルキーがSEだらけになるので、音が鳴り終わったら、自動的にDestroyされるようにしておくのがベストです。
以下のようなスクリプトをつけましょう⬇️

using UnityEngine;

public class SE : MonoBehaviour
{
    private AudioSource _audioSource;

    void Start()
    {
        _audioSource = GetComponent<AudioSource>();
        Destroy(gameObject, _audioSource.clip.length);
    }
}

このスクリプトを効果音プレハブ(SE)に追加することで、
音が終わると自動的に消えるようになります!

PlayOneShotとPrefab方式の違い

PlayOneShotで実装する方法とPrefab方式で実装する方法は、向いている用途が異なります。

方法向いている用途特徴
PlayOneShotジャンプ音、ダメージ音、UI音、軽いSE音全般シンプルでおすすめ
Prefab方式爆発音、ヒット演出、エフェクトを一緒にSEを鳴らす一度作れば拡張しやすい

どっちを使うべき?

まずは動かせるようにしたい場合はPlayOneShotがおススメです!

  • まずは簡単に実装したい
  • 通常のSEを鳴らしたい
  • 初心者向けにわかりやすく作りたい

他のイベントとセットで扱いたいなど、機能を拡張したい場合はPrefab方式がおススメです!

  • エフェクトとセットで扱いたい
  • 位置情報込みで管理したい
  • 演出を強くしたい

まとめ

最後まで読んでいただきありがとうございました!

Unityで効果音を鳴らすなら、まずは PlayOneShot を使うのがおすすめです。

特に、ジャンプ音・ダメージ音・ボタン音のような一般的なSEなら、
AudioSourceを追加して PlayOneShot で鳴らす方法がシンプルで扱いやすいです🦖

一方で、爆発演出やヒットエフェクトのように、演出と一緒に管理したい場合は Prefab方式も選択肢になりますね🤔

まずは PlayOneShot を基準に覚えて、必要になったら Prefab方式を使い分けるのいいかもしれません!

コメント

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