スポンサーリンク

【Unity】簡単に効果音を鳴らす方法

スポンサーリンク
Unity

とりあえず音を鳴らす

SoundManagerクラス

using UnityEngine;
//サウンド管理クラス
public class SoundManager : MonoBehaviour
{
    private AudioSource _audioSource;   //音を鳴らすためのコンポーネント

    private void Awake()
    {
        _audioSource = GetComponent<AudioSource>(); //同じゲームオブジェクトから取得
    }

    //音を鳴らす
    public void PlaySE()
    {
        _audioSource.Play();
    }
}

このコードは、必要最低限の効果音を鳴らすことが出来るクラスです!

まずはこのコードを、プロジェクトに追加します。

Unity側の設定

コードを追加したら、画像のようにSoundManagerというゲームオブジェクトを作成します!

①Hierarchyで右クリック→CreateEmptyを選択→GameObjectのにSoundManagerに変更

②作成したGameObjectを選択→AddComponentを左クリック→AudioSourceを探して選択

③AudioSourceコンポーネントのAudioClipに鳴らしたいSEのデータをアタッチする

④再度AddComponentを左クリック→追加したSoundManagerを探して選択

//音を鳴らす
    public void PlaySE()
    {
        _audioSource.Play();
    }

あとは鳴らしたいタイミングで、この関数(メソッド)を呼び出すだけです。

この後は、もう少し使い勝手のいいSoundManagerを実装していきます!

もう少し使いやすくする

先ほどの、SoundManagerクラスは、1種類の音しか再生出来ず、使い勝手が良いとは言えません。ここからは、複数の効果音を選択して、鳴らすことが出来るように実装していきます!

SoundManagerクラス


using UnityEngine;
//サウンド管理クラス
public class SoundManager : MonoBehaviour
{
    private AudioSource _audioSource;   //音を鳴らすためのコンポーネント

    private AudioClip _currentAudioClip;//最後に鳴らした音

    [SerializeField] private SoundData _soundData;  //サウンドデータ

    private void Awake()
    {
        _audioSource = GetComponent<AudioSource>(); //同じゲームオブジェクトから取得
    }

    //SoundDataからAudioClipを取得する
    private AudioClip GetAudioClip_SE(string tag)
    {
        //データを1つずつ調べる
        foreach (var data in _soundData.GetSoundSource_SE_List)
        {
            //tagが一致していたら検索を終了してデータを返す
            if (data.tag == tag)
            {
                return data.audioClip;
            }
        }

        //tagが一致しなければNullを返す
        return null;
    }

    //音を鳴らす
    public void PlaySE(string tag)
    {
        //AudioClipを取得する
        _currentAudioClip = GetAudioClip_SE(tag);

        //サウンドデータがあるかを確認する
        if (_currentAudioClip == null) { Debug.Log("サウンドデータがありません"); return; }

        //サウンドを再生する
        _audioSource.PlayOneShot(_currentAudioClip);
    }

    //テスト用Update関数(本来は別クラスで実装する)
    private void Update()
    {
        //マウスが左クリックされたら
        if (Input.GetMouseButtonDown(0))
        {
            PlaySE("test1");
        }
        //マウスが右クリックされたら
        if (Input.GetMouseButtonDown(1))
        {
            PlaySE("test2");
        }
    }
}

先ほどの、SoundManagerに少し追記してみました!

機能としては、呼び出したい効果音をtag(string)で指定して鳴らすことが出来ます。

効果音のデータは、次のScriptableObjectで実装した、SoundDataで管理をしています!

SoundDataクラス

using System;
using System.Collections.Generic;
using UnityEngine;

//サウンドデータ構造体
[Serializable]
public struct SoundSource_SE
{
    public string tag;          //検索用のタグ
    public AudioClip audioClip; //サウンドデータ
}

//サウンドデータ管理
[CreateAssetMenu(menuName = "ScriptableObject/SoundData", fileName = "SoundData")]
public class SoundData : ScriptableObject
{
    [SerializeField] private List<SoundSource_SE> _soundSource_SE_List; //サウンドデータ構造体のリスト

    //SEのデータリストを取得する
    public List<SoundSource_SE> GetSoundSource_SE_List
    {
        get { return _soundSource_SE_List; }
    }
}

このコードは、サウンドのデータを管理するためのScriptableObjectになります。

役割としては、検索用のtagと効果音のデータを持った構造体をListで管理しています。

↑↑ScriptableObjectの詳しい説明はこちらの記事をチェック!↑↑

SoundManagerとSoundDataを実装したら、Unityの方でも設定を行っていきます!

Unity側の設定

①Projectタブを選択→右クリック→メニューからScriptableObjectを選択→SoundDataを選択

②作成されたSoundDataアセットを選択→SoundSource_SE_Listの要素数を2に設定

③画像のようにtest1とtest2のサウンドデータを設定する

最後に、画像のように編集したSoundDataを、SoundManagerにアタッチします。

これでサウンドを鳴らす実装は終了です!

あとは、ゲームを再生し右クリック、左クリックでそれぞれ違う音が鳴れば問題ありません!

 _soundManager.PlaySE("test1");

他のクラスから、効果音を鳴らしたい場合は、このコードのようにして鳴らすことが出来ます!

お疲れさまでした!

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