5丁目らへんのさよねん家

UnityとBlender初心者です。つまづいたこととか日常とか雑談とかいろいろ。

Unityつまづき Audio再生ができない3

いよっしゃあああ

BGM再生の件、解決しました!!
できたら簡単じゃった…

前回、Update関数でAudioSource.Play()で実行すると、再生ボタン連打状態になって音楽が再生されぬ、ってなことを言ったわけですが

かんたんでした。
「音楽再生」ではなく、「音楽が流れてなかったら再生させる」ってな条件を一つ足してあげればよかったわけです。

以下AudioManagerのコードです

using UnityEngine;
using System.Collections;

public class AudioManager : MonoBehaviour {

    public AudioClip bgmP; //プレイ中のBGM
    public AudioClip bgmT; //タイムアップのときのBGM
    AudioSource audioSourceP; //プレイ中のAudioSource
    AudioSource audioSourceT; //タイムアップのときのAudioSource
    GameController gamecontroller; //GameContorollerコンポーネント

    // Use this for initialization
    void Start()
    {
        //AudioSourceを作成
        audioSourceP = gameObject.AddComponent<AudioSource>();
        audioSourceT = gameObject.AddComponent<AudioSource>();
        //AudioSourceにそれぞれ音楽クリップを登録
        audioSourceP.clip = bgmP;
        audioSourceT.clip = bgmT;

        //GameContorollerコンポーネント取得
        gamecontroller = GameObject.Find("GameController").GetComponent<GameController>();

        if (gamecontroller.state == GameController.GameState.PLAYING)
        {
            // プレイ中の音楽を流す
            audioSourceP.Play();
            audioSourceT.Stop();
        }
        if (gamecontroller.state == GameController.GameState.TIMEUP)
        {
            // タイムアップ中の音楽を流す
            audioSourceP.Stop();
            audioSourceT.Play();
        }
        
    }

    void Update()
    {
        if (gamecontroller.state == GameController.GameState.TIMEUP)
        {
            if (audioSourceT.isPlaying == false)
            { //BGMが再生されてなかったら
                // プレイ中の音楽を流す
                audioSourceP.Stop();
                audioSourceT.Play();
            }
        }
    }
}

前半のAudioSourceの生成とかわたぶんもっとシンプルにできますね…。
public宣言して選択するようにすればいいわけですから。

とりあえず、AudioSouce.isPlayingで再生かどうかを判断しています。
思った通りにながれました…

ちなみにこの状態だとループ状態で流れるのでご注意を。

あーよかった…

追記

タイムアップ時にBGMがなるようになったものの、ループ再生されるので
BGMtというbool変数を用いてBGMが1回しか再生しないように修正しました。

void Update()
    {
        if (gamecontroller.state == GameController.GameState.TIMEUP)
        {
            if ( audioSourceT.isPlaying == false && BGMt == false)
            { //一回も再生されてない上にBGMが再生されてない
                // タイムアップの音楽を流す
                audioSourceP.Stop();
                audioSourceT.Play();
                BGMt = true; //1回でも再生されたらBGMtをtrueに
            }
        }
    }