0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Unity】BGM,SEをとりあえず再生したい人へ

Last updated at Posted at 2018-10-13

まだ荒削りですがとりあえず掲載しておきます。

#####やりたかったこと

  • スクリプトで動的にBGM, SEを再生、切り替える
  • Resources 配下の音楽ファイルを再生
  • シーンが切り替わってもBGMは再生し続ける
  • SEが再生し終わったらSEオブジェクトを削除する

#####動作環境

  • OS : Windows10
  • Unity : 2018.2.0
  • AndroidStudio : 3.1.3

####Assets配下の以下のディレクトリに音楽関連ファイルを配置
キャプチャ.JPG

  • 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が再生されます
利用させていただいている素材元は こちら を参照してください

現場からは以上です。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?