모션 재생 종료 콜백(Java)

업데이트: 2023/01/26

개요

Cubism SDK for Java에서는 모션 재생 종료 시에 콜백에 의한 이벤트 취득을 수행할 수 있습니다. 
샘플에서는 콜백 함수로 재생 종료를 통지하는 로그 텍스트를 출력하고 있습니다.

콜백 구현

이번에는 모션의 재생 종료 시에 콜백에 의한 처리를 실시하기 위해, 모션을 관리하는 추상 클래스인
Framework/src/motion/ACubismMotion에서 콜백을 처리할 수 있도록 구현했습니다.

public class ACubismMotion{
    ...
    // モーション再生終了コールバックの登録
    public void setFinishedMotionHandler(IFinishedMotionCallback onFinishedMotionHandler) {
        onFinishedMotion = onFinishedMotionHandler;
    }

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

    // モーション再生終了時に呼び出されるコールバック関数を入れる変数
    protected IFinishedMotionCallback onFinishedMotion;
}
/**
* 모션 재생 종료 콜백으로 사용할 인터페이스
**/
public interface IFinishedMotionCallback {
    public void execute(ACubismMotion motion);
}

Cubism SDK for Java에서는 콜백용으로 정의된 인터페이스를 implements한 오브젝트를 사용해 콜백의 구조를 재현합니다.

Tips

샘플에서는 이하의 상태라면 콜백을 호출할 수 없으므로 주의해 주세요.

  • 재생 중인 모션이 「루프」로 설정된 경우
  • 콜백에 null이 등록되었을 때

콜백 함수 이용

콜백 함수로 실제로 처리하고 싶은 내용을 구현합니다.

샘플에서는 모션 재생 종료를 통지하는 로그 텍스트를 LAppPal.printLog 메소드를 사용해 출력하도록 구현했습니다.
모션 재생 종료 시의 처리를 변경하고 싶은 경우는 하기 함수의 구현을 변경해 주세요.

private static class FinishedMotion implements IFinishedMotionCallback {
    @Override
    public void execute(ACubismMotion motion) {
        LAppPal.printLog("Motion Finished: " + motion);
    }
}

또한 콜백 메소드의 등록은 모션 데이터를 읽어들이는 Framework층의 CubismUserMotion.loadMotion 메소드 사용 시에 모션의 생성과 동시에 콜백 메소드를 전달하고 있습니다.
이미 모션이 있을 때는 「콜백 구현」에서 소개한 setFinishedMotionHandler()를 사용하고 있습니다.

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에 콜백 함수를 전달할 수 있도록 구현을 실시했습니다.

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;
}

구현의 발전에 대해서

샘플에서는 모션의 재생 종료만 구현되었지만, 이러한 구현을 발전시킴으로써 모션의 재생 종료 후에 콜백 함수로 비동기 처리 등을 이용할 수 있게 되거나
콜백을 적용하고자 하는 실제 처리에서 함수를 역방향 DNS 조회함으로써 모션 재생 종료 이외의 부분에도 콜백의 구현이 가능해집니다.

이 기사가 도움이 되었나요?
아니요
이 기사에 관한 의견 및 요청사항을 보내 주시기 바랍니다.