とりあえず音を鳴らす
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");
他のクラスから、効果音を鳴らしたい場合は、このコードのようにして鳴らすことが出来ます!
お疲れさまでした!