모션 재생 시작 및 재생 종료 콜백(Native)
업데이트: 2024/12/19
개요
Cubism SDK for Native에서는 모션의 재생 시작과 재생 종료 시에 콜백으로 이벤트를 취득할 수 있게 되었습니다.
샘플에서는 콜백 함수로 재생 시작과 재생 종료를 알리는 로그 텍스트를 출력하고 있습니다.
콜백 구현
이번에는 모션 재생 시작 시와 재생 종료 시에 콜백에 의한 처리를 실시하기 위해, 모션을 관리하는 추상 클래스인
Framework/src/Motion/ACubismMotion에서 콜백을 처리할 수 있도록 구현했습니다.
class ACubismMotion { public: // 모션 재생 시작 콜백 함수 정의 typedef void (*BeganMotionCallback)(ACubismMotion* self); // 모션 재생 종료 콜백 함수 정의 typedef void (*FinishedMotionCallback)(ACubismMotion* self); ・ ・ ・ // 모션 재생 시작 콜백 등록 void SetBeganMotionHandler(BeganMotionCallback onBeganMotionHandler); // 모션 재생 종료 콜백 등록 void SetFinishedMotionHandler(FinishedMotionCallback onFinishedMotionHandler); // 모션 재생 시작 콜백 취득 BeganMotionCallback GetBeganMotionHandler() const; // 모션 재생 종료 콜백 취득 FinishedMotionCallback GetFinishedMotionHandler(); ・ ・ ・ private: // 모션 재생 시작 시 호출되는 콜백 함수를 포함하는 변수 BeganMotionCallback _onBeganMotion; // 모션 재생이 끝날 때 호출되는 콜백 함수를 포함하는 변수 FinishedMotionCallback _onFinishedMotion; };
Tips
샘플에서는 이하의 상태라면 콜백을 호출할 수 없으므로 주의해 주세요.
- 재생 중인 모션이 「루프」로 설정된 경우
- 콜백에 NULL이 등록되었을 때
콜백 함수 이용
콜백 함수로 실제로 처리하고 싶은 내용을 구현합니다.
샘플에서는 모션 재생 시작과 재생 종료를 알리는 로그 텍스트를 LAppPal::PrintLog()를 사용해 출력하도록 구현했습니다.
모션 재생 시작 시와 재생 종료 시의 처리를 변경하고 싶은 경우 아래 함수의 구현을 변경해 주세요.
void BeganMotion(ACubismMotion* self) { LAppPal::PrintLog("Motion Began: %x", self); } void FinishedMotion(ACubismMotion* self) { LAppPal::PrintLog("Motion Finished: %x", self); }
또한 콜백 함수의 등록은 모션 데이터를 읽어들이는 Framework층의 CubismUserMotion::LoadMotion() 사용 시에 모션의 생성과 동시에 콜백 함수를 전달하고 있습니다.
이미 모션이 있을 때는 「콜백 구현」에서 소개한 SetBeganMotionHandler() 및 SetFinishedMotionHandler()를 사용하고 있습니다.
CubismMotionQueueEntryHandle LAppModel::StartMotion(const csmChar* group, csmInt32 no, csmInt32 priority, ACubismMotion::FinishedMotionCallback onFinishedMotionHandler, ACubismMotion::BeganMotionCallback onBeganMotionHandler) { ・ ・ ・ 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, onBeganMotionHandler)); ・ ・ ・ } else { motion->SetBeganMotionHandler(onBeganMotionHandler); motion->SetFinishedMotionHandler(onFinishedMotionHandler); } }
샘플에서는 탭 이벤트를 취득하는 OnTap() 실행 시에 호출되는 StartRandomMotion()으로 콜백 함수를 전달하고 있습니다.
또한 실제로 모션을 재생하는 것은 CubismMotion::DoUpdateParameters()이므로, CubismMotion에 콜백 함수를 전달할 수 있도록 구현을 실시했습니다.
CubismMotion* CubismMotion::Create(const csmByte* buffer, csmSizeInt size, FinishedMotionCallback onFinishedMotionHandler, BeganMotionCallback onBeganMotionHandler) { CubismMotion* ret = CSM_NEW CubismMotion(); ret->Parse(buffer, size); ret->_sourceFrameRate = ret->_motionData->Fps; ret->_loopDurationSeconds = ret->_motionData->Duration; // 콜백 함수 등록 ret->_onFinishedMotion = onFinishedMotionHandler; ret->_onBeganMotion = onBeganMotionHandler; }
구현의 발전에 대해서
샘플에서는 모션의 재생 시작과 재생 종료만 구현되었지만, 이러한 구현을 발전시킴으로써 모션의 재생 시작과 재생 종료 후에 콜백 함수로 비동기 처리 등을 이용할 수 있게 되거나
콜백을 적용하고자 하는 실제 처리에서 함수를 역방향 DNS 조회함으로써 모션 재생 시작과 종료 이외의 부분에도 콜백의 구현이 가능해집니다.