Edited at

[Unity] Unity×音についてざっくりまとめ

More than 1 year has passed since last update.

社内勉強会でUnityの音にまつわる話をしたので資料をざっくり公開する


ざっくりこんな感じのデモシーン作りましたー pic.twitter.com/KwkZ158rVz

— 青木とと(ˊ꒳ˋ*) (@lycoris102) 2016年12月1日


Unityでの音の取り扱い


概要



  • AudioSourceコンポーネント で音 ( AudioClip ) をゲーム世界内で鳴らす


  • AudioListenerコンポーネント でゲーム世界内の音を聞き、実機で再生する


AudioClip

audioclip.png


AudioSourceコンポーネント

image


AudioListenerコンポーネント

audiolistener.png


AudioSourceコンポーネントで音を制御する


ゲーム開始時(Scene遷移時)に音を再生する


  • Inspector上でAudioSourceの PlayOnAwake を有効にする

playonawake.png


BGM用に音をループさせる


  • Inspector上でAudioSourceの Loop を有効にする

loop.png


Script経由で音を再生する

using UnityEngine;

using UnityEngine.UI;

[RequireComponent(typeof(Button))]
public class AudioPlayButton : MonoBehaviour
{
public AudioSource AudioSource;

void Start()
{
this.GetComponent<Button>().onClick.AddListener(() => this.AudioSource.Play());
}
}


Script経由で音を停止する

using UnityEngine;

using UnityEngine.UI;

[RequireComponent(typeof(Button))]
public class AudioStopButton : MonoBehaviour
{
public AudioSource AudioSource;

void Start()
{
this.GetComponent<Button>().onClick.AddListener(() => this.AudioSource.Stop());
}
}


Script経由で音を一時停止/解除する

using UnityEngine;

using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.EventSystems;

public class AudioPauseButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
public AudioSource AudioSource;
public Text Text;

public void Start()
{
this.Text.text = "Pause";
}

public void OnPointerDown(PointerEventData eventData)
{
this.AudioSource.Pause();
this.Text.text = "UnPause";
}

public void OnPointerUp(PointerEventData eventData)
{
this.AudioSource.UnPause();
this.Text.text = "Pause";
}
}


Script経由でSEを再生する

using UnityEngine;

using UnityEngine.Events;
using UnityEngine.EventSystems;

[RequireComponent(typeof(AudioSource))]
public class SEPlayButton : MonoBehaviour, IPointerDownHandler
{
public AudioClip SE;

public void OnPointerDown(PointerEventData eventData)
{
this.GetComponent<AudioSource>().PlayOneShot(SE);
}
}


Script経由で音量を変更する

using UnityEngine;

using UnityEngine.UI;

[RequireComponent(typeof(Slider))]
public class AudioVolumeSlider : MonoBehaviour
{
public AudioSource AudioSource;

void Start()
{
this.GetComponent<Slider>().onValueChanged.AddListener(value => this.AudioSource.volume = value);
}
}


Script経由でミュートする

using UnityEngine;

using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.EventSystems;

public class AudioMuteButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
public AudioSource AudioSource;
public Text Text;

void Start()
{
this.Text.text = "Mute";
}

public void OnPointerDown(PointerEventData eventData)
{
this.AudioSource.mute = true;
this.Text.text = "UnMute";
}

public void OnPointerUp(PointerEventData eventData)
{
this.AudioSource.mute = false;
this.Text.text = "Mute";
}
}


Unity内で音を管理する


AudioManagerを作って再生管理


AudioMixerを使ってミックス/マスタリング


  • https://docs.unity3d.com/ja/current/Manual/AudioMixer.html

  • 複数の音源を再生する際のシチュエーションを整えてくれる君

  • AudioMixerを使うと以下のようなことができる


    • ミックス (同時発音)

    • エフェクト (音に対する効果付け)

    • マスタリング (音同士の音量/音圧の調整)



  • AudioManagerとも併用可能


    • AudioManagerにてAudioGroupも管理してあげる




Unity内で音を加工する


フェードイン/フェードアウト


  • AudioSource.volume をScriptで制御する


    • Coroutineで処理するなり、Tween系のアセットで処理させるなり



using UnityEngine;

using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using DG.Tweening;

// DOTweenをセットアップしている前提
public class AudioFadeButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
public AudioSource AudioSource;
public Text Text;
public float FadeTime = 3.0f;

private float volume;

void Start()
{
this.Text.text = "FadeOut";
}

public void OnPointerDown(PointerEventData eventData)
{
if (!this.AudioSource.isPlaying)
{
return;
}

this.volume = this.AudioSource.volume;
this.AudioSource.DOFade(0.0f, FadeTime).SetEase(Ease.InCubic);
this.Text.text = "FadeIn";
}

public void OnPointerUp(PointerEventData eventData)
{
this.AudioSource.DOFade(volume, FadeTime).SetEase(Ease.InCubic);
this.Text.text = "FadeOut";
}
}


ピッチを変更する


  • AudioSource.pitch もしくは AudioMixer.Pitch で変更する

  • Pitchが0以下になると逆再生される


エフェクト (フィルター) を掛ける


  • AudioMixerを作成する

  • 任意のGroupを作成し、AudioSource

  • Groupに対して、下部のAddから任意のFilterを掛ける


Unity内で音と同期する( Music.cs )


BGMに合わせて要素の大きさを動かす

using UnityEngine;

using DG.Tweening;

public class ChangeScale : MonoBehaviour
{
public float Rate = 1.1f;
public float Time = 0.2f;

private Vector3 baseScale;

void Start()
{
this.baseScale = this.gameObject.transform.localScale;
}

void Update()
{
if (Music.IsPlaying && Music.IsJustChangedBeat())
{
this.gameObject.transform.DOScale(this.baseScale * this.Rate, 0.0f);
this.gameObject.transform.DOScale(this.baseScale, this.Time);
}
}
}


SEをクオンタイズでリズムに合わせて再生する


  • リズムに合わせて再生タイミングを自動補正する

using UnityEngine;

using UnityEngine.Events;
using UnityEngine.EventSystems;

[RequireComponent(typeof(AudioSource))]
public class SEPlayQuantizeButton : MonoBehaviour, IPointerDownHandler
{
public void OnPointerDown(PointerEventData eventData)
{
Music.QuantizePlay(this.GetComponent<AudioSource>());
}
}


Unity内でイントロループを実装する


3D空間で音を取り扱う

3dsound.png


同時再生する上での注意点


参考