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

  • 20
    いいね
  • 0
    コメント

社内勉強会で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

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

参考