03. モーションの優先度

概要

ここではモーションの優先度の設定と使い方について説明します。
モーションの再生に関してはライブラリのMotionQueueManagerだけ使うことにしても問題ありません。
その場合は、あるモーション再生中に別のモーションを再生するかどうかという判断を独自に実装することになります。

サンプルではL2DMotionManagerクラスを使用しています。
ライブラリのMotionQueueManagerを継承しているため基本的な使い方は同じです。
このクラスはMotionQueueManagerにモーションの優先度の概念を付け加えたものになります。

標準仕様の優先度設定

 * モーションを再生していない状態は優先度0。
 * アイドリングモーション中は優先度1。
 * その他のモーション再生中は優先度2。
 * 優先度を無視して強制で再生したい場合は優先度3。

使い方

優先度は以下のルールを簡単に適用するために使っています。
 * 現在モーションを再生していない(優先度0)ならば、アイドリングモーション(優先度1)などを再生する。
 * タップ時などにモーションを再生(優先度2)するとき、現在の優先度がそれ未満なら再生開始する。
 * 再生中のモーションの他に、モーションの予約にも優先度を設定できる。
    これによりデータを別スレッドなどで読み込む場合でも、要請のあったモーションを再生するべきか判別できる。

アイドリングモーション開始のサンプル
//待機モーション判定
if( mainMotionManager->isFinished() ){
//モーションの再生がない場合、待機モーションの中からランダムで再生する
mainMotionManager->startMotion( motions[ randomNo ] , L2DMotionManager.PRIORITY_IDLE );
}

タップ時などのモーション再生のサンプル
if( mainMotionManager->getCurrentPriority() >= priority ){
//再生中のモーションがあるので再生しません
return;
}

mainMotionManager->startMotion(motion,priority);//再生開始

モーションの予約のサンプル
ファイルを別スレッドで読み込むときなど時間差が発生するときは予約の優先度を設定してください。
if( mainMotionManager->getReservePriority() >= priority)
{
//再生予約があるので再生しません(別スレッドで準備している)
return;
}
if( mainMotionManager->getCurrentPriority() >= priority ){
//再生中のモーションがあるので再生しません
return;
}
mainMotionManager->setReservePriority(priority);//モーション再生が非同期の場合は優先度を先に設定して予約しておく

//ファイルを読み込み
load();


...

//ファイルが読み込み完了したあとで再生。この間の再生要求は無視する。
mainMotionManager->startMotion(motion,priority);


Comments