[unity]AudioSource が再生中か確認する(ポーズ対応)

isPlaying を確認すればいいんじゃ? と思ったんですがひと癖あったので対処法を調べてみました。

曲を Pause しても isPlaying = false になってしまう

所作としては正しいのですが、これのお陰でポーズも含めて曲が再生中かどうかを知る事はできません。
別の方法を考えることにします。

time で代用する

曲の再生中なら、再生時間(time)が 0 より大きいんじゃないの? ということで、こんな風に条件分岐を書き換えます。

if (audioSource.time > 0) { // 再生中 }

しかしこれだと、Play() 実行後、曲再生前のヘッダ解析タイミング(環境にもよるが 0.1 ~ 0.2 秒程度)では time == 0 となり、再生されているか確認することはできません。

isPlaying と time の合わせ技

if (audioSource.isPlaying == true || audioSource.time > 0) { // 再生中 }

お互いのいいとこどりをしよう、というこの記述方法ですが、この場合 Play() 直後に Pause() をかけると確認不可能です。
そんな使い方(Play 直後の Pause)をしない! というのであればこれでも構いませんが、完全に網羅したとは言い難いところが難点。

Play() と Stop() をラッピングし、自分で再生中フラグを管理

AudioSource に頼らない、こんな方法もあります。
以下のコードは最低限なので、実際はもっと処理を書き加える必要があるでしょう。

using UnityEngine;

public class Sample : MonoBehaviour
{
    [SerializeField]
    AudioSource source;

    public bool isPlaying = false;

    public void Play()
    {
        isPlaying = true;
        source.Play();
    }

    public void Stop()
    {
        isPlaying = false;
        source.Stop();
    }
}

まとめ

ポーズ自体あまり使わないと思うので、ちょっとニッチな情報ですが、ググるとちょっと困っている人もいるようなので記事にしてみました。
VideoPlayer だと isPaused があるので困らないんですが、なぜ AudioSource にないのかは疑問。

ともあれ、参考になれば幸いです。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA