オーディオプレイヤー
このセクションでは、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
がメモリーに残る可能性があることに注意してください。