ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - オーディオの基本(Audio Source、Audio Clip、Audio Listener)

初めに

 オーディオの基本について、まとめます。BGM や SE など音を再生する仕組みや再生の仕方を載せています。

音を再生する仕組み

 Unity 上で音を再生するには、次の3つが必要になります。

  • Audio Source:Audio Clip を再生するためのもの
  • Audio Clip:BGM や SE などの音そのもの
  • Audio Listener:再生された音を聞き取れるようにするもの

 Audio Clip(音) を Audio Source で再生し、Audio Listener でコンピュータのスピーカーを通じて聞きとれるようにします。

Audio Source

 コンポーネントについての説明は、ある程度リンク先にまかせます。リンク先で分かりにくい部分や重要な部分を書いておきます。

docs.unity3d.com

Audio Clip Audio Clip(音)を設定します
Output デフォルト(None)の場合は、シーンの Audio Listener から音が出力されます。Audio Mixer Group Controller をドラッグ & ドロップし、Audio Mixer を設定することができる。
Play On Awake これが有効になっていると、シーンが起動すると同時にサウンドが再生されます。無効になっている場合は、スクリプトで Play() コマンドを使用してスタートする必要があります。

 Bypass は使用しているエフェクトを一時的に無効にすることを意味します。

 Bypass Reverb Zones は Audio Reverb Zone の On/Off です。Audio Reverb Zone は Cave(洞窟)や Bathroom(お風呂)など残響の効果を設定できます。

docs.unity3d.com

Audio Clip

 Audio Clip は音そのものです。.aif、.wav、.mp3、.ogg や、トラッカーモジュール の.xm、.mod、.it、.s3m 形式をサポートしています。

docs.unity3d.com

Audio Listener

 Audio Source で再生されている音をスピーカーから聞きとれるようにするものです。Main Camera にデフォルトでついています。

docs.unity3d.com

BGM を再生する

 BGM をシーン開始時に再生させます。

 今回は、次のサイトから音源をお借りして使用します。

  音楽:魔王魂

  • Audio Source を生成する

 Hierarchy で右クリック→Audio→Audio Sourceで生成できます。

  • Audio Source に Audio Clip を設定する


  • Play On Awake と Loop にチェックを入れる

 シーン開始時に再生されるように Play On Awake にチェックを入れます。また、BGM が繰り返されるように Loop にチェックを入れます。



(実行)

AudioSource をスクリプトから扱う

 AudioSource をスクリプトから操作してみましょう。

 今回は先ほどの BGM をスクリプトから流してみます。それだけでは芸がないので、音量を徐々に大きくなるようにしてみます。

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

public class AudioManager : MonoBehaviour
{
    //AudioSource取得用
    AudioSource audiosource;

    //SoundClip取得用
    public AudioClip sound1;

    // Start is called before the first frame update
    void Start()
    {
        //AudioSourceコンポーネントを取得
        audiosource = this.GetComponent<AudioSource>();
        //Audio Clip を sound1 に設定
        audiosource.clip = sound1;
        //volume(音の大きさ)を設定
        audiosource.volume = 0.1f;
        //再生
        audiosource.Play();
    }

    // Update is called once per frame
    void Update()
    {
      //volumeが1より小さい間はvolumeを大きくする
      if(audiosource.volume < 1)
      {
        audiosource.volume += 0.002f;
      }
    }
}

 volume は 0 ~ 1 の数値をとります。0 の場合は無音になります。

  • Audio Clip を取得する


 他にも一時停止したり、ピッチを変えたりできます。AudioSource で使用できる変数、関数はリンク先をご覧ください。

docs.unity3d.com

SE を再生する

 BGM が流れている状態で SE が鳴るようにします。先ほどの BGM を実行した状態の続きから始めます。

 今回は Button が押されたときに SE がなるようにします。

  • BGM 用の Audio Source のほかに、もう一つ Audio Source を生成する

 SE 用の Audio Source を生成します。

  • Button を生成する

 今回は Button が押されたときに SE が鳴るようにするので、Button を生成しておきます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;  //Buttonを使用するために追加

public class SEManager : MonoBehaviour
{
    //Button取得用
    [SerializeField]Button btn1;
    [SerializeField]Button btn2;
    [SerializeField]Button btn3;

    //AudioClip取得用
    public AudioClip sound1;
    public AudioClip sound2;
    public AudioClip sound3;

    AudioSource audioSource;

    void Start()
    {
      //AudioSourceのComponentを取得
      audioSource = GetComponent<AudioSource>();
    }

    //ButtonごとにSEを鳴らす関数を設定
    public void onClickSE1()
    {
      audioSource.PlayOneShot(sound1);
    }

    public void onClickSE2()
    {
      audioSource.PlayOneShot(sound2);
    }

    public void onClickSE3()
    {
      audioSource.PlayOneShot(sound3);
    }
}

 今回は、Button と Audio Clip を取得し、Button が押されたときに AudioSource から1回再生されるように記述しています。PlayOneShot は引数にとった Audio Clip を1回再生するものになります。似たものに Play() がありますが、今回は SE のため PlayOneShot を使いました。違いは後述します。

  • Button、Audio Clip を取得する

  • Button に関数を設定する

 今回は3つの Button にそれぞれ onClickSE1、onClickSE2、onClickSE3 を設定します。


(実行)

Play と PlayOneShot の違い

 スクリプトから Audio Clip を再生するには主に Play か PlayOneShot を使います。2つの違いは次の通りになります。

① Play は clip に指定してあるものを再生する。PlayOneShot は引数にあるものを再生する。
② Play は重複して再生不可能。PlayOneShot は重複して再生可能。


①はスクリプトを見るとすぐに違いが分かります。

//Playを使う場合
    //clip に Audio Clip を設定
    audiosource.clip = sound1;
    //再生
    audiosource.Play();

//PlayOneShotを使う場合
     audiosource.PlayOneShot(sound1);

 

②は実際に見ていただいたほうが分かりやすいと思います。

(Play)

(PlayOneShot)

 BGM などは音が2重にならないように Play を使うほうがよいでしょう。SE は連続して再生する場合、 Play だとぶつ切りに聞こえてしまうため、PlayOneShot を使うほうがよいでしょう。

最後に

 オーディオについて、Unity におけるオーディオの仕組みと簡単な使い方をまとめました。音を再生するために Audio Source、Audio Clip、Audio Listener の3つが必要なことが分かっていれば、なんとかなるのではないでしょうか。