メインコンテンツまでスキップ

オーディオプレイヤー

このセクションでは、MMDランタイムにオーディオプレイヤーコンポーネントを追加して音楽を再生する方法について説明します。

IPlayerインターフェース

MMDランタイムは、デフォルトでEngine.getDeltaTime()メソッドを使用してアニメーションを更新します。

しかし、オーディオを再生する際は、MMDランタイムの再生速度がオーディオ再生速度と同期していなければなりません。これは、オーディオオブジェクトが一種のタイマーとして機能するためです。

babylon-mmdは、(オーディオ)プレイヤーが実装しなければならないメソッドをIPlayerインターフェースを通じて定義しています。これらのメソッドをすべて実装することで、プレイヤーはMMDランタイムの同期ターゲットとして使用できます。

以下は、IPlayerインターフェースを実装するStreamAudioPlayerクラスをMmdRuntimeに設定する例です:

const audioPlayer = new StreamAudioPlayer();
mmdRuntime.setAudioPlayer(audioPlayer);

オーディオ同期メソッド

オーディオプレイヤーが設定されると、MMDランタイムは非常に複雑なロジックを使用してアニメーションを更新します。

厳密に言うと、オーディオプレイヤーを使用する場合でも、MMDランタイムはデフォルトでEngine.getDeltaTime()メソッドを使用してアニメーションを更新します。ただし、オーディオプレイヤーの再生位置がアニメーション再生位置と同期していない場合、アニメーション再生位置がオーディオプレイヤーの再生位置に合わせて調整されます。

つまり、オーディオプレイヤーが設定されると、MMDランタイムはアニメーションの再生位置を調整してオーディオプレイヤーの再生位置に合わせますが、オーディオプレイヤーをメインタイマーとして使用しません

さらに、アニメーションがオーディオよりも長い場合、オーディオが停止した後でもアニメーションは最後まで再生を続ける必要があります。したがって、オーディオ自体がMMDランタイムの再生のメインタイマーになることはできません

StreamAudioPlayer

babylon-mmdは、IPlayerインターフェースを実装するStreamAudioPlayerクラスを提供します。

このクラスは内部的にHTMLAudioElementを使用してオーディオを再生します。

使用方法の例は以下の通りです:

const audioPlayer = new StreamAudioPlayer(scene);
audioPlayer.source = "path/to/audio/file.mp3";
mmdRuntime.setAudioPlayer(audioPlayer);

StreamAudioPlayerクラスは、作成時にSceneオブジェクトを引数として取ります。これは、HTMLAudioElementのライフタイムをSceneオブジェクトにバインドするためです。

警告

StreamAudioPlayerクラスのコンストラクタの第1引数としてnullを指定すると、dispose()メソッドが呼び出されるまでHTMLAudioElementメモリーに残る可能性があることに注意してください。