まだ荒削りですがとりあえず掲載しておきます。
#####やりたかったこと
- スクリプトで動的にBGM, SEを再生、切り替える
- Resources 配下の音楽ファイルを再生
- シーンが切り替わってもBGMは再生し続ける
- SEが再生し終わったらSEオブジェクトを削除する
#####動作環境
- OS : Windows10
- Unity : 2018.2.0
- AndroidStudio : 3.1.3
####Assets配下の以下のディレクトリに音楽関連ファイルを配置
- AudioMixier は Audio 配下に
- AudioMixier についてご存じない方は他の方の記事を参考にしてください。。。(丸投げ)
- oggファイルなどの音楽ファイルは Audio/BGM または Audio/SE 配下
SoundManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
public class SoundManager : MonoBehaviour{
public AudioMixer audioMixier;
public AudioSource audioSource;
public AudioClip bgmClip;
GameObject soundPlayerObj;
long lSEID;
List<GameObject> cntSEObject;
public SoundManager() {
lSEID = 0;
cntSEObject = new List<GameObject>();
if (GameObject.Find("soundPlayer") == null)
{
bgmClip = Resources.Load<AudioClip>("Audio/BGM/game_maoudamashii_3_theme01");
soundPlayerObj = new GameObject();
soundPlayerObj.name = "soundPlayer";
audioSource = soundPlayerObj.AddComponent<AudioSource>();
audioSource.clip = bgmClip;
audioMixier = Resources.Load<AudioMixer>("Audio/AudioMixer");
audioSource.outputAudioMixerGroup = audioMixier.FindMatchingGroups("BGM")[0];
audioSource.loop = true;
audioSource.Play();
DontDestroyOnLoad(soundPlayerObj);
}
}
public void changeBGM(string bgmName)
{
// Debug.Log("changeBGM : " + bgmName);
if (soundPlayerObj == null)
{
// Debug.Log("soundPlayerObj is null");
soundPlayerObj = GameObject.Find("soundPlayer");
}
audioSource = soundPlayerObj.GetComponent<AudioSource>();
if (audioSource.clip.name == bgmName)
{
// すでに再生中なら変えない
return;
}
bgmClip = Resources.Load<AudioClip>("Audio/BGM/" + bgmName);
audioSource.clip = bgmClip;
audioSource.Stop();
audioSource.Play();
}
public void playSE(string seName)
{
Debug.Log("playSE : " + seName);
GameObject seSoundObject = new GameObject();
seSoundObject.name = "seSoundObject_" + lSEID.ToString();
lSEID++;
cntSEObject.Add(seSoundObject);
AudioSource seAudioSource = seSoundObject.AddComponent<AudioSource>();
if (audioMixier == null)
{
audioMixier = Resources.Load<AudioMixer>("Audio/AudioMixer");
}
seAudioSource.outputAudioMixerGroup = audioMixier.FindMatchingGroups("SE")[0];
AudioClip seClip = Resources.Load<AudioClip>("Audio/SE/" + seName);
seAudioSource.clip = seClip;
seAudioSource.Play();
destroyStopSE();
}
public void destroyStopSE()
{
foreach (GameObject seObject in cntSEObject)
{
if (seObject != null)
{
if (seObject.GetComponent<AudioSource>().isPlaying == false)
{
Destroy(seObject);
}
}
}
cntSEObject.RemoveAll(item => item == null);
}
}
上記の SoundManager クラスをシングルトンのクラスで管理
以下は Data クラスというシングルトンに配置している場合(SoundManager 自体をシングルトンで管理してもいいかも)
Data.Instance.soundManager.playSE("再生したいSEの音楽ファイル名(拡張子不要)");
Data.Instance.soundManager.changeBGM("再生したいBGMの音楽ファイル名(拡張子不要)");
以下のようにBGM,SEが再生されます
利用させていただいている素材元は こちら を参照してください
今こんな感じです pic.twitter.com/zlhEuk5lzh
— CityGuardians (@City_Guardians) 2018年9月2日
現場からは以上です。