LoginSignup
0
0

More than 5 years have passed since last update.

サウンドメモ

Last updated at Posted at 2018-12-07

音の設定があまり完全な状態で落ちてないのでメモ。
といってる私も完全ではないので直せそうな場所は直していきましょうヽ(・ω・*)
とりあえず音が鳴るよっていうくらいのメモととらえてください。

サウンドマン

いきなりどうでもいいことですが
ファイル名をsoundmanとしてます。
これはサウンドマンじゃなくてサウンドマネージャーの略なのですが
サウンドマンと呼んでます。(ほんとにどうでもいいね!)

まずはスクリプトから

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //Toggleで必要
using UnityEngine.Audio; //Audio系で必要

public class soundman : MonoBehaviour {

    private AudioSource bgm_as; //bgmプレイヤーの場所
    private AudioSource se_as; //seプレイヤーの場所
    public static string bgm; //音楽を変更したい場合の名前を保存する場所
    public static string se;

    public AudioMixer mixer; //ミキサーの場所
    public Slider bgms; //bgmのスライダーの場所
    public Slider ses; //seのスライダーの場所
    public Toggle tog; //音オンオフのトグルの場所

    private List<msta> musics = new List<msta>(); //いろいろやった結果、Listに情報をまとめることにしました

    public AudioClip bgm_0; //音楽
    public AudioClip bgm_1; //bgmを増やす場合、bgm_2 bgm_3……と増やしていけばいい

    public AudioClip se_0; //SE
    public AudioClip se_1; //seも同様


    void Awake () {
        musics.Add(new msta("bgm_main",bgm_0)); //音楽を格納する場所 増やす場合これを増やしていく
//      musics.Add(new msta("名前",bgm_1)); //名前はなんでも。soundman.bgm="名前"で呼び出せるようになります
        musics.Add(new msta("se_buy",se_0)); //seも同じく
        musics.Add(new msta("se_gold",se_1));

        AudioSource[] audiosources = GetComponents<AudioSource> (); //プレイヤーを二つ作る
        bgm_as = audiosources [0]; //0番はbgmのプレイヤー
        se_as = audiosources [1]; //1番はseのプレイヤー
        bgm_as.enabled = false; //一旦音をオフ
        se_as.enabled = false;

    }

    void Start () {
        StartCoroutine (opbgm ()); //最初に音が出ちゃうのを防止するため0.5秒待機してからオーディオをオン
    }

    private IEnumerator opbgm(){ //その格納された場所
        yield return new WaitForSeconds (0.3f);
        if(bgms != null){ //bgmスライダーを使うなら(この行があればアタッチしてなくてもエラーにならない)
            bgms.value = PlayerPrefs.GetFloat ("sbgm",-80); //セーブされたbgm情報がなければ-80、あればそれを代入
            mixer.SetFloat("bgm", bgms.value); //その音量に変更 この"bgm"というのがMixerで設定した名前
        }
        if(ses != null){
            ses.value = PlayerPrefs.GetFloat ("sse",-80);
            mixer.SetFloat("se", ses.value);
        }
        bgm = musics[0].mname; //最初から流れる曲
        yield return new WaitForSeconds (0.2f);
        bgm_as.enabled = true; //ディレイをかけてオンにすることで暴発を防ぐ
        se_as.enabled = true;
    }

    void Update () {
        if(bgm != null){ //外からbgm命令を受けたら
            foreach (var ms in musics) { //listに入れたデータを全部参照
                if(ms.mname == bgm){ //一致するものを見つけ
                    bgm_as.clip = ms.mclip; //それをクリップに入れる(音を鳴らす)
                    bgm = null; //bgm命令を初期化
                }
            }
        }
        if (bgm_as.enabled) {
            if (bgm_as.clip == !bgm_as.isPlaying) { //もしbgmが終わってもまたプレイ(ループ再生)
                bgm_as.Play ();
            }
        }
        if(se != null){ //外からse命令を受けたら
            foreach (var ms in musics) { //listに入れたデータを全部参照
                if(ms.mname == se){ //一致するものを見つけ
                    if (se_as.enabled) { //seオフ時に命令を受けてオン状態に変えるとその瞬間暴発するのでそれを阻止
                        se_as.PlayOneShot (ms.mclip); //1度だけseを鳴らす
                    }
                    se = null; //se命令を初期化
                }
            }
        }

        if(tog != null){ //音オンオフのトグルを使うなら
            if(!tog.isOn){ //TargetGraphicのみの画像状態
                bgm_as.enabled = false;
                se_as.enabled = false;
            }else{ //TargetGraphicとGraphicの画像が重なって表示される状態
                bgm_as.enabled = true;
                se_as.enabled = true;
            }
        }
    }

    public void Changebgm(){
        mixer.SetFloat("bgm", bgms.value); //スライダーを動かしたらその音量に変更
        PlayerPrefs.SetFloat("sbgm", bgms.value); //すぐさまセーブ
    }
    public void Changese(){
        mixer.SetFloat("se", ses.value);
        PlayerPrefs.SetFloat("sse", ses.value);
    }

    public void seon(){ //seのつまみを動かして、タップを離したら音がなる設定
        foreach (var ms in musics) {
            if(ms.mclip == se_0){ //0に設定した音が鳴ります
                se = ms.mname;
            }
        }
    }

}

public class msta { //list情報のフォーマットを設定
    public string mname;
    public AudioClip mclip;
    public msta (string m_name, AudioClip m_clip){
        mname = m_name;
        mclip = m_clip;
    }
}

このスクリプトを作ると
スクリプトのインスペクタはこんな感じになります。

スクリーンショット 2018-12-05 15.57.26.png

もう埋まってますが、これを全部説明していきます。

下準備

スクリーンショット 2018-12-05 15.59.01.png

AudioMixerを作りましょう。
Project欄のCreateからAudioMixerを選ぶと出来上がりです。

bgmとseの素材を入れておきましょう。(各自持参で)

サウンドのオンオフ画像を入れましょう。
サウンドのオンはオフの上に重ねるだけなので、透明が描けるpngが都合いいです。
 ※下のは自分で描きました。使いたい方はご自由に落としてください

speakeroff.png
speakeron.png

AudioMixerの設定

NewAudioMixerをダブルクリックすると開くので
Groupsの「+」を押して
グループを二つマスター内に入れておきます。
スクリーンショット 2018-12-05 16.58.52.png

bgmとseのインスペクタで
AttenuationのVolumeの位置で右クリックするとこんなのが出てくるので
一番上のExpose'Volume(of bgm)'to scriptをクリック。
seも忘れずに。

スクリーンショット 2018-12-05 16.07.02.png

Exposed Parameters(2)というのをクリックして名前を変更。
「MyExposedParam」になっているので
bgmの方を「bgm」に。seの方を「se」にします。
※この名前をスクリプトで使うので必ずこの名前で!

スクリーンショット 2018-12-05 17.01.48.png

画面設定

スクリーンショット 2018-12-05 16.12.39.png

こんな感じにするとこんな画面になります。
※スピーカートグルがでかいのは見やすさだけのためです

スクリーンショット 2018-12-05 16.12.47.png

Toggle

スクリーンショット 2018-12-05 16.14.23.png

「Target Graphic」にBackgroundを。
「Graphic」にBackground(1)を入れます。
このBackgroundにはImageにスピーカー画像を入れて、
Background(1)にはImageに音波マークの画像を入れます。

「Target Graphic」がオフ状態。
オンの状態になると
「Target Graphic」の上に「Graphic」が乗っかるので
もし全く違う画像を使いたい時は別の手法が必要かも。
こんな感じのスピーカーマークだとこの設定で十分使えます。

ちなみにToggleとBackgroundとBackground(1)のWidthとHeightは3つとも同じにしてください。
何か意味がない限りはAnchorも全部中央がいいと思います。
それぞれが違うと位置のズレが出ます。

SliderとSlider(1)

ほぼ同じものです。違うところはあとで説明します。

スクリーンショット 2018-12-05 16.19.06.png

ほとんど初期値のままですが、
「Min Value」を-80に、
「Max Value」を0にします。
 ※-80が音量0%で0が音量100%らしいです。
  20で音量1000%だそうですが具体的にはよく知りません。

ちなみにスライダーについて

FillとかHandleとかBackgroundとかついてますが、
以下のようになっています。

スクリーンショット 2018-12-05 16.22.47.png

メーターだけならFillだけでいいので他をデリートしても問題ありません。
あと、どういうわけか位置を調整してくれてるので
left right top bottom全部0にしておいた方がいいかと思います。
じゃないとパラメーター0のはずがちょっとメーターが残ったりします。

あとHandleについて

Handleとはパラメーターをグィィンと右左にドラッグするぽっちですが
ちっこいのでクリック、ましてやタップがしにくいです。
なので……

スクリーンショット 2018-12-05 16.30.26.png

Handleの中にこんな感じのHandle(1)を作っちゃいます。
Handleは横幅20のサイズなんですが、
このHandle(1)は50x50のサイズになっています。
でっかいぽっちができちゃいそうですが、
これのColorのアルファ値をゼロにしてるので
このでっかいぽっちは透明なのです。
ただし、Raycast Targetはオンになってるのでクリックはできるわけです。
つまりクリックポイントがでかくなる!!
便利なので是非。

sound

soundというオブジェクトはただのGameObjectです。
ここにAdd ComponentでAudio>AudioSourceとやって
AudioSourceを入れます。
そしてもう一度それをやってAudioSourceを2個にします。
※BGM(音楽)のチャンネルとSE(効果音)のチャンネル

さらにこのオブジェクトにsoundmanをアタッチします。

AudioSource

スクリーンショット 2018-12-05 16.40.14.png

Outputというところに1番目のAudioSourceにはbgmを。
2番目のAudioSourceにはseを入れます。
 ※右にある○みたいなのを押すと簡単に選択できます。

再びSliderとSlider(1)

スクリーンショット 2018-12-05 16.43.57.png

On Value Changed(Single)というところに設定を入れます。
右下の「+」を押して
Runtime Onlyの下にある○ボタンをおしてsoundのオブジェクトを入れます。
bgmのスライダーは右側の選択項目からsoundman.Changebgmを選びます。
seのスライダーは右側の選択項目からsoundman.Changeseを選びます。

そしてseのスライダーにはAdd Componentから
Event>Event Triggerを選択してこの項目を出します。
Add New Event Typeを押すと色々出てくるので
Pointer Upを選びます。(クリックやタップを離した時命令)
同じように「+」でsoundを入れて
右の項目はSoundman.seonを入れます。

チェック

スクリーンショット 2018-12-05 15.57.26.png

あとはこの通りにアタッチされていればとりあえず動くはずです。

スピーカーマークをクリックすると音のオンオフになるはずです。

スライダーを動かすとbgmの方だと音楽が大きくなったり小さくなったり
seの方だと、クリックやタップを離した時にseがなって音量を確かめられるはずです。
しかもすぐにセーブされてるので次回アプリを起動した時にはその音量のまま!

ちなみに、ただ音を鳴らしたいだけならToggleやSliderはなくてもいいです。
その場合最大音量(100%)で最初からbgmが流れるだけです。
同じようにToggleだけとかSliderだけでもいいです。
Slider最小にすれば音オフと一緒だしね!

あとは音を呼び出すだけ

呼び出し方は

soundman.bgm = "bgm_main";
soundman.se = "se_buy";

といった感じです。
どのスクリプトからでも呼び出せます。(別のシーンからでも)
seはupdate内で呼び出すと連打されるので1回呼ぶ命令でお願いします。

音楽や効果音を追加したい場合は

    public AudioClip bgm_1; //bgmを増やす場合、bgm_2 bgm_3……と増やしていけばいい

    void Awake () {
        musics.Add(new msta("bgm_main",bgm_0)); //音楽を格納する場所 増やす場合これを増やしていく
//      musics.Add(new msta("名前",bgm_1)); //名前はなんでも。soundman.bgm="名前"で呼び出せるようになります
        musics.Add(new msta("se_buy",se_0)); //seも同じく
        musics.Add(new msta("se_gold",se_1));

この二つを一緒に追加していきます。
 ※public AudioClip bgm_1;と
  musics.Add(new msta("",bgm_1));はセットで!

この""で囲まれている部分が呼び出す名前です。

ふぅー

長くなりましたがこんな感じで音設定をしてました。
みなさまはどんな音設定をされてるでしょうか?
もっといい方法や改善余地があればコメントいただければ!

そして、今まで音をあまり使ってなかった方も
この記事で使えるようになれたら幸いです。

音を出したかったらサウンドマンを呼ぼう!
ではまた!ヽ(・ω・*)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0