お世話になっております。
現在、シーケンサーのイベントトラックに関する実装で課題に直面しており、解決策についてご教示いただきたくご連絡いたしました。
[実現したいこと]
シーケンサーのリピートトラックに、引数を持つカスタムイベント(仮に “hogeSequencer” とします)を設定し、特定のC++関数を呼び出しています。 このシーケンスを再生するとは別のクラスの処理において、「特定のイベント(“hogeSequencer”)が、シーケンス上のどのフレームから開始されるか」という情報を取得したいと考えております。
[現状と課題]
イベントトラックを走査し、セクション情報からイベント関数名を取得することで、目的のイベントを特定しようと試みました。しかし、ランタイム環境で
FMovieSceneEvent::Ptrs.Function->GetName()
を用いて取得できる関数名は、“SequenceEvent__ENTRYPOINT○○” のような内部的なものとなり、設定したカスタムイベント名やC++関数名を直接取得することができませんでした。
このため、どのセクションが目的のイベントに対応するのかを判別できず、開始フレームの情報を取得できない状況です。 なお、
PayloadVariables
はEditorOnlyであり、クック後のアプリケーションでは使用できないと認識しております。
[試行中のコード]
// 現在試行している、イベントトラックから開始フレームを取得する処理
TArray<UMovieSceneEventTrack*> event_tracks;
if (auto const& movie_scene = _movie_scene_sequence->GetMovieScene())
{
for (auto const& track : movie_scene->GetTracks())
{
if (track)
{
if (auto&& event_track = Cast<UMovieSceneEventTrack>(track))
{
event_tracks.Emplace(event_track);
}
}
}
}
_start_disable_skip_frames.Reset();
for (auto event_track : event_tracks)
{
if (!event_track) { continue; }
for (auto* section : event_track->GetAllSections())
{
auto* repeater = Cast<UMovieSceneEventRepeaterSection>(section);
if (!repeater) { continue; }
const FMovieSceneEvent& payload = repeater->Event;
const UFunction* func = payload.Ptrs.Function;
if (!func) { continue; }
// このfunc_nameが "SequenceEvent__ENTRYPOINT..." となり、イベントの特定ができない
const FString func_name = func->GetName();
if (!func_name.Contains(TEXT("hoge"))) { continue; }
// セクション範囲の下限フレームを開始点とみなす
const TRange<FFrameNumber> range = repeater->GetRange();
if (!range.HasLowerBound()) { continue; }
const int start_frame = range.GetLowerBoundValue().Value;
_start_disable_skip_frames.Emplace(start_frame);
}
}
つきましては、クック後のランタイム環境において、イベントトラックに設定した特定のカスタムイベントを識別し、その開始フレームやペイロード情報を取得するための適切な方法がございましたら、ご教示いただけますと幸いです。
お忙しいところ大変恐縮ですが、ご助力いただけますと幸いです。 何卒よろしくお願い申し上げます。