FMovieSceneEventSectionDataを継承したクラスでAddOrUpdateKey_Raw()を実装するとコンパイルエラーになる

表題のとおりなのですが、FMovieSceneEventSectionDataを継承したクラスでAddOrUpdateKey_Raw()を実装すると以下のコンパイルエラーになります。​

  • ‘SetDefault’: ‘FMyMovieSceneEventSectionData’ のメンバーではありません
  • ‘CurveValueType’: ‘FMyMovieSceneEventSectionData’ のメンバーではありません

継承したクラスに

> typedef FEventPayload CurveValueType;

> void SetDefault(const FEventPayload& InDefaultValue)

を実装することで回避可能ですが、​FMovieSceneEventSectionDataに実装されているべきもののように思えます。

以下の​

  • GetKeyTypeName()
  • CurveValueType
  • SetDefault()
  • GetDefault()
  • ​Evaluate()
  • DefaultValue

の5つを実装することでビルドエラーは出なくなったのですが、FMovieSceneEventSectionDataへの実装忘れでないかご確認をお願いいたします。

※ 追記:GetKeyTypeName()はClipboardTypes.h​に実装されていたのでインクルード忘れでした

コンパイルエラーを修正したコードを添付しておきます。​

再現手順

  • 空のC++プロジェクトを作成します
  • Build.csにSequencer,MovieScene,MovieSceneTracksのモジュールを追加します
    • PrivateDependencyModuleNames.AddRange(new string { “Sequencer”, “MovieScene”, “MovieSceneTracks”, “MovieSceneTools” });
  • ヘッダに​以下のコードを貼り付けます

`#include “ISequencer.h”
include “Sections/MovieSceneEventSection.h”
include “SequencerChannelInterface.h”

USTRUCT()
struct FMyMovieSceneEventSectionData : public FMovieSceneEventSectionData
{
GENERATED_BODY()
};

struct FEventSectionSequencerChannelInterface : TSequencerChannelInterface
{
virtual FKeyHandle AddOrUpdateKey_Raw(FMovieSceneChannel* InChannel, UMovieSceneSection* SectionToKey, const void* ExtendedEditorData, FFrameNumber InTime, ISequencer& Sequencer, const FGuid& ObjectBindingID, FTrackInstancePropertyBindings* PropertyBindings) const override
{
return TSequencerChannelInterface::AddOrUpdateKey_Raw(InChannel, SectionToKey, ExtendedEditorData, InTime, Sequencer, ObjectBindingID, PropertyBindings);
}
};`* ​以下のビルドエラーが出ます​
+ ‘SetDefault’: ‘FMyMovieSceneEventSectionData’ のメンバーではありません
+ ‘CurveValueType’: ‘FMyMovieSceneEventSectionData’ のメンバーではありません
+ 構文エラー: 識別子 ‘CurveValueType’
+ ‘CurveValueType’: 定義されていない識別子です。
+ ‘Value’: 定義されていない識別子です。

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

ご質問ありがとうございます。

ご指摘のビルドエラーの件ですが、FMovieSceneEventSectionDataの実装漏れではなく、デフォルト値をサポートしない設計方針によるものです。

FMovieSceneEventSectionData側では、Traits でSupportsDefaults = falseを設定し、Evaluate()の呼び出しをつぶすことで、TSequencerChannelInterfaceとの組み合わせも可能としています。ただし、これらの特殊化は派生構造体に引き継がれないため、派生構造体側に同じ内容の Traits やスタブ関数の準備が必要となります。

`template<>
struct TMovieSceneChannelTraits : TMovieSceneChannelTraitsBase
{
enum { SupportsDefaults = false };
};

/** Stub out unnecessary functions /
inline bool EvaluateChannel(const FMyMovieSceneEventSectionData
InChannel, FFrameTime InTime, FEventPayload& OutValue)
{
// Can’t evaluate event section data in the typical sense
return false;
}

inline bool ValueExistsAtTime(const FMyMovieSceneEventSectionData* InChannel, FFrameNumber Time, const FEventPayload& Value)
{
// true if any value exists
return InChannel->GetData().FindKey(Time) != INDEX_NONE;
}`結果的に、やはり継承構造体側で追加の作業が必要になるため、これを行わなくてよいようなテンプレート設計になっているべきだ、という議論はあると思うのですが、現状ではこのようなご案内となりますことをご理解いただけますと幸いです。

以上、よろしくお願いいたします。

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

> FMovieSceneEventSectionDataの実装漏れではなく、デフォルト値をサポートしない設計方針によるものです。

こちら了解いたしました。

また、SupportsDefaultsのご案内もありがとうございます。こちらを使用する形に変更させていただきます。

ありがとうございました。

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

回答のご確認ありがとうございました。

それでは本件は回答済みとして、Closeさせていただきます。

以上、よろしくお願いいたします。