ホーリーのプログラミング日記

ホーリーのプログラミング日記

エキセントリック・スーパーアプリクリエイター / アプリ総DL数 約180万 / 全然分からない 俺は雰囲気でアプリを作ってる / iOS : apple.co/3m3HxSm / Android : bit.ly/3ma0liZ

超初心者の僕がやってるUnityで音を出す方法

 

実はアプリに音(サウンド)を付けるのが苦手です。とりあえずいい音楽(BGM)だったり、効果音が見つからないんですよね。

使うのは基本的にフリー素材で、そんなにこだわって探してるわけでは、ないんですが、いつも適当なのが見つからずに苦労しています。

ザックリの幅で探してるんですけどね。大体こんな感じでいいやって風に。それでも常に困難を極めますw

 

ちなみに、よく使ってるフリー素材のサイトはこの辺です。

 

BGM

フリーBGM(音楽素材)無料ダウンロード|DOVA-SYNDROME

 

効果音

無料効果音で遊ぼう!

生活[3]|効果音ラボ

トップページ -フリー効果音素材 くらげ工匠

 

これ以外だと魔王魂くらいですかね。まあここ使ったのは一度だけですけど。

(魔王魂に不満があったわけではないですよ。何となく探しにくい感じがして、やや敬遠してるだけです。ここ使ってる人は多いですよね)

 

んで、このサウンドの実装方法ですよ。「Unity BGM 効果音 実装」みたいにググると、結構沢山出てくるんですが、ポンコツプログラマの僕には、どうにも分かりにくい。

んで、いつも適当な感じに実装してるんですが、ちょっとそれを紹介してみようと思います。

 

☆☆☆

 

まず空のオブジェクト、SoundManagerみたいなやつを作ります。これはゲームのスタート画面、最初に起動する画面に1つ作るだけですね。あとはこれをシングルトンて言うのかな?それにして、このオブジェクトがシーンをまたいでも消えないようにしています。

 

実際のコードはこんな感じ。これをSoundManagerにタッチして、あとはそれぞれのシーンで呼び出しています。

フラグを設定して、それを呼び出す関数を作ってるのは、BGMの切り替えのためですね。

 

using UnityEngine;
using System.Collections;

public class SoundManager : MonoBehaviour {

    public GameObject soundManager;

    public AudioClip BGM1;//タイトル画面
    public AudioClip BGM2;//ゲーム画面
    public AudioClip BGM3;//オープニング 
    public AudioClip buttonSE;
    public AudioClip shortButtonSE;
    public AudioClip digSE;
    public AudioClip upSE;
    public AudioClip stopSE;
    public AudioClip justStopSE;
    public AudioClip notStopSE;
    public AudioClip bombSE;
    public AudioClip coinSE;
    public AudioClip drumRollSE;
    public AudioClip rollFinishSE;
    public AudioClip cardYesSE;
    public AudioClip cardNoSE;
    public AudioClip sceneChangeSE;

    private AudioSource audioSource;

    int BGMFlg = 1;

    //シングルトンの処理
    void Awake ()
    {

        DontDestroyOnLoad (soundManager);

        audioSource = gameObject.GetComponent<AudioSource> ();

    }

    public void StartBGM1(){
        audioSource.clip = BGM1;
        audioSource.Play ();
        BGMFlg = 1;
    }

    public void StartBGM2(){
        audioSource.clip = BGM2;
        audioSource.Play ();
        BGMFlg = 2;
    }

    public void StartBGM3(){
        audioSource.clip = BGM3;
        audioSource.Play ();
        BGMFlg = 3;
    }

    public int GetBGMFlg(){
        return BGMFlg;
    }

    public void StopBGM(){
        audioSource.Stop ();
    }

    public void SoundButton(){
        audioSource.PlayOneShot (buttonSE);
    }

    public void SoundShortButton(){
        audioSource.PlayOneShot (shortButtonSE);
    }

    public void SoundDig(){
        audioSource.PlayOneShot (digSE);
    }

    public void SoundUp(){
        audioSource.PlayOneShot (upSE);
    }

    public void SoundStop(){
        audioSource.PlayOneShot (stopSE);
    }

    public void SoundJustStop(){
        audioSource.PlayOneShot (justStopSE);
    }

    public void SoundNotStop(){
        audioSource.PlayOneShot (notStopSE);
    }

    public void SoundBomb(){
        audioSource.PlayOneShot (bombSE);
    }

    public void SoundCoin(){
        audioSource.PlayOneShot (coinSE);
    }

    public void SoundDrumRoll(){
        audioSource.PlayOneShot (drumRollSE);
    }

    public void SoundRollFinish(){
        audioSource.PlayOneShot (rollFinishSE);
    }

    public void SoundCardYes(){
        audioSource.PlayOneShot (cardYesSE);
    }

    public void SoundCardNo(){
        audioSource.PlayOneShot (cardNoSE);
    }

    public void SoundSceneChange(){
        audioSource.PlayOneShot (sceneChangeSE);
    }

}

 

シングルトンの処理、なんてコメントがありますけど、これ最初どこからか持ってきたんですよ。元になるコードを。その名残ですね。

元のコードは僕には難解だったので、もう跡形もなくなるくらいイジりましたw

 

DontDestroyOnLoadっていうのが、画面遷移してもオブジェクトがなくならないようにする処理ですね。

これ宣言するとなくならなくていいんですが、テストのときに困ります。いちいち、そのオブジェクトがないってエラーが出るんで。

(例えばタイトル画面にサウンドマネージャーをセットしてるときは、タイトル画面からビルドするのはいいんですが、他の画面からビルドすると、サウンドマネージャーが見つからないぞって言われます)

 

まあまあ、僕がUnityで音を出すときは、現状こんな感じにしています。

ボリュームの調整とかは出来ませんよ。そういう難しいことは、他のサイトを参考にしてくださいw

 

以上、超初心者の僕がやってるUnityで音を出す方法って話でした。

 

【追記 2017.05.05】

シングルトンを覚えたので、もうちょっと安全に実装出来るようになりました。

Unityでシングルトンなオブジェクトを作ってみた - ホーリーのプログラミング日記

 

上記のコードだと、シングルトンを使わないと、多重再生される可能性があるみたいなんですよね。この記事の最後のコメントによると。

シーンを遷移してもBGMを継続して再生する方法 - Qiita

 

なので、こんな風にコードを変えてみました。

 

using UnityEngine;
using System.Collections;

public class SoundManager : MonoBehaviour {

//    public GameObject soundManager;
    static public SoundManager instance;

    public AudioClip BGM1;//タイトル画面
    public AudioClip BGM2;//ゲーム画面
    public AudioClip BGM3;//オープニング 
    public AudioClip buttonSE;
    public AudioClip shortButtonSE;
    public AudioClip digSE;
    public AudioClip upSE;
    public AudioClip stopSE;
    public AudioClip justStopSE;
    public AudioClip notStopSE;
    public AudioClip bombSE;
    public AudioClip coinSE;
    public AudioClip drumRollSE;
    public AudioClip rollFinishSE;
    public AudioClip cardYesSE;
    public AudioClip cardNoSE;
    public AudioClip sceneChangeSE;

    private AudioSource audioSource;

    int BGMFlg = 1;

    //シングルトンの処理
    void Awake ()
    {

        if (instance == null) {

            instance = this;
            DontDestroyOnLoad (gameObject);
        }
        else {

            Destroy (gameObject);
        }

//        DontDestroyOnLoad (soundManager);

        audioSource = gameObject.GetComponent<AudioSource> ();

    }

    public void StartBGM1(){
        audioSource.clip = BGM1;
        audioSource.Play ();
        BGMFlg = 1;
    }

    public void StartBGM2(){
        audioSource.clip = BGM2;
        audioSource.Play ();
        BGMFlg = 2;
    }

    public void StartBGM3(){
        audioSource.clip = BGM3;
        audioSource.Play ();
        BGMFlg = 3;
    }

    public int GetBGMFlg(){
        return BGMFlg;
    }

    public void StopBGM(){
        audioSource.Stop ();
    }

    public void SoundButton(){
        audioSource.PlayOneShot (buttonSE);
    }

    public void SoundShortButton(){
        audioSource.PlayOneShot (shortButtonSE);
    }

    public void SoundDig(){
        audioSource.PlayOneShot (digSE);
    }

    public void SoundUp(){
        audioSource.PlayOneShot (upSE);
    }

    public void SoundStop(){
        audioSource.PlayOneShot (stopSE);
    }

    public void SoundJustStop(){
        audioSource.PlayOneShot (justStopSE);
    }

    public void SoundNotStop(){
        audioSource.PlayOneShot (notStopSE);
    }

    public void SoundBomb(){
        audioSource.PlayOneShot (bombSE);
    }

    public void SoundCoin(){
        audioSource.PlayOneShot (coinSE);
    }

    public void SoundDrumRoll(){
        audioSource.PlayOneShot (drumRollSE);
    }

    public void SoundRollFinish(){
        audioSource.PlayOneShot (rollFinishSE);
    }

    public void SoundCardYes(){
        audioSource.PlayOneShot (cardYesSE);
    }

    public void SoundCardNo(){
        audioSource.PlayOneShot (cardNoSE);
    }

    public void SoundSceneChange(){
        audioSource.PlayOneShot (sceneChangeSE);
    }

}

 

今のところ感度良好。こっちの方がいいですね。安心感が違うでしょう。