AudioPlayer

class

名前空間:SilCilSystem.Singletons

継承:SingletonMonoBehaviour<T>


音楽の再生を行うためのシングルトンです。 音源の場所指定はできないため、プレイヤーとの距離によって音量を変えるという処理はできません。 したがって、2DゲームやBGMやシステム音向けです。

メンバ一覧

プロパティ

member description
IAudioClipResources Clips AudioClipを取得するためのインターフェースを指定

メソッド

member description
static void PlayBGM(string name) BGMを再生/変更する
static void PlaySE(string name) SEを再生する

※PlayBGMに無効な文字列を指定すると音量0にフェードアウトします。

設定項目

音量

type name description note
ReadonlyPropertyFloat m_defaultBGMVolume BGMの音量 フェード中はこの値より小さくなる
ReadonlyPropertyFloat m_defaultSEVolume SEの音量  

BGM設定

type name description note
ReadonlyPropertyBool m_loop trueならループ再生  
ReadonlyPropertyFloat m_fadeTime BGM切り替え時のフェード時間 単位は秒
InterpolationCurve m_fadeCurve BGM切り替え時のフェードに使う関数  

音源

type name description note
AudioSource m_bgmSource BGM再生用のAudioSource  
ReadonlyPropertyFloat m_seSource SE再生用のAudioSource  

イベント

type name description note
GameEventStringListener m_playBGM PlayBGMを呼ぶイベントアセット  
GameEventStringListener m_playSE PlaySEを呼ぶイベントアセット  

使用例

基本的にPlayBGMとPlaySEを呼べばいいです。 引数に指定する文字列はIAudioClipResourcesで指定する文字列と同じです。 デフォルトではResourcesフォルダに置いてあるAudioListで指定します。

AudioListを設定する

あとは音を再生したいタイミングでPlayBGM/PlaySEを呼びましょう 例えば、以下はキーを押すたびに効果音を再生するスクリプトです。

using UnityEngine;
using SilCilSystem.Singletons;

public class TestAudioPlayer : MonoBehaviour
{
    [SerializeField] private string m_name = "Test";

    private void Update()
    {
        if (Input.anyKeyDown)
        {
            // キーを押すたびに音を鳴らす.
            AudioPlayer.PlaySE(m_name);
        }
    }
}

使用上の注意点

デフォルトではAudioMixerを使用していません。 AudioMixerを使用する場合はm_defaultBGMVolumeやm_defaultSEVolumeなどを変更しないようにするほうがいいと思います。

実装

SE再生はPlayOneShotを呼び出しているだけです。

void _PlaySE(string name)
{
    var clip = Clips?.GetClip(name);
    m_seSource.PlayOneShot(clip);
}

BGM再生は次に再生するべきAudioClipを保持した状態で音量を0に変化させていきます。

void _PlayBGM(string name)
{
    m_nextClip = Clips?.GetClip(name);
    m_multiply = -1f;
}

音量が0になったら、AudioClipを差し替えます。

private void Update()
{
    // 他の処理...

    // BGMの音量が0になったら、次のBGMに切り替え.
    if(m_volumeRate == 0f && m_nextBGM != null)
    {
        m_bgmSource.clip = m_nextBGM;
        m_bgmSource.Play();
        m_multiply = 1f;
        m_nextBGM = null;
    }

    // 他の処理...
}

IAudioClipResourcesの実装

AudioClipはIAudioClipResourcesインターフェースを用いて取得しているので、 独自の処理を実装して指定できます。 Resourcesからロードしたり、Addressableを用いたりなど、状況に応じてカスタマイズできます。

IAudioClipResourcesは以下のメソッドが定義されたインターフェースです。

member description
AudioClip GetClip(string name) nameで指定されたAudioClipを返す

例として、AudioClipをResourcesフォルダからロードして返すClipLoaderを作ってみます。

using UnityEngine;
using System.Collections.Generic;
using SilCilSystem.Singletons;

public class ClipLoader : IAudioClipResources
{
    private Dictionary<string, AudioClip> m_clips = new Dictionary<string, AudioClip>();

    public AudioClip GetClip(string name)
    {
        if (m_clips.ContainsKey(name))
        {
            return m_clips[name];
        }
        else
        {
            // clipを取得.
            AudioClip clip = Resources.Load<AudioClip>(name);
            m_clips[name] = clip;
            return clip;
        }
    }
}

あとは作成したクラスをAudioPlayerのClipsに指定すれば使用できます。 適当なスクリプトで設定しましょう。

using UnityEngine;
using SilCilSystem.Singletons;

public class Test : MonoBehaviour
{
    private void Awake()
    {
        // AudioPlayerに設定.
        AudioPlayer.Instance.Clips = new ClipLoader();
    }
}

トップへ