【Unity】音が再生中かどうか判定できるisPlayingとは?

音が再生中かわかるisPlaying Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「Unityで音が再生されているかどうかを判定したい!」

「音が鳴り終わった後に処理を行いたい!」

というお悩みの方に向けた内容となっています。

Unityでは、AudioSourceコンポーネントを使うことで音声を流すことができます。

そして、この音声が鳴り終わったタイミングなどで、ゲーム内で処理を行いたい場合に、isPlayingという変数が便利です。

このisPlayingは、音声が再生されている場合はtrue、音声が停止されている場合はfalseの値を持つbool型の変数です。

そこで、このページでは、Unityで音が再生されているかどうかを判定することができるisPlaying変数について、仕組みや使い方などをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

音が再生されているかどうか判定できるisPlaying変数

まずは、Unityで音が再生中かどうかを判定できるisPlayingがどういった変数なのかについて紹介していきます。

AudioSourceで管理されているbool型の変数

isPlayingとは、音を再生するのに使うAudioSourceコンポーネントで管理されている変数で、bool型の値を持っています。

具体的には、AudioSourceに紐づけた音声データ(AudioClip)の再生中停止中でisPlayingの値が変わるようになっていて、

の値を持つようになっています。

なお、Pauseメソッドで一時停止している場合も、isPlayingの値は「false」となります。

音が鳴り終わった際に処理をすることができる

isPlayingの変数を使うことで、音が鳴り終わったらゲーム内の処理を行うといったことができるようになります。

例えば、レベルアップした際の音楽がまだ再生されているのに、レベルアップ画面がすぐに切り変わって戦闘シーンになってしまっていたりすると変ですよね。

そこで、isPlayingを使うことで、レベルアップの音楽が鳴り終わるまではレベルアップ画面が表示されて、音が終わったら画面を切り替えるといった処理を作ることができます。

他にも、今BGMが再生されているなら、停止させるといった処理なども、isPlayingを使うことで作ることができます。

音が再生されているかどうかを判定する方法

ここからは、実際にUnityでisPlayingを使って、音が再生されているかどうかを判定する方法を紹介していきます。

例として「Audio」というAudioSourceを付けたオブジェクトを作り、ゲームを実行してマウスをクリックすると5秒程度の音が再生されるようにしています。

そして、この音が再生されている間は、ゲーム内に「再生中」という文言が表示され、音が鳴っていないときは「停止中」という文言に切り替わるといった処理をテキストオブジェクトで作っていきます。

なお、音を再生する仕組みについては、以下の記事も参考にしてみてください。

スクリプトからAudioSourceコンポーネントを取得する

まずは、テキストオブジェクトに紐づけたスクリプトの中で、AudioのAudioSourceコンポーネントを取得します。

using UnityEngine;

public class TextReplace : MonoBehaviour
{
    public GameObject audioObj; // 「audio」オブジェクトを取得する変数
    AudioSource audioSource;    //  AudioSourceを取得するための変数

    void Start()
    {
        audioSource = audioObj.GetComponent<AudioSource>(); // AudioSourceを取得
    }
}

5行目でGameObject型の変数「audioObj」を宣言して、この中にAudioオブジェクトをインスペクターウィンドウから入れてあげます。

そして、Startメソッドの中の10行目で、GetComponentメソッドを使ってaudioObjのAudioSourceコンポーネントを取得しておきます。

AudioSourceやGetComponentについては、以下の記事でも詳しく解説していますので、参考にしてみてください。

if文の中でisPlayingの値で条件分岐してテキスト変更の処理を行う

音が再生されているかどうかを判定するisPlayingは、AudioSourceコンポーネントの中で管理されているので、

AudioSource.isPlaying

としてあげることで、値を取得することができます。

今回は、AudioSourceコンポーネントを「audioSource」の変数名で取得していているので、

audioSource.isPlaying

と、スクリプト内で記述して使っていきます。

using TMPro;    // TextMeshProを利用するために必要
using UnityEngine;

public class TextReplace : MonoBehaviour
{
    public GameObject audioObj;
    AudioSource audioSource;
    TextMeshProUGUI textMeshProUGUI;    // TextMeshProを取得するための変数
    bool textCheck = true;  //テキストを変更しているかどうかをチェックする変数

    void Start()
    {
        audioSource = audioObj.GetComponent<AudioSource>();
        textMeshProUGUI = GetComponent<TextMeshProUGUI>();  // TextMeshProを取得
    }

    void Update()
    {
        if (audioSource.isPlaying == true && textCheck == false)  // 再生中の場合
        {
            textMeshProUGUI.text = "再生中";
            textCheck = true;
        }
        else if (audioSource.isPlaying == false && textCheck == true)    // 再生していない場合
        {
            textMeshProUGUI.text = "停止中";
            textCheck = false;
        }
    }
}

テキストの表示は、TextMeshProコンポーネントを使っているので、TextMeshProをStartメソッド内で取得しています。

音が再生されている場合の処理として、19行目でif文の中でisPlayingが「true」の場合に、文言を「再生中」として代入するように記述しています。

また、音が停止している場合の処理として、24行目でisPlayingが「false」の場合に、文言を「停止中」として代入するように記述しています。

なお、テキスト変更する処理をUpdateメソッド内に記載しているので、何度も処理が行われないように、「textCheck」の変数を作ってテキストが変更されているかどうかも合わせて管理して処理に入れています。

これでゲームを実行してみると、

最初は「停止中」という文言が表示されていますが、マウスをクリックして音が再生されると「再生中」という表示に変わり、音が鳴り終わると「停止中」という文言に戻るようにできました。

なお、今回はSpringin’ Sound Stockさんの音源を使わせていただいております。

今回は変更している処理が文言だけですが、シーン遷移やオブジェクトの移動などもisPlayingを使うことで、同じように音声に合わせて処理を行うことができるようになります。

まとめ

このページでは、Unityで音を再生しているかどうかを判定するisPlayingについて、仕組みや使い方をまとめていきましたが、いかがでしたでしょうか?

isPlayingは、音が再生されているかどうかをbool型で判定しているAudioSource内の変数です。

このisPlayingを使うことで、現在その音声が再生されているのかどうか、また音声が鳴り終わったのかどうかを判定することができます。

if文と組み合わせて使うことで、音声の鳴り終わりのタイミングでゲーム内の処理を行うといったことができるようになります。

最後までお読みいただきまして、ありがとうございました!

コメント