모션 재생 종료 콜백(Native)

업데이트: 2020/01/30

개요

Cubism SDK for Native에서는 모션 재생이 끝날 때 콜백으로 이벤트를 가져올 수 있습니다.

샘플에서는 콜백 함수로 재생 종료를 통지하는 로그 텍스트를 출력하고 있습니다.

콜백 구현

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

class ACubismMotion
{
public:
    // 모션 재생 종료 콜백 함수 정의
    typedef void (*FinishedMotionCallback)(ACubismMotion* self);
    ・
    ・
    ・
    // 모션 재생 종료 콜백 등록
    void SetFinishedMotionHandler(FinishedMotionCallback onFinishedMotionHandler);

    // 모션 재생 종료 콜백 취득
    FinishedMotionCallback GetFinishedMotionHandler();
    ・
    ・
    ・

private:
    // 모션 재생이 끝날 때 호출되는 콜백 함수를 포함하는 변수
    FinishedMotionCallback _onFinishedMotion;
};
Tips

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

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

콜백 함수 이용

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

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

void FinishedMotion(ACubismMotion* self)
{
   LAppPal::PrintLog("Motion Finished: %x", self);
}

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

CubismMotionQueueEntryHandle LAppModel::StartMotion(const csmChar* group, csmInt32 no, csmInt32 priority, ACubismMotion::FinishedMotionCallback onFinishedMotionHandler)
{
    ・
    ・
    ・
    if (motion == NULL)
    {
        csmString path = fileName;
        path = _modelHomeDir + path;

        csmByte* buffer;
        csmSizeInt size;
        buffer = CreateBuffer(path.GetRawString(), &size);
        // 모션 데이터를 읽음과 동시에 콜백 함수를 전달하여 등록합니다
        motion = static_cast<CubismMotion*>(LoadMotion(buffer, size, NULL, onFinishedMotionHandler));
        ・
        ・
        ・
    }
    else
    {
        motion->SetFinishedMotionHandler(onFinishedMotionHandler);
    }
}

샘플에서는 탭 이벤트를 취득하는 OnTap() 실행 시에 호출되는 StartRandomMotion()으로 콜백 함수를 전달하고 있습니다.

또한 실제로 모션을 재생하고 있는 것은 CubismMotion::DoUpdateParameters()이므로, CubismMotion에 콜백 함수를 전달할 수 있도록 구현했습니다.

CubismMotion* CubismMotion::Create(const csmByte* buffer, csmSizeInt size, FinishedMotionCallback onFinishedMotionHandler)
{
    CubismMotion* ret = CSM_NEW CubismMotion();

    ret->Parse(buffer, size);
    ret->_sourceFrameRate = ret->_motionData->Fps;
    ret->_loopDurationSeconds = ret->_motionData->Duration;
    // 콜백 함수 등록
    ret->_onFinishedMotion = onFinishedMotionHandler;
}

구현의 발전에 대해서

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

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