AudioMixerとU1W

はじめに

こんにちは、コーディング課3回生のTakaakiです。

アドカレ11日目の本日ですが、我らが情報理工学部のあるBKCでの学祭です。

RiG++の学祭の様子をTwitterで公開したいと思っているので、気になる方は是非。

この記事について

この記事はUnityの機能の1つであるAudioMixerを用いた音量調整機能とゲームジャムイベントU1Wの紹介です。

前半は音量調整機能を各自のゲームに簡単に実装できる様になる技術の紹介。

後半は明日から開催のUnityRoomで行われる1週間ゲームジャムイベント、Unity1Weekの紹介になります。

内容が2つあり、多少長い記事になるかもしれませんが、付き合いいただけると幸いです。

音量調整機能

今回の音量調整機能ですが、Sliderを使いBGM,SEの音量を調整できる機能です。

音量調整機能は色々なゲームにあって損はない機能だと思います。

ある程度UnityでAudioSourceを使い、BGM、SEを流したことがある方向けの内容になります。

AudioSourceについて、簡単に理解してから読んでいただけると良いと思います。

AudioMixer

今回は音量調整機能にAudioMixerを使っていきます。

AudioMixerとは

Unity のオーディオミキサーでは、いろいろな音源をミックスしたり、それにエフェクトをかけたり、マスタリングを行ったりすることができます。

UnityDocumentation

だそうです。

今回はscene上に配置した各AudioSourceをBGM,SEに分けて、一括で音量を調整するのに使う欠かせない機能になります。

AudioMixerは有効活用できれば、ほかにも色々なことができるようになると思います。

(エコーかけたりもできるらしい)

が、私は詳しくないので各自調べてください。

AudioMixerを作成

実際に、Unityで制作していきましょう。

早速ですが、AudioMixerを作成していきましょう。

ProjectでCreate→AudioMixerです。

AudioMixerの名前はなんでもいいですが、今回はTestAudioMixerにします。

AudioMixerをCreate
AudioMixerのWindow

次はGroupを作ります。

これによってBGMとSEを分けます。

Groupsの右にある+ボタンを押して作成できます。

2つ作成してください。

名前は”BGM”と”SE”にしましょう。

Groupを作成
BGM、SEを作成

注意すべきこととして、BGMの子グループにSEにならないようにしましょう。

ドラッグアンドドロップで操作できます。

ダメな例

AudioSorceにAudioMixerを設定

作ったAudioMixerGroupをAudioSourceに設定しましょう。

AudioSourceのコンポーネントのOutputにAudioMixerをアタッチしましょう。

BGMとして利用しているAudioSourceにBGMのAudioMixerGroupをアタッチしてください。

同じく、SEにはSEのAudioMixerGroupをアタッチしてください。

AudioSourceに設定

これを設定することでAudioMixerのWindowで一括で音量を調整できます。

Masterを調整すれば全体を、BGMを調整すればBGMだけ音量を調整できます。

BGMだけ音量を下げてる

Scriptから調整できるようにする

BGM,SEの音量を一括で変更できるようになったので、あとはプレイ中に音量を変更できるようにするだけです。

AudioMixerのdBの値をスクリプトから調整できるようにしましょう。

BGMを選択し、InspectorのVolumeの場所で右クリック。

“Expose ‘Volume(of BGM)’ to script”を選択しましょう。

次にAudioMixerのWindowの右上にある”Exposed Parameters”をクリック。

”MyExposedParam”をダブルクリックし、名前を”BGM”に変更しましょう。

同じことをSEでもやってください。

Sliderを作る

ようやくですが、Sliderを作りましょう。

BGMとSE用に2つ作成してください。

Slider用のScriptを作ります。

名前は”AudioSlider”にします。

AudioSliderの中は下のようにしてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;

public class AudioSlider : MonoBehaviour
{
    [SerializeField] private AudioMixer _audioMixer;
    private Slider _slider;
    /// <summary>
    /// Sliderで設定するAudioの種類
    /// </summary>
    [SerializeField] private AudioMixerName _audioType;

    private void Start()
    {
        _slider = GetComponent<Slider>();
        _slider.onValueChanged.AddListener(delegate { ChangeValue(_slider.value); });
    }

    /// <summary>
    /// Sliderの値をAudioMixer用に変更する
    /// </summary>
    /// <param name="volume"></param>
    /// <returns></returns>
    public float ConvertVolumeToDb(float volume)
    {
        return Mathf.Clamp(Mathf.Log10(Mathf.Clamp(volume, 0f, 1f)) * 20f, -80f, 0f);
    }

    private void ChangeValue(float volume)
    {
        _audioMixer.SetFloat(_audioType.ToString(), ConvertVolumeToDb(volume));
    }
}

public enum AudioMixerName
{
    BGM,
    SE,
}

AudioSliderをSliderにアタッチしましょう。

AudioSliderのAudioMixerには作成したTestAudioMixerをアタッチしてください。

またAudioTypeをBGMならBGM、SEならSEに設定してください。

Scriptの解説

簡単にだけScriptの解説をします。

_slider.onValueChanged.AddListener(delegate { ChangeValue(_slider.value); });

Sliderの値が変更されたときに、ChangeValueを呼び出す用に登録できます。

ChageValueはAudioMixerの音量を変更する関数なので、Sliderを調整したら、音量を変更されるということです。

Slider以外にもButtonが押されたときの処理を登録することもできるので、スクリプトから制御したい場合は活用してみてください。

public float ConvertVolumeToDb(float volume)
{
  return Mathf.Clamp(Mathf.Log10(Mathf.Clamp(volume, 0f, 1f)) * 20f, -80f, 0f);
}

Sliderの値(Volume)をAudioMixerの値(dB)に変換する関数です。

Sliderの値(0~1)をAudioMixerの値(-80~0)にしています。

また-80~0にしてもSliderの値と音量が比例していないので、比例するように処理しています。

Sliderの値をAudioMixerに合わせる

AudioMixerの値をSliderの値に合わせて変更することができるようになりました。

音量をゲーム内から調整できるようになり、満足していると思います。

しかし、油断は禁物です。

まだ少しだけ続きます。

現在の状態だと、Sliderで音量調整後、Sceneを移動すると問題が発生します。

SliderとAudioMixerの値が合っていない状態になってしまうのです。

また、BGMを調整する分には問題はないのですが、SEを調整する際に調整後のSEの音量を確認できません。

なので、少しだけ書き足します。

これで完成形となります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class AudioSlider : MonoBehaviour, IPointerUpHandler
{
    [SerializeField] private AudioMixer _audioMixer;
    private Slider _slider;
    /// <summary>
    /// Sliderで設定するAudioの種類
    /// </summary>
    [SerializeField] private AudioMixerName _audioType;

    private void Start()
    {
        _slider = GetComponent<Slider>();
        _slider.onValueChanged.AddListener(delegate { ChangeValue(_slider.value); });

        //AudioMixerの音量をSliderに設定する
        float value;
        bool flag = _audioMixer.GetFloat(_audioType.ToString(), out value);
        if (flag)
        {
            _slider.value = ConvertDbToVolume(value);
        }
    }

    /// <summary>
    /// Sliderの値をAudioMixer用に変更する
    /// </summary>
    /// <param name="volume"></param>
    /// <returns></returns>
    public float ConvertVolumeToDb(float volume)
    {
        return Mathf.Clamp(Mathf.Log10(Mathf.Clamp(volume, 0f, 1f)) * 20f, -80f, 0f);
    }

    /// <summary>
    /// AudioMixerの値をSlider用に変更する
    /// </summary>
    /// <param name="db"></param>
    /// <returns></returns>
    public float ConvertDbToVolume(float db)
    {
        return Mathf.Clamp(Mathf.Pow(10, db / 20), 0f, 1f);
    }

    private void ChangeValue(float volume)
    {
        _audioMixer.SetFloat(_audioType.ToString(), ConvertVolumeToDb(volume));
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        //スライダーから指を離したとき
        //SEを鳴らす処理を足す
    }
}

public enum AudioMixerName
{
    BGM,
    SE,
}

上記の問題を解決できています。

SEの問題ですが、各自SEを鳴らす処理をOnPointerUp()に足してあげましょう。

完成

お疲れ様です。

これで完成です。

masterのボリュームを変更できるようなSlider追加する、音量の設定をセーブ、ロードできるようにするなど、カスタムはまだまだできそうです。

最後に参考にさせていただいたサイトを紹介して、音量調整機能の紹介を終了したいと思います。

Unity1Weekの紹介

Unity1Week(以下u1w)は、UnityRoomを運営しているnaichiさんが主催する1週間のゲームジャムイベントです。

ゲームジャムGameJam)とは、ゲームクリエイターが集まり短時間でゲームを制作するイベントのことである。ここで言うゲームクリエイターは一般的にプログラマ、ゲームデザイナ、ゲームアーティストで構成される。

ウィキペディア(Wikipedia)

UnityRoomとはウェブ上にUnityのゲームを公開できるサービスです。

投稿もプレイもすべて無料でできます。

u1wは、出されたお題に合う(こじつけでも可)ゲームを1週間で作り、UnityRoomに公開するイベントです。

 

私がu1wをおすすめする理由は、自作ゲームを外部の方にプレイしてもらえるからです!

基本的に、自作ゲームを見ず知らずの方にプレイしてもらうハードルはかなり高いです。

無料で面白いコンテンツがゴロゴロしてる中、素人の作ったゲームがプレイしてもらえる機会は基本的にないといえるでしょう。

しかし、u1wに参加すれば、ほかの参加者と相互にプレイし評価をいただけます。

 

実際、私もイベントなしでは考えられないの数の閲覧数と評価数、コメント数をいただいています。

過去の参加作品

 

外部の方からの評価は、身内の方からの評価とはまた違った刺激になると思います。

参加作品をプレイするだけでも、得るものがあると思います。

 

そんな1週間頑張れば、得しかないイベントが明日(12月12日)から開催されます!

また12月18日20時から投稿作品を遊ぶことができます。

 

ぜひ、ゲームの投稿してみましょう!

最後に

最後までお読みいただきありがとうございます。

初めて、技術的な内容のブログを執筆しました。

正直、疲労がすごいです。

技術的な内容をブログを執筆されてる方々のすごさと有難さを再認識しました。

拙い記事だったと思いますが、皆様の糧になれれば幸いです。

本日開催されている学祭の様子や、明日以降のアドカレの更新を知りたい方はぜひ、公式Twitterのフォローお願いします。

まだまだアドカレ続きます。

明日以降もお付き合いいただけると幸いです。

コメントを残す

CAPTCHA