UE5.4でランタイム中にリピートトラックの関数情報を読み取る方法はありますでしょうか?

お世話になっております。​

現在、シーケンサーのイベントトラックに関する実装で課題に直面しており、解決策についてご教示いただきたくご連絡いたしました。

[実現したいこと]

シーケンサーのリピートトラックに、引数を持つカスタムイベント(仮に “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);
    }
}

つきましては、クック後のランタイム環境において、イベントトラックに設定した特定のカスタムイベントを識別し、その開始フレームやペイロード情報を取得するための適切な方法がございましたら、ご教示いただけますと幸いです。

お忙しいところ大変恐縮ですが、ご助力いただけますと幸いです。 何卒よろしくお願い申し上げます。

お世話になっております。

残念ながら、エンジンを改善せず、こういった機能がないと思います。

目的のことを、もっとコンテキストをもっといただけますか?もしかしたら別の方法で同じ結果を出せるかもしれません。

お手数ですが、よろしくお願いします。

お世話になっております。

確認しました。シーケンサー担当チームとも検討した結果、現在取られている「クック前に解析して外部データに書き出す」方式が現状で最も安定した実装方法です。ランタイムで直接イベント関数情報を安全に取得する手段はエンジン内には用意されていません。

このままのアプローチで問題ありません。もし今後、関連して新しい課題や制約に直面されましたら、ぜひ再度こちらに投稿してください。

お手数ですが、よろしくお願いします。

お世話になっております。 ご返信いただき、誠にありがとうございます。

また、シーケンサー担当チームの皆様へもご確認いただいたとのこと、重ねて御礼申し上げます。 貴重なお時間を割いて詳細に調査いただき、大変感謝しております。

現状、私たちが採用している「クック前にシーケンスを解析し、外部データへ書き出す」というアプローチが、エンジンが想定する最も安定した実装方法である旨、承知いたしました。明確なご回答をいただき、非常に助かりました。

今後、本件に関連して新たな課題に直面した際には、ご案内に沿って、改めてご相談させていただきたく存じます。

この度は、ご尽力いただき誠にありがとうございました。 今後とも何卒よろしくお願い申し上げます。

ご返信いただき、誠にありがとうございます。

また、エンジン仕様に関するご確認、感謝いたします。

ご質問いただいた目的のコンテキストについて、ご説明させていただきます。

[目的]

私たちが実現したいのは、「ランタイムにおいて、レベルシーケンス内で特定のイベント(C++関数)が呼び出されるフレーム数を、別の処理から動的に取得すること」です。

例えば、「'PlayEffect’という名前のイベントがシーケンサーの150フレーム目に設定されている」という情報を、外部のC++の処理から参照したい、といった状況が考えられます。 これにより、イベントが実行されるタイミングを事前に把握し、関連する他の処理の準備や制御を行うことが可能になります。

[現状の代替策]

現状では、代替策として以下の方法をとっております。

クック前にEditorOnly関数を実行し、対象となる全てのシーケンスアセットを解析します。

そして、特定のイベントが設定されているフレーム数の情報を抽出し、データテーブルなどの外部データとしてあらかじめ書き出しています。

ランタイムでは、この書き出されたデータを読み込むことで、目的のフレーム数を参照しています。

つきましては、上記のような背景を踏まえ、何か別の方法――例えばイベント名が直接取得できなくとも、何らかの固定のIDやキーを用いてランタイムでイベントセクションを特定し、その開始フレームを取得するような代替アプローチがございましたら、改めてご教示いただけますと幸いです。 お忙しいところ大変恐縮ですが、ご確認のほど、よろしくお願い申し上げます。