モーション再生終了のコールバック(Java)

最終更新: 2023年1月26日

概要

Cubism SDK for Java では、モーションの再生終了時にコールバックによるイベントの取得がおこなえます。
サンプルでは、コールバック関数で再生終了を通知するログテキストを出力しています。

コールバックの実装

今回はモーションの再生終了時にコールバックによる処理をおこなうため、モーションを管理する抽象クラスである
Framework/src/motion/ACubismMotion でコールバックを扱えるように実装をおこなっています。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public class ACubismMotion{
...
// モーション再生終了コールバックの登録
public void setFinishedMotionHandler(IFinishedMotionCallback onFinishedMotionHandler) {
onFinishedMotion = onFinishedMotionHandler;
}
// モーション再生終了コールバックの取得
public IFinishedMotionCallback getFinishedMotionCallback() {
return onFinishedMotion;
}
// モーション再生終了時に呼び出されるコールバック関数を入れる変数
protected IFinishedMotionCallback onFinishedMotion;
}
public class ACubismMotion{ ... // モーション再生終了コールバックの登録 public void setFinishedMotionHandler(IFinishedMotionCallback onFinishedMotionHandler) { onFinishedMotion = onFinishedMotionHandler; } // モーション再生終了コールバックの取得 public IFinishedMotionCallback getFinishedMotionCallback() { return onFinishedMotion; } // モーション再生終了時に呼び出されるコールバック関数を入れる変数 protected IFinishedMotionCallback onFinishedMotion; }
public class ACubismMotion{
    ...
    // モーション再生終了コールバックの登録
    public void setFinishedMotionHandler(IFinishedMotionCallback onFinishedMotionHandler) {
        onFinishedMotion = onFinishedMotionHandler;
    }

    // モーション再生終了コールバックの取得
    public IFinishedMotionCallback getFinishedMotionCallback() {
        return onFinishedMotion;
    }

    // モーション再生終了時に呼び出されるコールバック関数を入れる変数
    protected IFinishedMotionCallback onFinishedMotion;
}
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/**
* モーション再生終了コールバックとして使用するインターフェース
**/
public interface IFinishedMotionCallback {
public void execute(ACubismMotion motion);
}
/** * モーション再生終了コールバックとして使用するインターフェース **/ public interface IFinishedMotionCallback { public void execute(ACubismMotion motion); }
/**
* モーション再生終了コールバックとして使用するインターフェース
**/
public interface IFinishedMotionCallback {
    public void execute(ACubismMotion motion);
}

Cubism SDK for Javaではコールバック用として定義されたインターフェースをimplementsしたオブジェクトを使用してコールバックの仕組みを再現します。

Tips

サンプルでは、以下の状態だとコールバックが呼び出せませんのでご注意ください。

  • 再生中のモーションが「ループ」として設定されているとき
  • コールバックにnullが登録されているとき

コールバック関数の利用

コールバック関数で実際に処理させたい内容を実装します。

サンプルでは、モーション再生終了を通知するログテキストを LAppPal.printLogメソッドを使用して出力するように実装しています。
モーション再生終了時の処理を変更したい場合は、下記関数の実装を変更してください。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
private static class FinishedMotion implements IFinishedMotionCallback {
@Override
public void execute(ACubismMotion motion) {
LAppPal.printLog("Motion Finished: " + motion);
}
}
private static class FinishedMotion implements IFinishedMotionCallback { @Override public void execute(ACubismMotion motion) { LAppPal.printLog("Motion Finished: " + motion); } }
private static class FinishedMotion implements IFinishedMotionCallback {
    @Override
    public void execute(ACubismMotion motion) {
        LAppPal.printLog("Motion Finished: " + motion);
    }
}

また、コールバックメソッドの登録はモーションデータを読み込むFramework層のCubismUserMotion.loadMotionメソッド 使用時にモーションの生成と同時にコールバックメソッドを渡しています。
既にモーションがある際は「コールバックの実装」で紹介したsetFinishedMotionHandler() を使用しております。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public int startMotion(
final String group,
int number,
int priority,
IFinishedMotionCallback onFinishedMotionHandler
) {
.
.
.
if (motion == null) {
String fileName = modelSetting.getMotionFileName(group, number);
if (!fileName.equals("")) {
String path = modelHomeDirectory + fileName;
byte[] buffer = LAppPal.loadFileAsBytes(path);
// モーションデータを読み込むのと同時にコールバック関数オブジェクトを渡して登録する
motion = loadMotion(buffer, onFinishedMotionHandler);
.
.
.
}
} else {
motion.setFinishedMotionHandler(onFinishedMotionHandler);
}
}
public int startMotion( final String group, int number, int priority, IFinishedMotionCallback onFinishedMotionHandler ) { . . . if (motion == null) { String fileName = modelSetting.getMotionFileName(group, number); if (!fileName.equals("")) { String path = modelHomeDirectory + fileName; byte[] buffer = LAppPal.loadFileAsBytes(path); // モーションデータを読み込むのと同時にコールバック関数オブジェクトを渡して登録する motion = loadMotion(buffer, onFinishedMotionHandler); . . . } } else { motion.setFinishedMotionHandler(onFinishedMotionHandler); } }
public int startMotion(
    final String group,
    int number,
    int priority,
    IFinishedMotionCallback onFinishedMotionHandler
) {
    .
    .
    .
    if (motion == null) {
        String fileName = modelSetting.getMotionFileName(group, number);
        if (!fileName.equals("")) {
            String path = modelHomeDirectory + fileName;
            byte[] buffer = LAppPal.loadFileAsBytes(path);

            // モーションデータを読み込むのと同時にコールバック関数オブジェクトを渡して登録する
            motion = loadMotion(buffer, onFinishedMotionHandler);
            .
            .
            .
        }
    } else {
        motion.setFinishedMotionHandler(onFinishedMotionHandler);
    }
}

サンプルでは、タップイベントを取得する onTap() 実行時に呼び出されるstartRandomMotion() からコールバック関数を渡しています。
また、実際にモーションを再生しているのは CubismMotion.doUpdateParameters()となるので、CubismMotion にコールバック関数を渡せるように実装をおこなっています。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public static CubismMotion create(byte[] buffer, IFinishedMotionCallback callback) {
CubismMotion result = new CubismMotion();
result.parse(buffer);
result.sourceFrameRate = result.motionData.fps;
result.loopDurationSeconds = result.motionData.duration;
// コールバック関数の登録
result.onFinishedMotion = callback;
return result;
}
public static CubismMotion create(byte[] buffer, IFinishedMotionCallback callback) { CubismMotion result = new CubismMotion(); result.parse(buffer); result.sourceFrameRate = result.motionData.fps; result.loopDurationSeconds = result.motionData.duration; // コールバック関数の登録 result.onFinishedMotion = callback; return result; }
public static CubismMotion create(byte[] buffer, IFinishedMotionCallback callback) {
    CubismMotion result = new CubismMotion();
    result.parse(buffer);

    result.sourceFrameRate = result.motionData.fps;
    result.loopDurationSeconds = result.motionData.duration;

    // コールバック関数の登録
    result.onFinishedMotion = callback;

    return result;
}

実装の発展について

サンプルではモーションの再生終了のみの実装ですが、これらの実装を発展させることにより、モーションの再生終了後にコールバック関数で非同期処理などが利用できるようになったり、
コールバックを適用したい実際の処理から関数を逆引きすることによって、モーション再生終了以外の箇所にもコールバックの実装が可能になります。

この記事はお役に立ちましたか?
はいいいえ
この記事に関するご意見・
ご要望をお聞かせください。