Unityメモ – アンドロイドにある音楽を再生する方法

Posted: 2016年3月23日 カテゴリー: プログラミングメモ, Unity, Unity メモ
タグ:, , , ,

ゲームを作るに当たって音ゲーやAudiosurfみたいに自分の持っている音楽を再生出来る機能を付けたい時があります。今回はアンドロイド上でそれを行う方法を紹介します。

 

ファイルを読み込む方法としましては、ファイルへのパスを指定し、WWWクラスを使って読み込みます。

 

さっそく読み込み機能を実装してみます。まず、WWWクラスのインスタンスを作ります。

    const string _FILE_HEADER = "file://";

    private IEnumerator LoadSound(string path)
    {
        // ファイルが無かったら終わる
        if (!System.IO.File.Exists(path))
        {
            Debug.Log("File does NOT exist!! file path = " + path);
            yield break;
        }

        // 指定したファイルをロードする
        WWW request = new WWW(_FILE_HEADER + path);

 

メソッドに渡しているパスはファイルへのフルパス(フォルダの位置や拡張子込み)です。まずそれを使ってファイルが存在しているかの確認を行っています。ある場合はそれをWWWクラスへ渡してインスタンスを生成しています。

 

次に読み込み待ちを挟みます

 

        // ロードが終わるまで待つ
        while (!request.isDone)
        {
            yield return new WaitForEndOfFrame();
        }

 

説明はしてませんでしたが、このメソッドはコアルーチンにしています。そうした理由としてはここでやっている様な読み込待ちを入れやすくする為です。

 

次に読み込みが終わったWWWからAudioClipを取り出します。

 

        // 読み込んだファイルからAudioClipを取り出す
        AudioClip audioTrack = request.GetAudioClip(false, true);

 

取り出した後は、念の為にAudioClipが読み込み中かの確認を行い、読み込み中の場合は待つようにします。また、読み込みに失敗したら処理を終了します。

 

        while (audioTrack.loadState == AudioDataLoadState.Loading)
        {
            // ロードが終わるまで待つ
            yield return new WaitForEndOfFrame();
        }

        if (audioTrack.loadState != AudioDataLoadState.Loaded)
        {
            // 読み込み失敗
            Debug.Log("Failed to Load!");
            yield break;
        }

 

読み込みは成功しているはずなので、ここで再生用にAudioSourceのコンポーネントを追加します。追加したらそのコンポーネントに上記で読み込んだAudioClipを設定します。

        // AudioSourceを生成し、gameobjectに追加する
        AudioSource source = gameObject.AddComponent<AudioSource>();
        
        // 生成したsourceに読み込んだAudioClicpを設定する
        source.clip = audioTrack;

 

これで準備が整いましたので、後はそのまま再生します。

        // 読み込んだファイルを再生する
        source.Play();

        yield return 0;
    }

 

これで終了です。あとはこのメソッドをStartCoroutine()で呼び出してください。

使用例の音楽プレイヤーモドキです:

以上になります。今回紹介した方法はWindowsとかでも多分流用出来ると思いますが、今の所アンドロイドでのみ動作確認を取っています(メンドクサイ)。
え、そもそもパスを獲得するのが面倒?そんな時の為のアセットストアですよ!世の中お金で解決出来るんですよきっと(適当)。

 

最後の今回紹介したメソッドを貼っておきます:

    private IEnumerator LoadSound(string path)
    {
        // ファイルが無かったら終わる
        if (!System.IO.File.Exists(path))
        {
            Debug.Log("File does NOT exist!! file path = " + path);
            yield break;
        }

        // 指定したファイルをロードする
        WWW request = new WWW(_FILE_HEADER + path);

        // ロードが終わるまで待つ
        while (!request.isDone)
        {
            yield return new WaitForEndOfFrame();
        }

        // 読み込んだファイルからAudioClipを取り出す
        AudioClip audioTrack = request.GetAudioClip(false, true);
        while (audioTrack.loadState == AudioDataLoadState.Loading)
        {
            // ロードが終わるまで待つ
            yield return new WaitForEndOfFrame();
        }

        if (audioTrack.loadState != AudioDataLoadState.Loaded)
        {
            // 読み込み失敗
            Debug.Log("Failed to Load!");
            yield break;
        }

        // AudioSourceを生成し、gameobjectに追加する
        AudioSource source = gameObject.AddComponent<AudioSource>();
        
        // 生成したsourceに読み込んだAudioClicpを設定する
        source.clip = audioTrack;

        // 読み込んだファイルを再生する
        source.Play();

        yield return 0;
    }

 

コメント
  1. […] Unityメモ – アンドロイドにある音楽を再生する方法 […]

  2. […] 以前紹介したローカル上から音楽ファイルを読み込んで再生する方法と組み合わせる事で実装出来ます。 […]

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中